久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4739|回復: 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, 下載次數: 216)


分享到:  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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久婷婷香蕉 | 颜色网站在线观看 | 国产一二三区精品视频 | 日韩在线综合网 | 国产精品国产三级国产aⅴ原创 | 久久久久久91 | 一区二区三区久久久 | 免费观看一级黄色录像 | 亚洲欧美自拍偷拍视频 | 91精品国产综合久久精品 | 一区二区国产精品 | 国产精品一区二区av | 欧美日韩成人影院 | 国产日韩精品视频 | 国产日韩一区二区 | 国产在线观 | 国产一区二区在线免费播放 | 国产成人福利在线观看 | 欧美日韩视频在线第一区 | 精品久久久久一区二区国产 | 一级a性色生活片久久毛片 一级特黄a大片 | 久久99久久98精品免观看软件 | 久草视频在线播放 | 国产不卡一 | www.青娱乐| 亚洲福利在线视频 | 亚洲美乳中文字幕 | 国产乱码一区 | 密室大逃脱第六季大神版在线观看 | 亚洲一二三区在线观看 | 国产日韩一区二区三区 | 欧美1级| 国产不卡一区在线观看 | 久在线| 午夜男人免费视频 | 国产精品特级毛片一区二区三区 | 欧美视频区| 91五月天| 亚洲美女视频 | 日韩精品成人 | 紧缚调教一区二区三区视频 |