以下摘自艺芯的AVR GCC 编程 v1.1 查询方式: /* MCU:AT90S2313 时钟:4MHz */ #include <avr/io.h> #define uchar unsigned char #define uint unsigned int //uart 发送一字节数据 void putc(uchar c) { loop_until_bit_is_set(UCR,UDRE); UDR=c; } //uart 等待并接收一字节数据 uchar getc(void) { loop_until_bit_is_set(UCR,RXC); return UDR; } int main(void) { //uart 初始化 UCR=(1<<RXEN)|(1<<TXEN); UBRR=25; //baud=9600 UBRR=CK/(baud*16) -1 while(1) { putc(getc()); } } 程序从UART 等待接收一字节,接收到数据后立即将数据又从UART 发送回去。 中断方式: /* MCU:AT90S2313 时钟:4MHz */ 芯 艺 作 品 27 #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define uchar unsigned char #define uint unsigned int uchar g_bTxdPos=0; //发送定位计数器 uchar g_bTxdLen=0; //等待发送字节数 uchar g_bRxdPos=0; //接收定位计数器 uchar g_bRxdLen=0; //等待接收字节数 uchar g_aSendBuf[16]; //发送数据绶冲区 uchar g_aRecvBuf[16]; //接收数据缓冲区 //接收中断 SIGNAL(SIG_UART_RECV) { uchar c=UDR; if(g_bRxdLen>0) { g_aRecvBuf[g_bRxdPos++]=c; g_bRxdLen--; } } //发送中断 SIGNAL (SIG_UART_TRANS) { if(--g_bTxdLen>0) UDR=g_aSendBuf[++g_bTxdPos]; } //是否接收完成 uchar IsRecvComplete(void) { return g_bRxdLen==0; } //从发送缓冲区发送指定长度数据 void SendToUart(uchar size) { g_bTxdPos=0; g_bTxdLen=size; 芯 艺 作 品 28 UDR=g_aSendBuf[0]; while(g_bTxdLen>0); } //接收指定长度数据到接收缓冲区 void RecvFromUart(uchar size,uchar bwait) { g_bRxdPos=0; g_bRxdLen=size; if(bwait) while(g_bRxdLen>0); } int main( void ) { uchar i; //uart 初始化 //接收使能、发送使能、接收中断允许、发送中断允许 UCR=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); UBRR=25; // baud=9600 UBRR=CK/(baud*16) -1 sei();//总中断允许 while(1) { //异步接收16 字节数据 RecvFromUart(16,0); //等待接收完成 while(!IsRecvComplete()); //将接收到的数据复制到发送缓冲区 for(i=0;i<16;i++) g_aSendBuf=g_aRecvBuf; //发送回接收到的数据 SendToUart(16); } } 利用中断可实现数据的异步发送和接收,正如上面程序所示,调用RecvFromUart 后主 程序可处理其它任务,在执行其它任务时可调用IsRecvComplete 检测是否接收完成。
我的问题是通常我们用查询还是中断方式啊,他们有什么区别呢,中断方式程序很多我看不懂吗,麻烦大家指教一下 比如 uchar g_bTxdPos=0; //发送定位计数器 uchar g_bTxdLen=0; //等待发送字节数 uchar g_bRxdPos=0; //接收定位计数器 uchar g_bRxdLen=0; //等待接收字节数 uchar g_aSendBuf[16]; //发送数据绶冲区 uchar g_aRecvBuf[16]; //接收数据缓冲区 这些命名是已经定义的还是自己定义的 为何uchar g_bTxdPos=0; 就是//发送定位计数器呢? 能不能告诉我看什么东西才能理解中断的程序啊 就是说中断程序里这些函数我都不知道在那里有,代表什么含义,如果看头文件,应该怎么看,在哪个目录下啊?
|