找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1982|回复: 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. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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)
        {         

找了一下午还是没明白为什么收不到
回复

使用道具 举报

5#
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 到你的 电脑。如果不成功就要查电路了。
回复

使用道具 举报

6#
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);
了,有没有改一下?
回复

使用道具 举报

7#
ID:974783 发表于 2021-10-26 11:44 | 只看该作者
感谢各位!!!问题解决了是单片机有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表