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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4652|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

AVR128單片機最小系統(tǒng)串口,外部中斷,跑馬燈,uCOS-II移植例程源碼分享

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:306116 發(fā)表于 2018-4-11 19:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
128例程資料


實驗名稱:串口通信實驗
功能描述:計算機通過串口向開發(fā)板發(fā)送數(shù)據(jù),開發(fā)板將數(shù)據(jù)原樣送回。
實驗?zāi)康模簩W(xué)習(xí)串口通信
實驗說明:MCU--M128
          內(nèi)部8M晶振      
連接方式:利用串口線將開發(fā)板和計算機相連。

單片機源程序如下:
  1. /************************************************
  2. 文件:sio.c
  3. 用途:結(jié)構(gòu)化串口通信程序
  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. ** 函數(shù)名稱: Com_init
  28. ** 功能描述: 初始化串行口
  29. ** 輸 入:
  30. ** 全局變量: 無
  31. ** 調(diào)用模塊: Com_baudrate
  32. ** 說明:
  33. ** 注意:
  34. ********************************************************************************************************/
  35. void Com_init (void) {
  36. //WDR(); //喂狗
  37. //CLI();                     // 關(guān)中斷
  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. ** 函數(shù)名稱: Com_baudrate
  64. ** 功能描述: 利用定時器T1產(chǎn)生由參數(shù)baudrate指定的波特率
  65. ** 輸 入: baudrate指定的波特率
  66. ** 全局變量: 無
  67. ** 調(diào)用模塊: 無
  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. ** 函數(shù)名稱: Com_putchar
  85. ** 功能描述: 從串行口輸出一個字符c
  86. ** 輸 入: c:輸出字符
  87. ** 輸出         : 0:失敗 1:成功
  88. ** 全局變量: 無
  89. ** 調(diào)用模塊:
  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);                                // 將數(shù)據(jù)加入到發(fā)送緩沖區(qū)并開中斷
  99.         return(1);
  100.         }
  101. }
  102. /*********************************************************************************************************
  103. ** 函數(shù)名稱: Com_putstring
  104. ** 功能描述: 從串行口輸出一個字符串
  105. ** 輸 入: p:指向輸出字符串 len:輸出長度
  106. ** 輸出         :
  107. ** 全局變量: 無
  108. ** 調(diào)用模塊:
  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. ** 函數(shù)名稱: Com_getchar
  128. ** 功能描述: 從串行口輸入一個字符
  129. ** 輸 入: mode:0不需等待,在調(diào)用函數(shù)前檢測Com_R_count的值
  130. **              1 等待數(shù)據(jù)到來
  131. ** 輸出         : 讀入的字符
  132. ** 全局變量: 無
  133. ** 調(diào)用模塊:
  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. ** 函數(shù)名稱: Com_R_count
  177. ** 功能描述: 返回接收緩沖區(qū)字符個數(shù)函數(shù)
  178. ** 輸 入:
  179. ** 輸出         : 字符個數(shù)
  180. ** 全局變量: 無
  181. ** 調(diào)用模塊:
  182. ** 說明:
  183. ** 注意:
  184. ********************************************************************************************************/
  185. unsigned char Com_R_count(siocirqueue *RTbuf){
  186. return RTbuf->R_count;
  187. }
  188. /*********************************************************************************************************
  189. ** 函數(shù)名稱: Rbuf_init
  190. ** 功能描述: 接收緩沖區(qū)初始化
  191. ** 輸 入:
  192. ** 輸出         :
  193. ** 全局變量: 無
  194. ** 調(diào)用模塊:
  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. ** 函數(shù)名稱: Tbuf_init
  206. ** 功能描述: 發(fā)送緩沖區(qū)初始化
  207. ** 輸 入:
  208. ** 輸出         :
  209. ** 全局變量: 無
  210. ** 調(diào)用模塊:
  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. ** 函數(shù)名稱: Rbuf_empty
  222. ** 功能描述: 接收緩沖區(qū)判空
  223. ** 輸 入:
  224. ** 輸出         :  TRUE 空 FALSE 非空
  225. ** 全局變量: 無
  226. ** 調(diào)用模塊:
  227. ** 說明:
  228. ** 注意:
  229. ********************************************************************************************************/
  230. unsigned char Rbuf_empty(siocirqueue *RTbuf){
  231.         return RTbuf->R_count==0;
  232.         }
  233. /*********************************************************************************************************
  234. ** 函數(shù)名稱: Tbuf_empty
  235. ** 功能描述: 發(fā)送緩沖區(qū)判空
  236. ** 輸 入:
  237. ** 輸出         :  TRUE 空 FALSE 非空
  238. ** 全局變量: 無
  239. ** 調(diào)用模塊:
  240. ** 說明:
  241. ** 注意:
  242. ********************************************************************************************************
  243. unsigned char Tbuf_empty(void){
  244.         return RTbuf->T_count==0;
  245.         }
  246. /*********************************************************************************************************
  247. ** 函數(shù)名稱: Rbuf_full
  248. ** 功能描述: 接收緩沖區(qū)判滿
  249. ** 輸 入:
  250. ** 輸出         :  TRUE 滿 FALSE 非滿
  251. ** 全局變量: 無
  252. ** 調(diào)用模塊:
  253. ** 說明:
  254. ** 注意:
  255. ********************************************************************************************************
  256. unsigned char Rbuf_full (void){
  257.         return RTbuf->R_count==RBUF_SIZE;
  258.         }
  259. /*********************************************************************************************************
  260. ** 函數(shù)名稱: Tbuf_full
  261. ** 功能描述: 發(fā)送緩沖區(qū)判滿
  262. ** 輸 入:
  263. ** 輸出         :  TRUE 滿 FALSE 非滿
  264. ** 全局變量: 無
  265. ** 調(diào)用模塊:
  266. ** 說明:
  267. ** 注意:
  268. ********************************************************************************************************/
  269. unsigned char Tbuf_full(siocirqueue *RTbuf){
  270.         return RTbuf->T_count==TBUF_SIZE;
  271.         }
  272. /*********************************************************************************************************
  273. ** 函數(shù)名稱: Rbuf_putchar
  274. ** 功能描述: 把一個字符放入接收緩沖區(qū)
  275. ** 輸 入:
  276. ** 輸出         :  
  277. ** 全局變量: 無
  278. ** 調(diào)用模塊:
  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. ** 函數(shù)名稱: Tbuf_putchar
  293. ** 功能描述: 把一個字符放入發(fā)送緩沖區(qū)
  294. ** 輸 入:
  295. ** 輸出         :  
  296. ** 全局變量: 無
  297. ** 調(diào)用模塊:
  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. ** 函數(shù)名稱: Rbuf_getstring
  320. ** 功能描述: 從接收緩沖區(qū)返回當前子串指針
  321. ** 輸 入:
  322. ** 輸出         :  當前子串指針
  323. ** 全局變量: 無
  324. ** 調(diào)用模塊:
  325. ** 說明:
  326. ** 注意:
  327. ********************************************************************************************************
  328. unsigned char * Rbuf_getstring(void){
  329.         return (RTbuf->R_buf[RTbuf->R_front]);
  330. }
  331. /*********************************************************************************************************
  332. ** 函數(shù)名稱: Tbuf_getstring
  333. ** 功能描述: 從發(fā)送緩沖區(qū)返回當前子串指針
  334. ** 輸 入:
  335. ** 輸出         :  當前子串指針
  336. ** 全局變量: 無
  337. ** 調(diào)用模塊:
  338. ** 說明:
  339. ** 注意:
  340. ********************************************************************************************************
  341. unsigned char * Tbuf_getstring(void){
  342.         return (RTbuf->T_buf[RTbuf->T_front]);
  343. }
  344. /*********************************************************************************************************
  345. ** 函數(shù)名稱: Rbuf_putchar
  346. ** 功能描述: 從接收緩沖區(qū)讀一個字符
  347. ** 輸 入:
  348. ** 輸出         :  讀字符
  349. ** 全局變量: 無
  350. ** 調(diào)用模塊:
  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. ** 函數(shù)名稱: Tbuf_getchar
  368. ** 功能描述: 從發(fā)送緩沖區(qū)讀一個字符
  369. ** 輸 入:
  370. ** 輸出         :  讀字符
  371. ** 全局變量: 無
  372. ** 調(diào)用模塊:
  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. /******************************* 中斷處理函數(shù) ***************************
  389. * 功能:完成數(shù)據(jù)得的接收和發(fā)送
  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黑下載附件…………
復(fù)制代碼
uCOS-II移植\
串口收發(fā)\
復(fù)件 跑馬燈實驗2\
外部中斷程序\
跑馬燈實驗1\
跑馬燈實驗2\
跑馬燈實驗3\
所有資料51hei提供下載:
例程.rar (332.91 KB, 下載次數(shù): 216)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:396960 發(fā)表于 2018-9-20 13:05 | 只看該作者
參考一下,謝謝了
回復(fù)

使用道具 舉報

板凳
ID:400714 發(fā)表于 2018-9-20 20:17 | 只看該作者
xiexie ~~
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 美女天天操 | 久久日韩精品 | 国产亚洲精品综合一区 | 91xx在线观看 | 久久久久久中文字幕 | 精品亚洲一区二区三区四区五区 | 精品亚洲一区二区 | 啪啪精品 | 成人精品一区 | 日韩精品免费 | 国产在线不卡 | 欧美一级二级在线观看 | 九九久久久 | 在线只有精品 | 国产一区二区在线免费 | 91欧美精品| 亚洲午夜视频在线观看 | 一本大道久久a久久精二百 国产成人免费在线 | 久久国产综合 | 中文字幕在线免费视频 | 荷兰欧美一级毛片 | 精品久久久久久久久久久久久久久久久 | 日韩一二三区视频 | 欧美日韩免费 | 瑟瑟激情| 国产精品一区二区三 | 亚洲精品一区二区网址 | 久久国产精品99久久久久 | 欧美激情第一区 | 91精品国产一区二区三区香蕉 | 四虎国产 | 综合二区 | 国产欧美一区二区三区在线看 | 欧洲精品久久久久毛片完整版 | 精品欧美一区免费观看α√ | 久久久久精 | 丝袜美腿一区二区三区 | 欧美一级特黄aaa大片在线观看 | 天天插天天操 | 日韩一区不卡 | 中文字幕国产视频 |