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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機串口通信 接收不到返回值

[復制鏈接]
跳轉到指定樓層
樓主
新人第一次提問,如有不足請各位多多包涵~
單片機型號:STC85C516  晶振:12MHz  波特率:2400

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

串口設置如圖:


單片機程序代碼如下:
  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;//用于判斷現在是接受還是發送數據
  7. bit RxdEnd=0;//接收完畢標志
  8. bit TxdEnd=0;//發送完畢標志

  9. u8 RxdBuff=0;//接收數據緩沖區
  10. u8 TxdBuff=0;//發送數據緩沖區
  11. u16 baud;

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

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

  19.         while(1)
  20.         {
  21.         //接收數據時 沒有數據過來的時候一直是高電平
  22.         while(PIN_RXD);//退出循環時 說明已經有數據過來了,已經收到了起始位了
  23.         StartRxd();
  24.         while(!RxdEnd);//一直保持在接受信號的狀態直到給出接收結束的信號
  25.         StartTxd(RxdBuff+1);//準備發送信號
  26.         while(!TxdEnd);//一直保持在發送信號的狀態直到結束
  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是發送一位需要的時間 向右移動一位表示除了2
  38.         //所以計時器第一次溢出的時間是發送一位所需的一半 目的是為了檢驗接受到的0是干擾還是真正的起始位
  39.         ET1=1;
  40.         TR1=1;//現在才開中斷
  41.         
  42.         RxdEnd=0;//清零接受結束標志位
  43.         RxdOrTxd=0;//設置狀態為發送
  44. }


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

  51.         PIN_TXD=0;//發送起始位
  52.         TxdEnd=0;//結束標志位清零
  53.         RxdOrTxd=1;//現在狀態是發送
  54. }

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


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

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




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

使用道具 舉報

沙發
ID:213173 發表于 2019-8-18 07:16 | 只看該作者
1.沒有STC85C516這個型號,只有STC89C516RD+這個型號。
2.使用12MHz晶振波特率會有誤差,建議使用11.0592MHz晶振。
3.串口通訊模塊已經是做在MCU內部的硬件,通過正常配置相應寄存器就能正常工作,不需要像模擬串口那樣寫程序。
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. {//當接收完成發生中斷請求RI由硬件置1
  20.         RI=0;                        //接收中斷請求標志位必須軟件清0
  21.         a=SBUF;                //保存SBUF接收到的數據
  22.         SBUF=a;                //發送收到的數據
  23.         while(!TI);        //等待發送中斷請求標志位為1
  24.         TI=0;                        //發送中斷請求標志位必須軟件清0
  25. }
復制代碼
回復

使用道具 舉報

板凳
ID:601140 發表于 2019-8-18 11:22 | 只看該作者
wulin 發表于 2019-8-18 07:16
1.沒有STC85C516這個型號,只有STC89C516RD+這個型號。
2.使用12MHz晶振波特率會有誤差,建議使用11.0592M ...

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一在线 | av官网在线 | 亚洲二区在线 | 国产精品久久久久久av公交车 | 成人免费看黄网站在线观看 | 国产日韩精品视频 | 日韩精品专区在线影院重磅 | 日韩av一区二区在线观看 | 欧美精品一区二区三区在线 | 久久久久久天堂 | 久久精品国产亚洲夜色av网站 | 亚洲免费在线播放 | 久久天天躁狠狠躁夜夜躁2014 | 狠狠操婷婷 | 一区视频在线播放 | 91精品国产综合久久国产大片 | 视频在线亚洲 | 91免费观看视频 | 久久www免费人成看片高清 | 午夜国产精品视频 | 99热在线免费 | 2019精品手机国产品在线 | www.国产一区| 久久久久久久亚洲精品 | 免费黄色大片 | 91精品国产综合久久婷婷香蕉 | 99re在线免费视频 | 久久99精品久久久久久 | 91综合网 | 国产精品久久 | 美女一区二区在线观看 | 91色综合 | 欧美一区二区小视频 | 国产一级片在线观看视频 | 日韩av最新网址 | 久久99国产精一区二区三区 | 天天综合成人网 | 中文字幕视频在线看5 | 精品在线观看一区二区 | 综合色导航| 日韩电影一区二区三区 |