Atmega16 单片机串口通信与外部中断介绍
脑发送一数据给单片机后,单片机马上又把该数据发送给电脑。请仔细体会,然后做后面的练习题。
//ICC-AVR application builder : 2007-5-11 ÏÂÎç 09:56:04
// Target : M16
// Crystal: 11.059Mhz
#include
#include
unsignedintData="0";
voidport_init(void)
{
PORTA = 0x00;
DDRA= 0xFF;
PORTB = 0xFF;
DDRB= 0x00;
PORTC = 0xFF;//m103 output only
DDRC= 0x00;
PORTD = 0xFF;
DDRD= 0x00;
}
//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
voiduart0_init(void)
{
UCSRB = 0x00;//disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86;
UBRRL = 0x47;//set baud rate lo
UBRRH = 0x00;//set baud rate hi
UCSRB = 0x98;
}
#pragma interrupt_handler uart0_rx_isr:12
voiduart0_rx_isr(void)//接收模块
{
Data = UDR;//从电脑接受数据
//uart has received a character in UDR
UDR = Data;//将该数据发送给电脑,这样做的目的是为了调试
具体使用根据实际要求编写, 如果不要发送给电脑就删除此句
}
#pragma interrupt_handler int0_isr:2
voidint0_isr(void)
{
PORTA = 0x01;//中断0的函数体,在此写入INT0触发后要做的事
//external interupt on INT0
}
#pragma interrupt_handler int1_isr:3
voidint1_isr(void)
{
PORTA = 0x02;//中断1的函数体,在此写入INT1触发后要做的事
//external interupt on INT1
}
#pragma interrupt_handler int2_isr:19
voidint2_isr(void)
{
PORTA = 0x04;//中断2的函数体,在此写入INT2触发后要做的事
//external interupt on INT2
}
//call this routine to initialise all peripherals
voidinit_devices(void)
{
//stop errant interrupts until set up
CLI();//disable all interrupts
port_init();
uart0_init();
MCUCR = 0x08;
MCUCSR = 0x40;//INT2(这句要人工输入)
GICR= 0xE0;
TIMSK = 0x00;//timer interrupt sources
SEI();//re-enable interrupts
//all peripherals are now initialised
}
voidUSART_Transmit(unsignedchardata )//发送模块,该程序没用到
{
/* Wait for empty transmit buffer */
while( !( UCSRA & (1
UDR = data;
}
voidmain()
{
init_devices();
while(1)
{
;
}
}
Atmega16单片机串口通信外部中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
