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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3856|回復: 0
打印 上一主題 下一主題
收起左側

51單片機_STC89C52_AT89S52_模擬串口收發數據程序(半雙工)

[復制鏈接]
跳轉到指定樓層
樓主
    本程序實現51單片機如STC89C52、AT89S52等單機模擬串口半雙工收發數據,即接收數據時不能發送數據,發送數據時不能接收數據。
占用系統資源定時器1或定時器2、外部中斷1。
當使用定時器1時,波特率固定為4800bps;當使用定時器2時,波特率在300~4800bps之間可調。





單片機源程序如下:
  1. /************************************************************
  2. *  名稱:  51單片機模擬半雙工串口收發數據
  3. *  CPU :  STC89C52 @ 11.0592MHz
  4. *  IDE :  KeilC51 UV4
  5. *  作者 : 舒世寬
  6. *  日期 : 2021-06-08

  7. ************************************************************/


  8. #include "at89x52.h"


  9. #define BAUD                                     (4800)                                                                                        //波特率范圍 300 ~  4800
  10. #define FOSC                                            (11059200UL)                                                                //晶振頻率
  11. #define TMR_VAL                                   (65536UL-FOSC/12/BAUD)                        


  12. #define MYUART_TX_PIN                                   P2_3                        //可定義為除P3_3外的任意引腳
  13. #define MYUART_RX_PIN                                           P3_3                        //因為使用了外部中斷,所以必須為P3_3
  14. #define MYUART_RX_BUF_LEN                   20                                //接收緩沖區長度

  15. #define MYUART_RX_LED                                          P1_0                        //接收數據指示燈
  16. #define MYUART_TX_LED                                   P1_1                        //發送數據指示燈


  17. bit MYUART_TX_FLAG = 0;                                                                                //發送模式
  18. bit MYUART_RX_FLAG = 0;                                                                                //接收模式
  19. bit MYUART_TX_BYTE_DONE = 0;                                                        //發送完成一個字節


  20. unsigned char sbufdata = 0;
  21. unsigned char data_bit_i = 0;                                                        
  22. unsigned char byte_i= 0;
  23. unsigned char myuart_rxbuf[MYUART_RX_BUF_LEN] = {0};


  24. void delay()
  25. {
  26.         
  27.                 unsigned int i,j;
  28.                 for(i=0;i<100;i++)
  29.                                 for(j=0;j<100;j++);
  30.         
  31. }



  32. void myuart_init_time()
  33. {        
  34.                 T2MOD = 0;                                                                                        //默認值
  35.                 T2CON = 0;                                                                                         //默認為16位自動重裝定時器
  36.                 RCAP2L = TL2 = TMR_VAL;                                        //設置定時初值低字節
  37.                 RCAP2H = TH2 = TMR_VAL>>8;                  //設置定時初值高字節
  38.                 TF2 = 0;                                                                                                //清除TF2標志
  39.                 TR2 = 1;                                                                                                //定時器2停止計時
  40.                 ET2 = 1;                                                                                                //允許定時器2中斷
  41. }

  42. void myuart_init_recv()
  43. {
  44.                 //初始化外部中斷1
  45.                 IT1 = 1;   // 1 --- 下降沿觸發, 0 --- 低電平持續觸發
  46.           EX1 = 1;   // 開啟外部中斷1
  47. }


  48. //外部中斷1處理程序
  49. void isr_ext1(void) interrupt 2
  50. {
  51.           unsigned char i;
  52.           if(MYUART_RX_PIN == 0)
  53.                 {
  54.                                 for(i = 0;i<5;i++);                                //延時,軟件濾波
  55.                                 if(MYUART_RX_PIN == 0)
  56.                                 {
  57.                                                  EX1 = 0;                                                  //禁止外部分中斷1
  58.                                           MYUART_RX_FLAG = 1;        
  59.                                           sbufdata = 0;
  60.                                                 data_bit_i = 0;
  61.                                           myuart_init_time();                                                        
  62.                                 }
  63.                 }
  64. }

  65. void isr_timer2(void) interrupt 5
  66. {
  67.                 unsigned char tmp;
  68.                 TF2 = 0;                //定時器2中斷標志必須由軟件清零
  69.         
  70.                 //接收
  71.                 if(MYUART_RX_FLAG == 1)
  72.                 {                        
  73.                                 MYUART_RX_PIN = 1;                        //先置位,再讀取數據
  74.                           if(data_bit_i < 8){
  75.                                                 if(1==MYUART_RX_PIN)sbufdata |=  1<<data_bit_i;
  76.                                                 data_bit_i++;
  77.                                           MYUART_RX_LED  = 0;
  78.                                 }else if(data_bit_i == 8 && MYUART_RX_PIN == 1){
  79.                                                 myuart_rxbuf[byte_i++]=sbufdata;
  80.                                                 byte_i %= MYUART_RX_BUF_LEN;                 //防止溢出接收緩沖區
  81.                                           TR2 = 0;                                                                         //關閉定時器2
  82.                                                 EX1 = 1;                                                                  //允許外部分中斷1        
  83.                                           MYUART_RX_LED  = 1;
  84.                                                 MYUART_RX_FLAG  =                0;                //接收結束
  85.                                           MYUART_RX_PIN = 1;                                //置位,準備后面數據接收
  86.                                 }else{
  87.                                                 TR2 = 0;                                                                         //關閉定時器2
  88.                                                 EX1 = 1;                                                                  //允許外部分中斷1        
  89.                                           MYUART_RX_LED  = 1;               
  90.                                                 MYUART_RX_FLAG  =                0;                //接收結束
  91.                                           MYUART_RX_PIN = 1;                                //置位,準備后面數據接收
  92.                                 }
  93.                 }
  94.                
  95.                 //發送
  96.                 if(MYUART_TX_FLAG == 1)
  97.                 {  

  98.                                 if(data_bit_i ==0){                                                        
  99.                                                 MYUART_TX_PIN = 0;                                        //拉低,發送起始位               
  100.                                                 MYUART_TX_LED = 0;
  101.                                 }else if(data_bit_i < 9){
  102.                                                 tmp = sbufdata & (1<<(data_bit_i-1));//先發送低位再發送高位
  103.                                                 if(tmp == 0)
  104.                                                                 MYUART_TX_PIN = 0;               
  105.                                                 else
  106.                                                                 MYUART_TX_PIN = 1;
  107.                                          
  108.                                 }else if(data_bit_i < 12){    //連續3個停止位的時間
  109.                                                 MYUART_TX_PIN = 1;                          //拉高,發送停止位
  110.                                 }else{
  111.                                                 TR2 = 0;  
  112.                                                 RCAP2L = TL2 = TMR_VAL;                                        //設置定時初值低字節
  113.                                                 RCAP2H = TH2 = TMR_VAL>>8;                  //設置定時初值高字節
  114.                                                 MYUART_TX_BYTE_DONE = 1;        // 發送完成一個字節        
  115.                                                 MYUART_TX_LED = 1;
  116.                                                 MYUART_TX_PIN = 1;                          //拉高,準備后面數據發送
  117.                                                 
  118.                                 }
  119.                                 data_bit_i++;
  120.                 }

  121.                
  122.                
  123. }

  124. void myuart_write_byte(unsigned char dat)
  125. {        
  126.           data_bit_i = 0;
  127.                 sbufdata = dat;
  128.            TR2 = 1;                                                                                         //啟動定時器
  129.           MYUART_TX_BYTE_DONE = 0;        
  130.                 while(MYUART_TX_BYTE_DONE==0);
  131. }

  132. void myuartSendString(char * pstr)
  133. {   
  134.           if(*pstr)
  135.           {
  136.                                 MYUART_TX_FLAG = 1;
  137.                                 myuart_init_time();        
  138.                                 while(*pstr)
  139.                                 {
  140.                                                 myuart_write_byte(*pstr++);
  141.                                 }
  142.                                 MYUART_TX_FLAG = 0;
  143.                 }
  144.          
  145. }

  146. void myuartSendBuffer(unsigned char * pbuf,unsigned char len)
  147. {   
  148.                 unsigned  char i;
  149.           if(len>0)
  150.                 {
  151.                                 MYUART_TX_FLAG = 1;
  152.                           myuart_init_time();        
  153.                                 for(i=0;i<len;i++)myuart_write_byte(pbuf[i]);
  154.                                 MYUART_TX_FLAG = 0;
  155.                 }
  156. }



  157. void main(void)
  158. {
  159.         
  160.           int a,b,i;
  161.                 MYUART_TX_PIN  = 1;
  162.                 MYUART_RX_PIN  = 1;
  163.           EA = 1;                                                                //開啟全局中斷
  164.                 myuart_init_recv();                //串口接收初始化
  165.                 while(1){
  166.                                 
  167.                                 
  168.                                 delay();a  = byte_i;
  169.                                 delay();b = byte_i;
  170.                                 if(a==b && a>0)
  171.                                 {
  172.                                             myuartSendBuffer(myuart_rxbuf,byte_i);
  173.                                             for(i=0;i<MYUART_RX_BUF_LEN;i++)myuart_rxbuf[i] = 0;
  174.                                             a=0;b=0;byte_i=0;
  175.                                 }
  176.                                 //myuartSendString("my uart demo test! shushikuan@163.com 12345 ok!!!!");  //50個字符
  177.                                 //myuartSendString("my uart demo test ok");  
  178.                         
  179.                 }

  180. }
