找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3775|回复: 0
打印 上一主题 下一主题
收起左侧

给大家分享个51单片机串口发送汉字与字节程序(工作总结)

[复制链接]
跳转到指定楼层
楼主
ID:609989 发表于 2019-9-25 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用STC89C58RD+这款CPU,做一个RX232 串口与上位机通讯程序。
功能:得到上位机指令控制一个I/0。急停一段时间向上位机send一个帮助指令(这个需要汉字,这个汉子老坑爹了,需要一个“KeilFDfix_b7(冠铭师兄版)“补丁)
         内部的TR0没有使用,代码没问题也可以使用。

单片机源程序如下:
  1. #include <stc89.h>
  2. #include <stdio.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. //I/O
  6. sbit stop  = P3^2;
  7. sbit led_ok = P2^0;
  8. sbit led_ng = P2^1;
  9. sbit led_help = P2^6;
  10. sbit a = P1^0;
  11. sbit b = P1^1;
  12. sbit c = P1^2;
  13. sbit d = P1^3;
  14. //bit
  15. uint h,k,l,t,f,i=0,g=0,num=0,s;
  16. bit flag;
  17. //delay_1ms
  18. void delayms(uint time)
  19. {
  20.    uint x,y;
  21.    for(x=0;x<time;x++)
  22.       for(y=0;y<112;y++);
  23. }
  24. //delay_1s
  25. void delays(uint time_1s)
  26. {
  27.    uint q,w;
  28.    for(q=0;q<time_1s;q++)
  29.      {
  30.       delayms(1000);
  31.       for(w=0;w<112;w++);
  32.      }
  33.          
  34. }
  35. //UART
  36. uchar rev_string[2];
  37. uchar code  ok[] = {0xaa,0x00};
  38. uchar code  ng[] = {0xaa,0x11};
  39. //UART Init
  40. void  UARTinit()
  41. {        
  42.     SM0=0;         //串行口工作方式1
  43.     SM1=1;        
  44.     TMOD=0x20;    //工作方式2
  45.     TH1=0xfd;  //9600波特率装初值
  46.     TL1=0xfd;
  47.     TR1=1;     //打开定时器1
  48. }
  49. // 中断
  50. void init()
  51. {
  52.   EA=1;       //打开总中断
  53.   EX0=1;      //打开中断1
  54. //  ES=1;       //串口使能
  55.    ET0=1;                                  //定时器T0中断允许
  56.    TMOD=0x01;                                              //使用定时器T0  (0000 0001)
  57.    TH0=(65535-50000)/256;    //将定时器计时时间设定为10000微秒=10毫秒   计算后得数 TH0=60;                        
  58.    TL0=(65535-50000)%256;                  // 计算后得数 TL0=175
  59. }
  60. // 发送
  61. void send_ok()
  62. {
  63.     REN=0;
  64.     for(k=0;k<2;k++)
  65.       {
  66.           SBUF=ok[k];         
  67.           while(!TI);
  68.           TI=0;
  69.       }
  70.    
  71. }
  72. void send_ng()
  73. {
  74.     REN=0;
  75.     for(l=0;l<2;l++)
  76.       {
  77.           SBUF=ng[l];         
  78.           while(!TI);
  79.           TI=0;
  80.       }
  81.    
  82. }
  83. //received
  84. void recv()
  85. {
  86.     REN=1;
  87.     for(h=0;h<2;h++)
  88.       {
  89.             delayms(200);  //辅助延时
  90.             while(!RI);
  91.             rev_string[h]=SBUF;
  92.             RI=0;
  93.       }
  94.     REN=0;   
  95. }
  96. //上电 确认程序
  97. void power_on()
  98. {
  99.       delayms(200);
  100.       P1=0xff;         //关闭所有P1口
  101.       for(t=0;t<4;t++)
  102.         {
  103.             delayms(500);
  104.             P1=P1<<1;

  105.         }
  106.       delayms(500);
  107.       P1=0xff;
  108. }
  109. //MAIN
  110. void main()
  111. {
  112.   power_on();
  113.   while(1)
  114.   {  
  115.       
  116.       switch (g)
  117.       {
  118.           case 0:
  119.            {
  120.                init();
  121.                a=0;
  122.                g++;
  123.            }break;
  124.           case 1:
  125.            {
  126.                UARTinit();
  127.                b=0;
  128.                g=22;
  129.                delayms(200);
  130.            }break;
  131.           case 22:
  132.             {
  133.                 recv();
  134.                 c=0;
  135.                if((rev_string[0]==0xaa)&&(rev_string[1]==0x00))
  136.                   {
  137.                       delayms(300);
  138.                       led_ok=0;
  139.                       send_ok();
  140.                      
  141.                       delays(5);
  142.                       led_ok=1;
  143.                       g=22;
  144.                   }
  145.                if((rev_string[0]==0xaa)&&(rev_string[1]==0x11))
  146.                   {
  147.                       delayms(300);
  148.                       led_ng=0;
  149.                       send_ng();
  150.                      
  151.                       delays(5);
  152.                       led_ng=1;
  153.                       g=22;
  154.                   }
  155.              }break;
  156.          }
  157.      }
  158. }
  159. //T0中断
  160. void T0_time() interrupt 1
  161. {
  162.     TH0=(65535-10000)/256;
  163.     TL0=(65535-10000)%256;
  164.     num++;
  165. }
  166. //中断
  167. void int0() interrupt 0
  168. {
  169.   if(stop==0)
  170.    {   
  171.        for(s=0;s<100;s++)
  172.        {
  173.            flag=1;
  174.            while(flag)
  175.            {
  176.            delayms(200);
  177.            i++;         
  178.            flag=0;   
  179.            }   
  180.             if(stop)
  181.               {
  182.                delayms(10);
  183.                break;             //跳出本层循环
  184.               }           
  185.        }
  186.        flag=0;
  187.       while(!stop);
  188.        if(i<=20)
  189.         {
  190.             
  191.             P2=0xff;
  192.             P1=0xff;
  193.             REN=0;   
  194.             i=0;
  195.             g=0;
  196.             ISP_CONTR=0x20;
  197.         }
  198.         if(i>=20)  //帮助模块
  199.          {  
  200.                 led_help=0;
  201.                 TI = 1;//发送请求标志位
  202.         printf("输入你想要的汉字。\n    ");  //方法2
  203.                 while(!TI);//判断是否发送完成  发送完成出循环
  204.                 TI = 0;   
  205.                
  206.    
  207.                 delayms(200);//延迟200ms
  208.                 led_help=1;
  209.                 i=0;
  210.                 flag=0;
  211.          }
  212.      }
  213.       
  214.       
  215. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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