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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2583|回復: 6
收起左側

為什么這個單片機串口程序只可以接收不可以發送呢?

[復制鏈接]
ID:974783 發表于 2021-10-25 14:05 | 顯示全部樓層 |閱讀模式
  1. #include<reg51.h>

  2. #define FOSC 11059200UL//晶振值
  3. //#define baud 9600
  4. #define BRT (65536 - FOSC / baud / 4)//重載值

  5. sfr AUXR = 0x8e;
  6. sfr T2H = 0xd6;
  7. sfr T2L = 0xd7;
  8. sfr P1M0=0x92;
  9. sfr P1M1=0x91;
  10. sfr P3M0 = 0xb2;
  11. sfr P3M1 = 0xb1;
  12. sbit rts=P3^3;
  13. sfr P_SW1 = 0xa2;
  14. sbit red=P1^7;
  15. //sbit green=P1^2;
  16. //sbit yellow=P3^2;
  17. //sbit travelswitch=P3^4;


  18. char buft[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11};//數據發送緩沖
  19. char bufr[20];//接收
  20. char buf[30];//保存數據
  21. int flagtxd=0;//發送標志
  22. int flag0_5s=0;//定時0.5秒的標志
  23. int cnt=0;//定時計數標志
  24. int flagred=0;//紅燈閃爍標志
  25. int rlen=0;//接收數據的長度

  26. void ea_on();//開總中斷
  27. void ea_off();//關總中斷
  28. void configuart(int baud);//串口配置,baud為波特率
  29. void uartinit();//串口初始化配置
  30. void uart_interrupt_on();//串口中斷打開
  31. void uart_interrupt_off();//串口中斷關閉
  32. //void uart_r(char *bufr,char len);//串口接收
  33. void uart_t();//串口發送
  34. void max485(bit x);//max485x為0接收為1發送

  35. void timerpattern();//定時器模式
  36. void timerinitialize();//定時器初值
  37. void timert0on();//定時器T0啟動
  38. void timert0off();//定時器T0關閉
  39. void t0interrupton();//開TO中斷
  40. void t0interruptoff();//關T0中斷
  41. void redledon();//紅燈亮
  42. void redledoff();//紅燈滅
  43. //void greenledon();//綠燈亮
  44. //void greenledoff();//綠燈滅
  45. //void yellowledon();//黃燈亮
  46. //void yellowledoff();//黃燈滅
  47. void redblink();//紅燈閃
  48. void iopattern();//IO口配置

  49. char analysis_len(char *bufr,char rlen);//解析串口一段數據長度
  50. void analysis();//解析數據

  51. void main()
  52. {        
  53.         iopattern();
  54.         timerpattern();
  55.         timerinitialize();
  56.         ea_on();
  57.         t0interrupton();
  58.         //timert0on();
  59.         
  60.         red=0;
  61.         //max485(0);        //max485為接收
  62.         max485(1);
  63.          uartinit();
  64.         configuart(9600);
  65.         uart_interrupt_on();
  66. //        analysis_len(bufr,rlen);
  67.         
  68. //        analysis();
  69.         
  70.         
  71.         
  72.         
  73.         while(1)
  74.         {         
  75.                  //analysis();
  76.                  //uart_t();
  77.                  red=1;
  78.                  flagtxd=1;
  79.                  SBUF=buft[5];
  80.                  while(flagtxd);
  81. //                 switch(buf[0])
  82. //                 {
  83. //                         case 0x01:redledon();break;
  84. //                        case 0x02:redblink();break;
  85. //                        case 0x03:redledoff();break;
  86. //                 }
  87.                 //redblink();
  88.                
  89.         }
  90. }                                       
  91.                                           


  92. void ea_on()//開總中斷
  93. {
  94.         EA=1;
  95. }

  96. void ea_off()//關總中斷
  97. {
  98.         EA=0;
  99. }

  100. void configuart(int baud)//串口配置,baud為波特率
  101. {
  102.          
  103.         T2L =(65536 - FOSC / baud / 4);
  104.         T2H =(65536 - FOSC / baud / 4)>> 8;
  105.         AUXR = 0x15;//定時器2作波特率發生器

  106. }

  107. void uartinit()//串口初始化配置
  108. {
  109.         P_SW1 = 0x40; //RXD_2/P3.6, TXD_2/P3.7
  110.         SCON = 0x50;//設置串口為模式1可變波特率8位數據方式
  111. //        INT_CLKO &= ~0x02;        //不輸出時鐘

  112. }

  113. void uart_interrupt_on()//串口中斷打開
  114. {
  115.         ES=1;
  116. }
  117.         
  118. void uart_interrupt_off()//串口中斷關閉
  119. {
  120.         ES=0;
  121. }

  122. //void uart_r(char *bufr,char len)//接收
  123. //{
  124. //        int i;
  125. //        if((SBUF^0x02)!=0)//是否為0x02開頭不是則丟棄數據
  126. //        {
  127. //                for(i=0;i<=len;i++)
  128. //                {
  129. //                        bufr[i]=SBUF;
  130. //                        while(!RI)
  131. //                        {
  132. //                                flag0_5s=0;
  133. //                                timert0on();
  134. //                                t0interrupton();
  135. //                                if(flag0_5s==1)
  136. //                                {
  137. //                                        flag0_5s=0;
  138. //                                        timert0off();
  139. //                                        t0interruptoff();
  140. //                                        break;
  141. //                                }
  142. //                                
  143. //                        }
  144. //                }
  145. //        }
  146. //}

  147. void uart_t()//發送
  148. {
  149.         int i;        
  150.                 for(i=0;i<10;i++)
  151.                 {
  152.                         flagtxd=0;
  153.                         SBUF=buft[i];
  154.                         while(!flagtxd);//等待發送結束
  155. //                        {
  156. //                                timert0on();
  157. //                                t0interrupton();
  158. //                                if(flag0_5s==1)
  159. //                                {
  160. //                                        flag0_5s=0;
  161. //                                        timert0off();
  162. //                                        t0interruptoff();
  163. //                                        break;
  164. //                                }
  165. //                                
  166. //                        }
  167.                 }
  168. }

  169. void max485(bit x)
  170. {
  171.         rts=x;
  172. }

  173. void timerpattern()
  174. {
  175.         TMOD=0x01;
  176. }//定時器為模式1非自動重載

  177. void timerinitialize()
  178. {
  179.         TH0=0xD5;
  180.         TL0=0x08;
  181. }//定時器初始化

  182. void timert0on()
  183. {
  184.         TR0=1;
  185. }//定時器T0啟動

  186. void timert0off()
  187. {
  188.         TR0=0;
  189. }//定時器T0關閉

  190. void t0interrupton()
  191. {
  192.         ET0=1;
  193. }//開TO中斷

  194. void t0interruptoff()
  195. {
  196.         ET0=0;
  197. }//關T0中斷

  198. void redledon()
  199. {
  200.         red=1;
  201. }
  202. //紅燈亮

  203. void redledoff()
  204. {
  205.         red=0;
  206. }
  207. //紅燈滅

  208. //void greenledon()
  209. //{
  210. //        green=1;
  211. //}
  212. ////綠燈亮
  213. //
  214. //void greenledoff()
  215. //{
  216. //        green=0;
  217. //}//綠燈滅
  218. //
  219. //void yellowledon()
  220. //{
  221. //        yellow=1;
  222. //}//黃燈亮
  223. //
  224. //void yellowledoff()
  225. //{
  226. //        yellow=0;
  227. //}//黃燈滅

  228. void redblink()
  229. {
  230.         if(flagred==1)
  231.         {
  232.                 flagred=0;
  233.                 red=~red;
  234.         }
  235. }

  236. void iopattern()
  237. {
  238.         P1M0=0x00;//準雙向模式
  239.         P1M1=0x00;
  240.         P3M0=0x88;
  241.         P3M1=0x00;
  242. }//IO口配置

  243. //char analysis_len(char *bufr,char len)
  244. //{
  245. //        char cnt,i,j;
  246. //        char k=0;
  247. //        for(i=0;i<=len;i++)
  248. //        {
  249. //                if(bufr[i]==0x02)
  250. //                {
  251. //                        cnt=1;
  252. //                        buf[k]=bufr[i];
  253. //                        for(j=0;j<=len;j++)
  254. //                        {
  255. //                                cnt++;
  256. //                                buf[k++]=bufr[i+j];
  257. //                                if(bufr[i+j]==0x03)
  258. //                                {
  259. //                                        return cnt;
  260. //                                }
  261. //                        }
  262. //                }
  263. //               
  264. //        }
  265. //        return 0;               
  266. //}

  267. void analysis()
  268. {
  269.         int i;
  270.         for(i=0;i<=30;i++)
  271.         {
  272.                 if(buf[i]==0x02)
  273.                         {
  274.                                 if(buf[i+1]==0x30)
  275.                                 {
  276.                                         if(buf[i+3]==0x30)
  277.                                         {
  278.                                                 if(buf[i+4]==0x30)
  279.                                                 {
  280.                                                         if(buf[i+5]==0x03)
  281.                                                         {
  282.                                                                 switch (buf[i+2])
  283.                                                                 {
  284.                                                                         case 0x31:redledon();break;
  285.                                                                         case 0x32:redblink();break;
  286.                                                                         case 0x33:redledoff();break;
  287.                                                                 }
  288.                                                         }
  289.                                                 }
  290.                                         }
  291.                                 }
  292.                         }
  293.         }




  294. //        if(buf[0]!=0x02)
  295. //                return;
  296. //        else if(buf[1]!=0x30)
  297. //                return;
  298. //        else if(buf[3]!=0x30)
  299. //                return;
  300. //        else if(buf[4]!=0x30)
  301. //                return;
  302. //        else if(buf[5]!=0x03)
  303. //                return;
  304. //        else
  305. //        //if(((buf[1]==0x30)&&(buf[3]==0x30))&&((buf[4]==0x30)&&(buf[5]==0x03)))
  306. //        {
  307. //                 switch(buf[2])
  308. //                {
  309. //                        case 0x31:redledon();break;
  310. //                        case 0x32:redblink();break;
  311. //                        case 0x33:redledoff();break;
  312. //                }
  313. //        }
  314. }                        



  315. void interrupttimer() interrupt 1
  316. {         
  317.                 TH0=0xD5;
  318.                 TL0=0x08;
  319.                 cnt++;
  320.         
  321.                 if(cnt>=50)
  322.                 {
  323.                         cnt=0;
  324.                         flag0_5s=1;
  325.                         flagred=1;
  326.                         //flag2s++;
  327.                         

  328.                 }
  329. }//中斷定時0.5秒

  330. void uart_interrupt() interrupt 4//串口中斷
  331. {
  332.         if(RI) //接收到字節
  333.         {
  334.                 RI=0;//軟件清零接收中斷標志位
  335.                 //if(rlen<20)
  336.                 //{
  337.                         buf[rlen]=SBUF;
  338.                         rlen++;
  339.                 //}
  340. //                if(rlen<20)
  341. //                {
  342. //                        bufr[rlen]=SBUF;
  343. //                        rlen++;
  344. //                }
  345.         }
  346.         if(TI)//發送字節
  347.         {
  348.                 TI=0;//軟件清零發送中斷標志位
  349.                 flagtxd=1;//發送完成標志
  350.                
  351.         }
  352. }
