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

標題: 51單片機串口通信 接收不到返回值 [打印本頁]

作者: gear0803    時間: 2019-8-17 17:33
標題: 51單片機串口通信 接收不到返回值
新人第一次提問,如有不足請各位多多包涵~
單片機型號:STC85C516  晶振:12MHz  波特率:2400

問題描述:在做UART串口通信時 我想實現(xiàn)用電腦給單片機發(fā)送一個數(shù)字 然后單片機返回這個數(shù)字+1的值  但是通過串口助手發(fā)現(xiàn)單片機沒有返回任何東西   想請問一下為什么會這樣?是程序的問題嗎?還是有哪里設置不對?謝謝各位!!

串口設置如圖:


單片機程序代碼如下:
  1. #include<reg52.h>

  2. sbit PIN_RXD=P3^0;
  3. sbit PIN_TXD=P3^1;

  4. typedef unsigned char u8;
  5. typedef unsigned int u16;

  6. bit RxdOrTxd=0;//用于判斷現(xiàn)在是接受還是發(fā)送數(shù)據(jù)
  7. bit RxdEnd=0;//接收完畢標志
  8. bit TxdEnd=0;//發(fā)送完畢標志

  9. u8 RxdBuff=0;//接收數(shù)據(jù)緩沖區(qū)
  10. u8 TxdBuff=0;//發(fā)送數(shù)據(jù)緩沖區(qū)
  11. u16 baud;

  12. void ConfigBaud(u16);//設置波特率函數(shù)
  13. void StartRxd();
  14. void StartTxd(u8 dat);

  15. void main()
  16. {   
  17.         ConfigBaud(2400);
  18.         EA=1;

  19.         while(1)
  20.         {
  21.         //接收數(shù)據(jù)時 沒有數(shù)據(jù)過來的時候一直是高電平
  22.         while(PIN_RXD);//退出循環(huán)時 說明已經(jīng)有數(shù)據(jù)過來了,已經(jīng)收到了起始位了
  23.         StartRxd();
  24.         while(!RxdEnd);//一直保持在接受信號的狀態(tài)直到給出接收結(jié)束的信號
  25.         StartTxd(RxdBuff+1);//準備發(fā)送信號
  26.         while(!TxdEnd);//一直保持在發(fā)送信號的狀態(tài)直到結(jié)束
  27.         
  28.         }

  29. }


  30. void ConfigBaud(u16 baud)
  31. {
  32.         TMOD=(TMOD&0x0F)|0x20; //定時器1設置為模式2
  33.         TH1=256-1000000/(baud*32);
  34. }

  35. void StartRxd()
  36. {
  37.         TL0=256-((256-TH0)>>1);//256-TH0是發(fā)送一位需要的時間 向右移動一位表示除了2
  38.         //所以計時器第一次溢出的時間是發(fā)送一位所需的一半 目的是為了檢驗接受到的0是干擾還是真正的起始位
  39.         ET1=1;
  40.         TR1=1;//現(xiàn)在才開中斷
  41.         
  42.         RxdEnd=0;//清零接受結(jié)束標志位
  43.         RxdOrTxd=0;//設置狀態(tài)為發(fā)送
  44. }


  45. void StartTxd(u8 dat)
  46. {
  47.         TxdBuff=dat;
  48.         TL1=TH1;
  49.         ET1=1;
  50.         TR1=1;

  51.         PIN_TXD=0;//發(fā)送起始位
  52.         TxdEnd=0;//結(jié)束標志位清零
  53.         RxdOrTxd=1;//現(xiàn)在狀態(tài)是發(fā)送
  54. }

  55. void InterruptTimer1() interrupt 3
  56. {
  57.         static u8 cnt=0;


  58.         if(!RxdOrTxd)//如果狀態(tài)是接受數(shù)據(jù)
  59.         {
  60.                 if(cnt==0)//說明當前在處理的是起始位
  61.                 {
  62.                         if(!PIN_RXD)//如果真的是起始位而不是干擾
  63.                         {
  64.                                  cnt++;
  65.                                 RxdBuff=0;//清空緩沖區(qū)準備接受數(shù)據(jù)
  66.                         }
  67.                         else
  68.                         {TR1=0;}
  69.                
  70.                 }
  71.                 else if(cnt>=8)//數(shù)據(jù)接收完畢
  72.                 {
  73.                         RxdEnd=1;
  74.                         cnt=0;
  75.                         TR1=0;
  76.                 }
  77.                 else //接受數(shù)據(jù)
  78.                 {
  79.                         RxdBuff>>=1;//因為先進來的是低位 往右移動
  80.                         if(RxdBuff)//如果此時接收到的位是1
  81.                         {RxdBuff|=0x80;}//那就把最高位置1其他不動
  82.                         //如果此時接受到的是0 那直接移動就好了 自動補0
  83.                 }
  84.                                 
  85.         }
  86.         else//發(fā)送數(shù)據(jù)
  87.         {        
  88.                 cnt++;
  89.                 PIN_TXD=TxdBuff&0x01;
  90.                 TxdBuff>>=1;

  91.                 if(cnt>=8)
  92.                 {
  93.                         cnt=0;
  94.                         PIN_TXD=1;//結(jié)束位要發(fā)1
  95.                         TxdEnd=1;
  96.                         TR1=0;//關(guān)定時器
  97.                 }               
  98.         }
  99.         
  100. }
