找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3909|回复: 2
打印 上一主题 下一主题
收起左侧

AVR128单片机最小系统串口,外部中断,跑马灯,uCOS-II移植例程源码分享

[复制链接]
跳转到指定楼层
楼主
128例程资料


实验名称:串口通信实验
功能描述:计算机通过串口向开发板发送数据,开发板将数据原样送回。
实验目的:学习串口通信
实验说明:MCU--M128
          内部8M晶振      
连接方式:利用串口线将开发板和计算机相连。

单片机源程序如下:
  1. /************************************************
  2. 文件:sio.c
  3. 用途:结构化串口通信程序
  4. ************************************************/
  5. #include "config.h"

  6. #if USEUART0
  7. siocirqueue RTbuf_UART0;
  8. #endif
  9. #if USEUART1
  10. siocirqueue RTbuf_UART1;
  11. #endif

  12. #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
  13. #define USEUART0  TRUE
  14. #define USEUART1  FALSE
  15. #define iv_USART0_RXC   iv_USART_RXC
  16. #define iv_USART0_TXC   iv_USART_TXC
  17. #define UDR0            UDR
  18. #define UCSR0A    UCSRA
  19. #define UCSR0B    UCSRB
  20. #define UCSR0C          UCSRC
  21. #define UBRR0H          UBRRH
  22. #define UBRR0L          UBRRL
  23. #define RXCIE0          RXCIE
  24. #define TXCIE0          TXCIE
  25. #endif


  26. /*********************************************************************************************************
  27. ** 函数名称: Com_init
  28. ** 功能描述: 初始化串行口
  29. ** 输 入:
  30. ** 全局变量: 无
  31. ** 调用模块: Com_baudrate
  32. ** 说明:
  33. ** 注意:
  34. ********************************************************************************************************/
  35. void Com_init (void) {
  36. //WDR(); //喂狗
  37. //CLI();                     // 关中断
  38. #if USEUART0
  39. Tbuf_init(&RTbuf_UART0);              //初始化接收缓冲
  40. Rbuf_init(&RTbuf_UART0);
  41. UCSR0B = 0x00; //disable while setting baud rate
  42. UCSR0A=0x00;

  43. #if CPU_TYPE <= M32
  44. UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
  45. UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
  46. #else
  47. UCSR0C=0x06;  //8 DATA ,1 STOP, NO PARITY
  48. UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
  49. #endif

  50. #endif


  51. #if USEUART1
  52. Tbuf_init(&RTbuf_B);              //初始化接收缓冲
  53. Rbuf_init(&RTbuf_B);
  54. UCSR1B = 0x00; //disable while setting baud rate
  55. UCSR1A = 0x00;
  56. UCSR1C = 0x06;
  57. UCSR1B = 0xD8;
  58. #endif
  59. Com_baudrate (9600);                 //

  60. //SEI();                     // 开中断
  61. }
  62. /*********************************************************************************************************
  63. ** 函数名称: Com_baudrate
  64. ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
  65. ** 输 入: baudrate指定的波特率
  66. ** 全局变量: 无
  67. ** 调用模块: 无
  68. ** 说明:
  69. ** 注意:
  70. ********************************************************************************************************/
  71. void Com_baudrate (unsigned int baudrate) {
  72. unsigned int tmp;
  73. tmp= F_CPU/baudrate/16-1;
  74. #if USEUART0
  75. UBRR0H=(unsigned char)(tmp>>8);
  76. UBRR0L=(unsigned char)tmp;
  77. #endif
  78. #if USEUART1
  79. UBRR1H=(unsigned char)(tmp>>8);
  80. UBRR1L=(unsigned char)tmp;
  81. #endif
  82. }
  83. /*********************************************************************************************************
  84. ** 函数名称: Com_putchar
  85. ** 功能描述: 从串行口输出一个字符c
  86. ** 输 入: c:输出字符
  87. ** 输出         : 0:失败 1:成功
  88. ** 全局变量: 无
  89. ** 调用模块:
  90. ** 说明:
  91. ** 注意:
  92. ********************************************************************************************************/
  93. unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
  94. //WDR(); //喂狗
  95. if (Tbuf_full(RTbuf))
  96.    return(0);
  97. else{
  98.         Tbuf_putchar(c,RTbuf);                                // 将数据加入到发送缓冲区并开中断
  99.         return(1);
  100.         }
  101. }
  102. /*********************************************************************************************************
  103. ** 函数名称: Com_putstring
  104. ** 功能描述: 从串行口输出一个字符串
  105. ** 输 入: p:指向输出字符串 len:输出长度
  106. ** 输出         :
  107. ** 全局变量: 无
  108. ** 调用模块:
  109. ** 说明:
  110. ** 注意:
  111. ********************************************************************************************************/
  112. void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
  113. unsigned char i;
  114. //WDR(); //喂狗
  115. if (len!=0 ){
  116.         for(i=0;i<len;i++)
  117.         while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
  118.         }
  119.         else {
  120.                 do{
  121.                         while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
  122.                         }while(*p++!='\n');
  123.         }
  124.         
  125. }
  126. /*********************************************************************************************************
  127. ** 函数名称: Com_getchar
  128. ** 功能描述: 从串行口输入一个字符
  129. ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值
  130. **              1 等待数据到来
  131. ** 输出         : 读入的字符
  132. ** 全局变量: 无
  133. ** 调用模块:
  134. ** 说明:
  135. ** 注意:
  136. ********************************************************************************************************/

  137. unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) {
  138. //WDR(); //喂狗
  139. //    Delay(Delay_Comget,MaxLimit_Comget_Delay);
  140. //        if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;
  141. //        if (DelayOvf(Delay_Comget))
  142. //            return 0;    //时间超时
  143. //        else
  144.             
  145.                 while(!Com_R_count(RTbuf));
  146.                 return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
  147. }



  148. void Com_Rbuf_Clear(siocirqueue *RTbuf){
  149.         Rbuf_init(RTbuf);
  150. }



  151. unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
  152. unsigned char i=0;
  153. //WDR(); //喂狗
  154. if (len>0 ){
  155.         for(i=0;i<len;i++){
  156.                 //WDR(); //喂狗
  157.                 *p++=Com_getchar(1,RTbuf);
  158.                 }
  159.         return(len);
  160.         }
  161.         else{
  162.                
  163.                
  164.                 do{
  165.                                 *p++=Com_getchar(1,RTbuf);
  166.                                 i++;
  167.                                 //WDR(); //喂狗
  168.                         }while(*(p-1)!='\n');
  169. //                        *p++=Com_getchar(1,RTbuf);
  170. //                        *(p)=0;
  171.                 return(i);
  172.                 }
  173.         
  174. }


  175. /*********************************************************************************************************
  176. ** 函数名称: Com_R_count
  177. ** 功能描述: 返回接收缓冲区字符个数函数
  178. ** 输 入:
  179. ** 输出         : 字符个数
  180. ** 全局变量: 无
  181. ** 调用模块:
  182. ** 说明:
  183. ** 注意:
  184. ********************************************************************************************************/
  185. unsigned char Com_R_count(siocirqueue *RTbuf){
  186. return RTbuf->R_count;
  187. }
  188. /*********************************************************************************************************
  189. ** 函数名称: Rbuf_init
  190. ** 功能描述: 接收缓冲区初始化
  191. ** 输 入:
  192. ** 输出         :
  193. ** 全局变量: 无
  194. ** 调用模块:
  195. ** 说明:
  196. ** 注意:
  197. ********************************************************************************************************/
  198. void Rbuf_init(siocirqueue *RTbuf){
  199.         RTbuf->R_front=0;
  200.         RTbuf->R_rear=0;
  201.     RTbuf->R_count=0;
  202.         RTbuf->R_overflow=0;
  203. }
  204. /*********************************************************************************************************
  205. ** 函数名称: Tbuf_init
  206. ** 功能描述: 发送缓冲区初始化
  207. ** 输 入:
  208. ** 输出         :
  209. ** 全局变量: 无
  210. ** 调用模块:
  211. ** 说明:
  212. ** 注意:
  213. ********************************************************************************************************/
  214. void Tbuf_init(siocirqueue *RTbuf){
  215.         RTbuf->T_front=0;
  216.         RTbuf->T_rear=0;
  217.     RTbuf->T_count=0;
  218.         RTbuf->T_disabled=1;
  219.         }
  220. /*********************************************************************************************************
  221. ** 函数名称: Rbuf_empty
  222. ** 功能描述: 接收缓冲区判空
  223. ** 输 入:
  224. ** 输出         :  TRUE 空 FALSE 非空
  225. ** 全局变量: 无
  226. ** 调用模块:
  227. ** 说明:
  228. ** 注意:
  229. ********************************************************************************************************/
  230. unsigned char Rbuf_empty(siocirqueue *RTbuf){
  231.         return RTbuf->R_count==0;
  232.         }
  233. /*********************************************************************************************************
  234. ** 函数名称: Tbuf_empty
  235. ** 功能描述: 发送缓冲区判空
  236. ** 输 入:
  237. ** 输出         :  TRUE 空 FALSE 非空
  238. ** 全局变量: 无
  239. ** 调用模块:
  240. ** 说明:
  241. ** 注意:
  242. ********************************************************************************************************
  243. unsigned char Tbuf_empty(void){
  244.         return RTbuf->T_count==0;
  245.         }
  246. /*********************************************************************************************************
  247. ** 函数名称: Rbuf_full
  248. ** 功能描述: 接收缓冲区判满
  249. ** 输 入:
  250. ** 输出         :  TRUE 满 FALSE 非满
  251. ** 全局变量: 无
  252. ** 调用模块:
  253. ** 说明:
  254. ** 注意:
  255. ********************************************************************************************************
  256. unsigned char Rbuf_full (void){
  257.         return RTbuf->R_count==RBUF_SIZE;
  258.         }
  259. /*********************************************************************************************************
  260. ** 函数名称: Tbuf_full
  261. ** 功能描述: 发送缓冲区判满
  262. ** 输 入:
  263. ** 输出         :  TRUE 满 FALSE 非满
  264. ** 全局变量: 无
  265. ** 调用模块:
  266. ** 说明:
  267. ** 注意:
  268. ********************************************************************************************************/
  269. unsigned char Tbuf_full(siocirqueue *RTbuf){
  270.         return RTbuf->T_count==TBUF_SIZE;
  271.         }
  272. /*********************************************************************************************************
  273. ** 函数名称: Rbuf_putchar
  274. ** 功能描述: 把一个字符放入接收缓冲区
  275. ** 输 入:
  276. ** 输出         :  
  277. ** 全局变量: 无
  278. ** 调用模块:
  279. ** 说明:
  280. ** 注意:
  281. ********************************************************************************************************
  282. void  Rbuf_putchar (unsigned char x){
  283.         if(!Rbuf_full()){
  284.                 REV_DIS();
  285.                 RTbuf->R_count++;
  286.                 RTbuf->R_buf[RTbuf->R_rear]=x;
  287.                 RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
  288.                 REV_EN();
  289.         }
  290. }
  291. /*********************************************************************************************************
  292. ** 函数名称: Tbuf_putchar
  293. ** 功能描述: 把一个字符放入发送缓冲区
  294. ** 输 入:
  295. ** 输出         :  
  296. ** 全局变量: 无
  297. ** 调用模块:
  298. ** 说明:
  299. ** 注意:
  300. ********************************************************************************************************/
  301. void Tbuf_putchar(unsigned char x,siocirqueue *RTbuf){
  302.         if(!Tbuf_full(RTbuf)){
  303.                 TXC_DIS();
  304.                 if (RTbuf->T_disabled)
  305.                         {
  306.                         UDR0=x;
  307.                         RTbuf->T_disabled=0;
  308.                         }
  309.                 else
  310.                         {
  311.                         RTbuf->T_count++;
  312.                         RTbuf->T_buf[RTbuf->T_rear]=x;
  313.                         RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
  314.                         }
  315.                 TXC_EN();
  316.         }
  317. }
  318. /*********************************************************************************************************
  319. ** 函数名称: Rbuf_getstring
  320. ** 功能描述: 从接收缓冲区返回当前子串指针
  321. ** 输 入:
  322. ** 输出         :  当前子串指针
  323. ** 全局变量: 无
  324. ** 调用模块:
  325. ** 说明:
  326. ** 注意:
  327. ********************************************************************************************************
  328. unsigned char * Rbuf_getstring(void){
  329.         return (RTbuf->R_buf[RTbuf->R_front]);
  330. }
  331. /*********************************************************************************************************
  332. ** 函数名称: Tbuf_getstring
  333. ** 功能描述: 从发送缓冲区返回当前子串指针
  334. ** 输 入:
  335. ** 输出         :  当前子串指针
  336. ** 全局变量: 无
  337. ** 调用模块:
  338. ** 说明:
  339. ** 注意:
  340. ********************************************************************************************************
  341. unsigned char * Tbuf_getstring(void){
  342.         return (RTbuf->T_buf[RTbuf->T_front]);
  343. }
  344. /*********************************************************************************************************
  345. ** 函数名称: Rbuf_putchar
  346. ** 功能描述: 从接收缓冲区读一个字符
  347. ** 输 入:
  348. ** 输出         :  读字符
  349. ** 全局变量: 无
  350. ** 调用模块:
  351. ** 说明:
  352. ** 注意:
  353. ********************************************************************************************************/
  354. unsigned char Rbuf_getchar(siocirqueue *RTbuf){
  355.         unsigned char Btemp=0;
  356.         if (!Rbuf_empty(RTbuf)){
  357.                 Btemp=RTbuf->R_buf[RTbuf->R_front];
  358.                 REV_DIS();
  359.                 RTbuf->R_count--;
  360.                 RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;
  361.                 REV_EN();
  362.                 }
  363.         return (Btemp);
  364.         
  365. }
  366. /*********************************************************************************************************
  367. ** 函数名称: Tbuf_getchar
  368. ** 功能描述: 从发送缓冲区读一个字符
  369. ** 输 入:
  370. ** 输出         :  读字符
  371. ** 全局变量: 无
  372. ** 调用模块:
  373. ** 说明:
  374. ** 注意:
  375. ********************************************************************************************************
  376. unsigned char Tbuf_getchar(void){
  377.         unsigned char Btemp;
  378.         if (!Tbuf_empty()){
  379.                 Btemp=RTbuf->T_buf[RTbuf->T_front];
  380.                 TXC_DIS();
  381.                 RTbuf->T_count--;
  382.                 RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;
  383.                 TXC_EN();
  384.                 return (Btemp);
  385.         }
  386. }
  387. */

  388. /******************************* 中断处理函数 ***************************
  389. * 功能:完成数据得的接收和发送
  390. ***********************************************************************/
  391. #if USEUART0
  392. #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
  393. void uart0_rx_isr(void)
  394. {
  395. unsigned char status,data;
  396. siocirqueue *RTbuf;
  397. RTbuf=&RTbuf_UART0;
  398. // CLI();
  399. status=UCSR0A;
  400. data=UDR0;
  401. //WDR(); //喂狗
  402. if((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
  403.          {
  404.         if(RTbuf->R_count<RBUF_SIZE){
  405.                 RTbuf->R_count++;
  406.                 RTbuf->R_buf[RTbuf->R_rear]=data;
  407.                 RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
  408.                 }
  409.         else
  410.            {
  411.            RTbuf->R_overflow=1;
  412.            }
  413.         }
  414. //SEI();
  415. }
  416.         
  417. #pragma interrupt_handler uart0_tx_isr: iv_USART0_TXC
  418. void uart0_tx_isr(void)
  419. {
  420. //CLI();
  421. siocirqueue *RTbuf;
  422. //WDR(); //喂狗
  423. RTbuf=&RTbuf_UART0;
  424. if (RTbuf->T_count>0){
  425. ……………………

  426. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
uCOS-II移植\
串口收发\
复件 跑马灯实验2\
外部中断程序\
跑马灯实验1\
跑马灯实验2\
跑马灯实验3\
所有资料51hei提供下载:
例程.rar (332.91 KB, 下载次数: 215)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:396960 发表于 2018-9-20 13:05 | 只看该作者
参考一下,谢谢了
回复

使用道具 举报

板凳
ID:400714 发表于 2018-9-20 20:17 | 只看该作者
xiexie ~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表