復制代碼

回復

使用道具 舉報

ID:624769 發表于 2021-10-25 15:34 | 顯示全部樓層
從你的程序看……
        while(1)
        {         
                   flagtxd=1;
                 SBUF=buft[5];         <== 這里會發一次
                 while(flagtxd);         <===   一直停這里了。
          }
而,buft[5]; 是空值, 如果你串口助手是 16進制, 那么能收到一個 0x00,  是文本 的話什么也收不到。
回復

使用道具 舉報

ID:974783 發表于 2021-10-25 16:20 | 顯示全部樓層
188610329 發表于 2021-10-25 15:34
從你的程序看……
        while(1)
        {         

這樣呢

void uart_t(char *buft,char len)//發送
{
        int i;       
                for(i=0;i<len;i++)
                {
                        flagtxd=0;
                        SBUF=*buft++;
                        if((SBUF^0x07)!=0)
                        {
                                red=1;
                        }
                        while(!flagtxd);//等待發送結束

這是中斷

if(TI)//發送字節
        {
                TI=0;//軟件清零發送中斷標志位
                flagtxd=1;//發送完成標志
               
        }
回復

使用道具 舉報

ID:974783 發表于 2021-10-25 16:22 | 顯示全部樓層
188610329 發表于 2021-10-25 15:34
從你的程序看……
        while(1)
        {         

找了一下午還是沒明白為什么收不到
回復

使用道具 舉報

ID:624769 發表于 2021-10-25 17:34 | 顯示全部樓層
大幅度釋放的 發表于 2021-10-25 16:22
找了一下午還是沒明白為什么收不到

如果,你只是要查串口發的問題,作一個簡單試驗不就好了?
主程序里
while(1)
{
      while(flagtxd);
      flagtxd = 1;
      SUBF  = 'A';
}

中斷里
if(TI)//發送字節
        {
                TI=0;//軟件清零發送中斷標志位
                flagtxd=0;//發送完成標志
               
        }

如果成功工作,就會發很多  A 到你的 電腦。如果不成功就要查電路了。
回復

使用道具 舉報

ID:959346 發表于 2021-10-25 18:04 | 顯示全部樓層
大幅度釋放的 發表于 2021-10-25 16:20
這樣呢

void uart_t(char *buft,char len)//發送

你主函數內沒有用uart_t,直接
flagtxd=1;
                 SBUF=buft[5];
                 while(flagtxd);
了,有沒有改一下?
回復

使用道具 舉報

ID:974783 發表于 2021-10-26 11:44 | 顯示全部樓層
感謝各位!!!問題解決了是單片機有問題
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 操视频网站 | 亚洲欧美aⅴ | 欧洲一区二区视频 | 成年人的视频免费观看 | 精品九九 | 国产精品久久九九 | 91精品国产综合久久婷婷香蕉 | 日韩在线一区二区三区 | 在线播放中文字幕 | 国产精品国产精品国产专区不蜜 | 国产精品色 | 成年人黄色一级毛片 | 看av电影 | 久草色播| 日韩欧美中文字幕在线观看 | 亚洲免费视频在线观看 | 国产一区二区日韩 | 中文字幕日韩在线 | 精品不卡| 狠狠的干| 亚洲另类视频 | 在线观看中文字幕 | 精品国产乱码久久久久久老虎 | 久久久九九九九 | 少妇一级淫片免费播放 | 成人福利网站 | 日韩欧美不卡 | 高清国产午夜精品久久久久久 | 午夜视频一区二区三区 | 九九色九九 | 久久大全| 狠狠涩| 在线视频日韩 | 一级在线 | 午夜视频网站 | 国产91亚洲精品 | 国产视频线观看永久免费 | 黄色毛片在线播放 | 国产电影一区二区 | 亚洲免费在线观看 | 在线免费观看视频黄 |