查询方式:串口查询方式
中断完整方式:串口中断完整方式
简明版:串口中断程序简明版
自己太撮了,网上找到的中断例程都看着挺混乱,自己写一个简单明了的吧。
这里程序只是为了验证一下串口中断,实用的程序参见。
大概步骤就是:
1、关闭中断;
2、初始化;
3、打开中断;
另外,将中断服务程序与相应的中断向量对应起来。
稍微有点不太一样的是发送中断。一般,可以通过向寄存器写数直接发送。这里,用中断发送有两个好处:省时间、容易操作。当发送数据时,打开发送寄存器空中断;发送完成,关闭该中断。
/******************************************/
/* http://truemans.inf */
/* RS232通讯框架 */
/* 作者:HB */
/* 2010年8月5日 */
/* 目标MCU:MEGA8 晶振:内部晶振 8MHZ */
/******************************************/
#include <iom8v.h>
#include <macros.h>#define FOSC 8000000 //晶振8MHZ
#define BAUDRATE 19200 //波特率unsigned char dataout,datain;
/* 字符输出函数 */
void _putchar(unsigned char c)
{
while (!(UCSRA&(1<<UDRE)));
UDR=c;
}
/* 字符输入函数 */
unsigned char _getchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}/* 串口初始化 */
void InitUSART()
{
UBRRL=(FOSC/16/(BAUDRATE+1))%256;
UBRRH=(FOSC/16/(BAUDRATE+1))/256;
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);/*RX Complete Interrupt Enable, Receiver Enable and Transmitter Enable*/
}
/* 接收中断 */
#pragma interrupt_handler USART_RX_interrupt:12
void USART_RX_interrupt( void )
{
datain = UDR; /* read the received data */
}/* 发送中断 */
#pragma interrupt_handler USART_TX_interrupt:14
void USART_TX_interrupt( void )
{
UDR = dataout; /* start transmition */
UCSRB &= ~(1<<UDRIE); /* disable UDRE interrupt */
}void main(void)
{
unsigned char temp;
CLI(); //disable all interrupts
InitUSART();
SEI(); //re-enable interrupts
_putchar(‘W’);
_putchar(‘e’);
_putchar(‘l’);
_putchar(‘c’);
_putchar(‘o’);
_putchar(‘m’);
_putchar(‘e’);
_putchar(‘!’);
_putchar(‘\r’); //return
_putchar(‘\n’); //换行
UCSRB |= (1<< UDRE); /* enable UDRE interrupt */
while(1)
{
if(datain)
{
dataout=datain;
datain=0;
UCSRB |= (1<< UDRE); /* enable UDRE interrupt */
}
}
}
1 Comments.