復制代碼
以上代碼51hei下載地址:
simuart.7z (24.9 KB, 下載次數: 41)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区视频 | 91在线精品一区二区 | 男女爱爱福利视频 | www.久久99| 日韩一及片 | 水蜜桃亚洲一二三四在线 | 中文字幕成人在线 | 久久国产三级 | 欧洲av一区| 久久久久国产一级毛片 | 国产在线精品一区 | 美日韩免费视频 | pacopacomama在线 | 久久精品国产一区 | 日韩欧美专区 | 中文久久| 久久99精品视频 | 久久久久一区 | 国产一区高清 | 久久一区 | 国产精品特级片 | 人人鲁人人莫人人爱精品 | 亚洲综合色自拍一区 | 天天天操 | 国产精品久久久久久久久久妇女 | 美女天堂 | 日本午夜精品一区二区三区 | 福利av在线 | 精品久久久久久久久久久久 | 美美女高清毛片视频免费观看 | 国产一区二区三区在线视频 | 久久综合一区二区三区 | 亚洲毛片在线观看 | 国产欧美一区二区久久性色99 | 日韩成人免费视频 | 国产国拍亚洲精品av | 亚洲精品视频在线看 | 国产成人网 | 成人一区二区三区在线观看 | 中文字幕在线观看视频网站 | 日韩中文字幕免费在线观看 |