復制代碼





作者: wulin    時間: 2019-8-18 07:16
1.沒有STC85C516這個型號,只有STC89C516RD+這個型號。
2.使用12MHz晶振波特率會有誤差,建議使用11.0592MHz晶振。
3.串口通訊模塊已經(jīng)是做在MCU內(nèi)部的硬件,通過正常配置相應寄存器就能正常工作,不需要像模擬串口那樣寫程序。
4.串口中斷號是interrupt 4, 不是interrupt 3
給你一個測試程序參考
  1. #include <reg52.H>

  2. unsigned char a;//接收緩沖變量

  3. void main()                                                       
  4. {
  5.         TMOD=0x20;        //定時器1方式2(8位自動重載)
  6.         TH1=0xf3;         //波特率2400,12MHz晶振誤差0.16%
  7.         TL1=0xf3;
  8. //        TH1=0xf4;         //波特率2400,11.0592MHz晶振誤差0.00%
  9. //        TL1=0xf4;
  10.         TR1=1;                //開定時器1
  11.         REN=1;                //允許串行接收
  12.         SM0=0;                //設置串口方式1(8位UART波特率可變)
  13.         SM1=1;                //設置串口方式1(8位UART波特率可變)
  14.         EA=1;                        //開總中斷
  15.         ES=1;                        //開串口中斷
  16.         while(1);
  17. }

  18. void UARTInterrupt(void) interrupt 4
  19. {//當接收完成發(fā)生中斷請求RI由硬件置1
  20.         RI=0;                        //接收中斷請求標志位必須軟件清0
  21.         a=SBUF;                //保存SBUF接收到的數(shù)據(jù)
  22.         SBUF=a;                //發(fā)送收到的數(shù)據(jù)
  23.         while(!TI);        //等待發(fā)送中斷請求標志位為1
  24.         TI=0;                        //發(fā)送中斷請求標志位必須軟件清0
  25. }
復制代碼

作者: gear0803    時間: 2019-8-18 11:22
wulin 發(fā)表于 2019-8-18 07:16
1.沒有STC85C516這個型號,只有STC89C516RD+這個型號。
2.使用12MHz晶振波特率會有誤差,建議使用11.0592M ...

那個單片機型號確實是我打錯了不好意思...非常感謝您的詳細解答!!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 黄色日批视频 | 亚洲区一区二 | 成人av电影在线 | 国产91久久久久蜜臀青青天草二 | 四季久久免费一区二区三区四区 | 日韩黄色小视频 | 日韩av大片免费看 | 日韩精品 电影一区 亚洲 | 久久综合一区 | 欧美性猛交| 天天操网 | 91色视频在线 | 日日天天 | 91精品国产色综合久久 | 亚洲精品一区二区三区四区高清 | 99精品九九| 91免费版在线观看 | 亚洲精品在| 亚洲天堂成人在线视频 | 免费在线观看一级毛片 | 91精品在线播放 | 中文字幕视频在线观看免费 | 青青草在线播放 | 精品99在线 | 国产日韩精品视频 | 青春草国产 | xxxxx黄色片 欧美一区免费 | 久久一区精品 | 国产美女特级嫩嫩嫩bbb片 | 青青草一区二区三区 | 国产一区二区久久久 | 美女久久久 | 国产一级电影在线观看 | 成人在线观看免费爱爱 | 亚洲 欧美 日韩 在线 | 日本在线看片 | 一级特黄视频 | 久久成人免费视频 | 成人午夜毛片 | 久久免费国产视频 | www.黄色在线观看 |