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

標(biāo)題: STC15F系列8051單片機(jī)模擬串口57600bps@24MHz [打印本頁]

作者: wudawei    時(shí)間: 2014-12-31 00:02
標(biāo)題: STC15F系列8051單片機(jī)模擬串口57600bps@24MHz

  1. //為何不把程序?qū)懙猛ㄋ滓锥c(diǎn)?超級(jí)代碼來了!
  2. //參考了STC官網(wǎng)手冊(cè)中的程序,但源程序遇到RX腳一直為低電平也會(huì)收到數(shù)據(jù)0x00,這里已經(jīng)修正
  3. //柳州市第一職業(yè)技術(shù)學(xué)校 電氣自動(dòng)化專業(yè)部 中國歐軟 China O Soft! 2012年8月3日
  4. #include <reg52.h>                                //使用8052內(nèi)核單片機(jī)
  5. sbit TX_IO=P3^1;                                  //模擬串口發(fā)送IO
  6. sbit RX_IO=P3^0;                                  //模擬串口接收IO
  7. sfr AUXR=0x8e;                        //STC15F系列單片機(jī)特殊寄存器,控制定時(shí)器時(shí)鐘來源頻率
  8. bit sending,receing,received;                      //發(fā)送中,接收中,接收完畢標(biāo)志
  9. unsigned char rece_bit_count;                      //接收位計(jì)數(shù)變量
  10. unsigned char rece_pls_count;                      //接收脈沖計(jì)數(shù)變量
  11. unsigned char send_bit_count;                      //發(fā)送位計(jì)數(shù)變量
  12. unsigned char send_pls_count;                      //發(fā)送脈沖計(jì)數(shù)變量
  13. unsigned char receing_data;                        //正在接收著的臨時(shí)數(shù)據(jù)
  14. unsigned char byte_need_to_send;                  //要發(fā)送出去的字節(jié)
  15. unsigned char byte_received;                      //已收到的字節(jié)

  16. void send_byte(unsigned char byte_will_send)      //發(fā)送一個(gè)字節(jié)
  17. {                                                  //函數(shù)開始
  18. byte_need_to_send=byte_will_send;                  //傳遞要發(fā)送的數(shù)據(jù)
  19. send_pls_count=3;                                  //采樣倍率3
  20. send_bit_count=8;                                  //8位數(shù)據(jù)一位停止
  21. TX_IO=0;                                          //發(fā)送起始位
  22. sending=1;                                        //置標(biāo)志位,中斷程序開始發(fā)送該字節(jié)
  23. while(sending);                                    //等待數(shù)據(jù)發(fā)送完成
  24. }                                                  //函數(shù)結(jié)束

  25. void timer0(void) interrupt 1                      //中斷服務(wù)程序
  26. {                                                  //函數(shù)開始
  27. if(receing)                                        //接收中?
  28.   {                                                //接收中開始
  29.   if(--rece_pls_count==0)                          //三次脈沖計(jì)數(shù)夠了嗎?
  30.     {                                              //接收一位二進(jìn)制位開始
  31.     rece_pls_count=3;                              //脈沖計(jì)數(shù)輔助變量復(fù)位
  32.     if(rece_bit_count)                            //是在接收數(shù)據(jù)位還是停止位
  33.       {                                            //接收數(shù)據(jù)位開始
  34.       receing_data=receing_data>>1;                //向右移一位,準(zhǔn)備拼入一位二進(jìn)制數(shù)據(jù)
  35.       if(RX_IO==1){receing_data=receing_data|0x80;}//如果收到的是二進(jìn)制位"1",則拼入最高位中
  36.       rece_bit_count=rece_bit_count-1;            //已接收一位,接收位計(jì)數(shù)變量計(jì)數(shù)
  37.       }                                            //接收數(shù)據(jù)位結(jié)束
  38.     else                                          //如果已經(jīng)收完8位數(shù)據(jù)
  39.       {                                            //就開始接收停止位
  40.       receing=0;                                  //本字節(jié)已接收完畢
  41.       if(RX_IO==1)                                //停止位是"1"嗎
  42.         {                                          //是“1”
  43.         byte_received=receing_data;                //將數(shù)據(jù)輸出
  44.         received=1;                                //搖旗示意數(shù)據(jù)正確接收完畢
  45.         }                                          //數(shù)據(jù)輸出處理完畢
  46.       }                                            //停止位處理完畢
  47.     }                                              //接收一位二進(jìn)制位結(jié)束
  48.   }                                                //接收中處理結(jié)束
  49. else                                              //還沒收到停止位,不是正在接收狀態(tài)
  50.   {                                                //等待接收開始
  51.     if(RX_IO==0)                                  //是一個(gè)起始位到來嗎
  52.     {                                              //是.......
  53.     receing=1;                                    //開始接收
  54.     rece_pls_count=3;                              //置接收起始位脈沖數(shù)
  55.     rece_bit_count=8;                              //置接收二進(jìn)制位數(shù)
  56.     }                                              //起始位處理完畢
  57.   }                                                //等待接收完畢
  58. //----------------------------------------------------------------------------------------
  59. if(sending)                                        //是正在發(fā)送狀態(tài)嗎
  60.   {                                                //是……
  61.   if(--send_pls_count==0)                          //脈沖計(jì)數(shù)夠了嗎
  62.     {                                              //夠了……
  63.     send_pls_count=3;                              //脈沖計(jì)數(shù)復(fù)位
  64.     if(send_bit_count)                            //是在發(fā)送數(shù)據(jù)還是要發(fā)送停止位
  65.       {                                            //發(fā)送數(shù)據(jù)開始
  66.       TX_IO=byte_need_to_send&0x01;                //從最低位開始發(fā)送數(shù)據(jù)
  67.       byte_need_to_send=byte_need_to_send>>1;      //移動(dòng)數(shù)據(jù)準(zhǔn)備下一次發(fā)送
  68.       send_bit_count=send_bit_count-1;            //已經(jīng)發(fā)送了一位二進(jìn)制數(shù)要記下來
  69.       }                                            //發(fā)送數(shù)據(jù)結(jié)束
  70.     else                                          //數(shù)據(jù)已經(jīng)發(fā)送完成
  71.       {                                            //發(fā)送停止位開始
  72.       TX_IO=1;                                    //發(fā)送停止位
  73.       sending=0;                                  //放下旗幟表示數(shù)據(jù)已經(jīng)發(fā)送完成
  74.       }                                            //停止位發(fā)送完成
  75.     }                                              //一位二進(jìn)制位處理完成
  76.   }                                                //發(fā)送狀態(tài)處理完成
  77. }                                                  //中斷函數(shù)結(jié)束
  78. void main(void)                                    //主程序
  79. {                                                  //開始
  80. AUXR=0x80;                                        //T0計(jì)時(shí)脈沖不分頻,比傳統(tǒng)8051快12倍
  81. TMOD=0X00;                //16位自動(dòng)重載模式,當(dāng)TR0=0時(shí)向TH0,TL0寫入數(shù)據(jù)將同時(shí)寫入重載寄存器
  82. TH0=(65536-(24000000/57600/3))/256;                //重載值=65536-(定時(shí)器脈沖頻率÷波特率÷3)
  83. TL0=(65536-(24000000/57600/3))%256;                //溢出率=定時(shí)器脈沖頻率÷(65536-重載值)
  84. TR0=1;                                            //啟動(dòng)定時(shí)器,模擬串口開始工作
  85. EA=1;                                              //打開總中斷
  86. ET0=1;                                            //打開定時(shí)器0中斷
  87. PX0=1;                                            //優(yōu)先保證定時(shí)器0中斷,確保模擬串口的可靠性
  88. while(1)                                          //主循環(huán)
  89.   {                                                //主循環(huán)體開始
  90.   if(received==1)                                  //收到一個(gè)字節(jié)的數(shù)據(jù)啦?
  91.     {                                              //是……
  92.     received=0;                                    //知道了……
  93.     send_byte(byte_received);                      //原封不動(dòng)打回原籍
  94.     }                                              //收到字節(jié)處理完畢
  95.   }                                                //主循環(huán)體結(jié)束
  96. }                                                  //主程序結(jié)束
