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

標(biāo)題: 為什么這個(gè)單片機(jī)串口程序只可以接收不可以發(fā)送呢? [打印本頁(yè)]

作者: 大幅度釋放的    時(shí)間: 2021-10-25 14:05
標(biāo)題: 為什么這個(gè)單片機(jī)串口程序只可以接收不可以發(fā)送呢?
  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};//數(shù)據(jù)發(fā)送緩沖
  19. char bufr[20];//接收
  20. char buf[30];//保存數(shù)據(jù)
  21. int flagtxd=0;//發(fā)送標(biāo)志
  22. int flag0_5s=0;//定時(shí)0.5秒的標(biāo)志
  23. int cnt=0;//定時(shí)計(jì)數(shù)標(biāo)志
  24. int flagred=0;//紅燈閃爍標(biāo)志
  25. int rlen=0;//接收數(shù)據(jù)的長(zhǎng)度

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

  35. void timerpattern();//定時(shí)器模式
  36. void timerinitialize();//定時(shí)器初值
  37. void timert0on();//定時(shí)器T0啟動(dòng)
  38. void timert0off();//定時(shí)器T0關(guān)閉
  39. void t0interrupton();//開(kāi)TO中斷
  40. void t0interruptoff();//關(guān)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);//解析串口一段數(shù)據(jù)長(zhǎng)度
  50. void analysis();//解析數(shù)據(jù)

  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()//開(kāi)總中斷
  93. {
  94.         EA=1;
  95. }

  96. void ea_off()//關(guān)總中斷
  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;//定時(shí)器2作波特率發(fā)生器

  106. }

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

  112. }

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

  122. //void uart_r(char *bufr,char len)//接收
  123. //{
  124. //        int i;
  125. //        if((SBUF^0x02)!=0)//是否為0x02開(kāi)頭不是則丟棄數(shù)據(jù)
  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()//發(fā)送
  148. {
  149.         int i;        
  150.                 for(i=0;i<10;i++)
  151.                 {
  152.                         flagtxd=0;
  153.                         SBUF=buft[i];
  154.                         while(!flagtxd);//等待發(fā)送結(jié)束
  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. }//定時(shí)器為模式1非自動(dòng)重載

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

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

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

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

  194. void t0interruptoff()
  195. {
  196.         ET0=0;
  197. }//關(guān)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;//準(zhǔn)雙向模式
  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. }//中斷定時(shí)0.5秒

  330. void uart_interrupt() interrupt 4//串口中斷
  331. {
  332.         if(RI) //接收到字節(jié)
  333.         {
  334.                 RI=0;//軟件清零接收中斷標(biāo)志位
  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)//發(fā)送字節(jié)
  347.         {
  348.                 TI=0;//軟件清零發(fā)送中斷標(biāo)志位
  349.                 flagtxd=1;//發(fā)送完成標(biāo)志
  350.                
  351.         }
  352. }
復(fù)制代碼


作者: 188610329    時(shí)間: 2021-10-25 15:34
從你的程序看……
        while(1)
        {         
                   flagtxd=1;
                 SBUF=buft[5];         <== 這里會(huì)發(fā)一次
                 while(flagtxd);         <===   一直停這里了。
          }
而,buft[5]; 是空值, 如果你串口助手是 16進(jìn)制, 那么能收到一個(gè) 0x00,  是文本 的話什么也收不到。

作者: 大幅度釋放的    時(shí)間: 2021-10-25 16:20
188610329 發(fā)表于 2021-10-25 15:34
從你的程序看……
        while(1)
        {         

這樣呢

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

這是中斷

if(TI)//發(fā)送字節(jié)
        {
                TI=0;//軟件清零發(fā)送中斷標(biāo)志位
                flagtxd=1;//發(fā)送完成標(biāo)志
               
        }
作者: 大幅度釋放的    時(shí)間: 2021-10-25 16:22
188610329 發(fā)表于 2021-10-25 15:34
從你的程序看……
        while(1)
        {         

找了一下午還是沒(méi)明白為什么收不到
作者: 188610329    時(shí)間: 2021-10-25 17:34
大幅度釋放的 發(fā)表于 2021-10-25 16:22
找了一下午還是沒(méi)明白為什么收不到

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

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

如果成功工作,就會(huì)發(fā)很多  A 到你的 電腦。如果不成功就要查電路了。

作者: Jiang_YY    時(shí)間: 2021-10-25 18:04
大幅度釋放的 發(fā)表于 2021-10-25 16:20
這樣呢

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

你主函數(shù)內(nèi)沒(méi)有用uart_t,直接
flagtxd=1;
                 SBUF=buft[5];
                 while(flagtxd);
了,有沒(méi)有改一下?
作者: 大幅度釋放的    時(shí)間: 2021-10-26 11:44
感謝各位!!!問(wèn)題解決了是單片機(jī)有問(wèn)題




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