欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機(jī)串口通信 接收不到返回值 [打印本頁]

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

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

串口設(shè)置如圖:


單片機(jī)程序代碼如下:
  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;//接收完畢標(biāo)志
  8. bit TxdEnd=0;//發(fā)送完畢標(biāo)志

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

  12. void ConfigBaud(u16);//設(shè)置波特率函數(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í) 沒有數(shù)據(jù)過來的時(shí)候一直是高電平
  22.         while(PIN_RXD);//退出循環(huán)時(shí) 說明已經(jīng)有數(shù)據(jù)過來了,已經(jīng)收到了起始位了
  23.         StartRxd();
  24.         while(!RxdEnd);//一直保持在接受信號(hào)的狀態(tài)直到給出接收結(jié)束的信號(hào)
  25.         StartTxd(RxdBuff+1);//準(zhǔn)備發(fā)送信號(hào)
  26.         while(!TxdEnd);//一直保持在發(fā)送信號(hào)的狀態(tài)直到結(jié)束
  27.         
  28.         }

  29. }


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

  35. void StartRxd()
  36. {
  37.         TL0=256-((256-TH0)>>1);//256-TH0是發(fā)送一位需要的時(shí)間 向右移動(dòng)一位表示除了2
  38.         //所以計(jì)時(shí)器第一次溢出的時(shí)間是發(fā)送一位所需的一半 目的是為了檢驗(yàn)接受到的0是干擾還是真正的起始位
  39.         ET1=1;
  40.         TR1=1;//現(xiàn)在才開中斷
  41.         
  42.         RxdEnd=0;//清零接受結(jié)束標(biāo)志位
  43.         RxdOrTxd=0;//設(shè)置狀態(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é)束標(biāo)志位清零
  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)//說明當(dāng)前在處理的是起始位
  61.                 {
  62.                         if(!PIN_RXD)//如果真的是起始位而不是干擾
  63.                         {
  64.                                  cnt++;
  65.                                 RxdBuff=0;//清空緩沖區(qū)準(zhǔn)備接受數(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;//因?yàn)橄冗M(jìn)來的是低位 往右移動(dòng)
  80.                         if(RxdBuff)//如果此時(shí)接收到的位是1
  81.                         {RxdBuff|=0x80;}//那就把最高位置1其他不動(dòng)
  82.                         //如果此時(shí)接受到的是0 那直接移動(dòng)就好了 自動(dòng)補(bǔ)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)定時(shí)器
  97.                 }               
  98.         }
  99.         
  100. }
復(fù)制代碼





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

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

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

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

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

那個(gè)單片機(jī)型號(hào)確實(shí)是我打錯(cuò)了不好意思...非常感謝您的詳細(xì)解答!!




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1