復(fù)制代碼







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 免费视频一区二区 | 黄色av免费网站 | 亚洲一区二区免费 | 精品欧美乱码久久久久久 | 国产精品美女www | 亚洲精品久久久9婷婷中文字幕 | 日韩欧美国产成人一区二区 | 久久中文字幕电影 | 国产成人精品一区二三区在线观看 | 国产高清在线精品一区二区三区 | 久久久www成人免费精品张筱雨 | 婷婷色国产偷v国产偷v小说 | 亚洲不卡在线观看 | 在线视频 欧美日韩 | 天天看片天天干 | 激情a| 国产精品亚洲一区二区三区在线 | www.xxxx欧美 | 欧美一级在线 | 亚洲啪啪| 日韩精品一区二区三区高清免费 | 成人毛片一区二区三区 | 欧美日韩18 | 久产久精国产品 | www.夜夜骑| 一区二区日韩 | 欧美亚洲网站 | 国产人成精品一区二区三 | 91在线精品秘密一区二区 | 国产精品乱码一区二区三区 | 日韩精品在线看 | 精品久久成人 | 一级黄色日本片 | 久久99精品久久久久久 | 国产在线不卡视频 | www.yw193.com| av毛片免费 | 亚洲乱码一区二区三区在线观看 | 久久精品国产久精国产 | 亚洲精品无人区 | 可以在线观看av的网站 |