找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2993|回复: 1
收起左侧

单片机超声波与上位机自定义协议串口通信 上位机与下位机代码

[复制链接]
ID:745135 发表于 2020-5-6 11:39 | 显示全部楼层 |阅读模式
本文主要是关于stc12c5a60s2单片与超声波的下位机代码与上位机vs2010的串口通信

c#效果

c#效果

c#效果


电路原理图如下:

电路图

电路图


整体设计与流程图:

整体设计

整体设计

流程图

流程图


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. #define MYID 0x1f
  4. #define UPID 0X5f
  5. sfr AUXR=0x8e; //STC 应用辅助寄存器
  6. sfr BRT=0x9c; //独立波特率发生器寄存器,装入重装数
  7. unsigned char code ying_table[]=
  8. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
  10. //共阴
  11. unsigned char showdata[4]={1,3,5,7};
  12. unsigned char bufsend[20]={0},sendlen;
  13. unsigned char bufrecv[20]={0},recvlen;

  14. sbit ASEG=P0^0;
  15. sbit BSEG=P0^1;
  16. sbit CSEG=P0^2;
  17. sbit DSEG=P0^3;
  18. // 超声波应用端口及变量
  19. sbit RX=P0^4; //Echo
  20. sbit TX=P0^5; //Trig
  21. sbit PWM=P2^4;//直流电机串口定义

  22. bit flag=0;
  23. //
  24. sbit LED1=P3^4;
  25. sbit SOUNDER1=P3^5;                                 
  26. unsigned int t,temp=0;

  27. void seg4show(unsigned char i)
  28. {
  29.         switch(i)
  30.         {
  31.                 case 0:
  32.                         ASEG=0; BSEG=1;
  33.                         CSEG=1; DSEG=1; break;
  34.                 case 1:
  35.                         ASEG=1; BSEG=0;
  36.                         CSEG=1; DSEG=1; break;
  37.                 case 2:
  38.                         ASEG=1; BSEG=1;
  39.                         CSEG=0; DSEG=1; break;
  40.                 case 3:
  41.                         ASEG=1; BSEG=1;
  42.                         CSEG=1; DSEG=0; break;
  43.                 default:
  44.                         ASEG=1; BSEG=1;
  45.                         CSEG=1; DSEG=1; break;
  46.         }
  47.         if(i==0)
  48.         {
  49.                 if(showdata[i]==0)
  50.                 P1=0;
  51.         }
  52.         else if(i==1)
  53.                 P1=ying_table[showdata[i]]|0x80;
  54.         else
  55.                 P1=ying_table[showdata[i]];
  56. }
  57. //----------------------------------------------
  58. //STC 独立波特率发生器 9600bps@11.0592MHz
  59. void UartInit(void) //9600bps@11.0592MHz
  60. {
  61.         PCON&=0x7F; //波特率不倍速
  62.         SCON=0x50; //8 位数据,可变波特率
  63.         AUXR&=0xFB; //独立波特率发生器时钟为 Fosc/12,即 12T
  64.         BRT=0xFD; //设定独立波特率发生器重装值
  65.         AUXR|=0x01; //串口 1 选择独立波特率发生器为波特率发生器
  66.         AUXR|=0x10; //启动独立波特率发生器
  67. }

  68. //----------------------------------------------
  69. void Timer0Init(void) //200 微秒@11.0592MHz
  70. {
  71.         AUXR&=0x7F; //定时器时钟 12T 模式
  72.         TMOD&=0xF0; //设置定时器模式
  73.         TMOD|=0x02; //设置定时器模式
  74.         TL0=0x48; //设置定时初值
  75.         TH0=0x48; //设置定时重载值
  76.         TF0=0; //清除 TF0 标志
  77.         TR0=1; //定时器 0 开始计时
  78. }
  79. //----------------------------------------------
  80. void Timer1Init(void)
  81. {
  82.         AUXR&=0xBF; //定时器时钟 12T 模式
  83.         TMOD&=0x0F; //设置定时器模式
  84.         TMOD|=0x10; //设置定时器模式
  85.         TL1=0x0; //设置定时初值
  86.         TH1=0x0; //设置定时重载值
  87.         TF1=0; //清除 TF1 标志
  88.         TR1=1; //定时器 1 开始计时
  89. }
  90. //----------------------------------------------
  91. void DataSend(unsigned char ss[],unsigned char len)
  92. {
  93.         unsigned char i;
  94.         for(i=0;i<len;i++)
  95.         {
  96.                 SBUF=ss[i];
  97.                 while(TI==0);
  98.                         TI=0;
  99.         }
  100. }
  101. //超声波距离计算
  102. unsigned int Conut(void)
  103. {
  104.         unsigned int time,kk;
  105.         time=TH1*256+TL1;
  106.         TH1=0;
  107.         TL1=0;
  108.         kk=(unsigned int)((time*1.87)/100); //算出来是 CM
  109.         return kk;
  110. }
  111. //----------------------------------------------
  112. void zd1() interrupt 3 //T1 中断用来计数器溢出,超过测距范围
  113. {
  114.         flag=1; //中断溢出标志
  115. }
  116. //----------------------------------------------
  117. void StartModule() //启动超声波模块
  118. {
  119.         unsigned char i;
  120.         TX=1;
  121.         _nop_(); //20us 延时
  122.         i = 52;
  123.         while (--i);
  124.         TX=0;
  125. }
  126. //----------------------------------------------
  127. //超声波读取数据
  128. unsigned int ReadChaoshengbo()
  129. {
  130.         unsigned int len;
  131.         StartModule();
  132.         while(!RX); //当 RX 为零时等待
  133.         TR1=1; //开启计数
  134.         while(RX); //当 RX 为 1 计数并等待
  135.         TR1=0; //关闭计数
  136.         len=Conut(); //计算
  137.         return len;
  138. }
  139. //----------------------------------------------
  140. //协议生成模块
  141. unsigned char DataSendPreprocess(unsigned int x)
  142. {
  143.         unsigned char i,t=0;
  144.         bufsend[0]=0x7f; //起始字节
  145.         bufsend[1]=UPID; //接受者地址
  146.         bufsend[2]=MYID; //发送者地址
  147.         bufsend[3]=3; //数据长度
  148.         bufsend[4]=0x14; //传感器类型 0x14--->HC-SR04 超声波测距
  149.         bufsend[5]=x/256; //数据高字节
  150.         bufsend[6]=x%256; //数据低字节
  151.         for(i=1;i<=6;i++) //异或校验码生成
  152.                 t^=bufsend[i];
  153.         bufsend[7]=t; //校验字节
  154.         bufsend[8]=0xff; //结束字节
  155.         return 9;
  156. }

  157. void DataRecvAnalysis(unsigned char len)         //
  158. {
  159.         unsigned char i,t=0;

  160.         for(i=1;i<len-2;i++)
  161.                 t^=bufrecv[i];
  162.         if(t==bufrecv[len-2])
  163.         {               
  164.                 switch(bufrecv[4])
  165.                 {
  166.                         case 0x01:
  167.                                 if(bufrecv[5]==0x01)
  168.                                 {
  169.                                         LED1=0;           //亮
  170.                                 }
  171.                                 else if(bufrecv[5]==0x02)
  172.                                 {
  173.                                         LED1=1;         
  174.                                 }
  175.                                 break;
  176.                         case 0x02:
  177.                              if(bufrecv[5]==0x01)
  178.                          {
  179.                                         SOUNDER1=0;                 //响
  180.                                  }
  181.                                 else if(bufrecv[5]==0x02)
  182.                                 {
  183.                                          SOUNDER1=1;
  184.                                 }
  185.                                 break;        
  186.                         case 0x05:
  187.                              if(bufrecv[5]==0x01)
  188.                          {
  189.                                         PWM=1;          //不转
  190.                              }
  191.                                 else if(bufrecv[5]==0x02)
  192.                                 {
  193.                                     PWM=0;        //转
  194.                                 }
  195.                                 break;
  196.                     case 0x03:
  197.                              if(bufrecv[5]==0x01)
  198.                                                   DataSend(bufsend,sendlen);
  199.                                  else if(bufrecv[5]==0x02);
  200.                                  break;                                   
  201.                    }
  202.         }
  203. }


  204. //----------------------------------------------
  205. void DataShowPreprocess(unsigned int t)
  206. {
  207.         showdata[0]=t%10000/1000;
  208.         showdata[1]=t%1000/100;
  209.         showdata[2]=t%100/10;
  210.         showdata[3]=t%10;
  211. }
  212. //----------------------------------------------
  213. //----------------------------------------------
  214. void main()
  215. {
  216.         recvlen=0;
  217.         Timer0Init();
  218.         Timer1Init();
  219.         UartInit();
  220.         ET0=1;
  221.         TI=0;
  222.         RI=0;
  223.         ES=1;
  224.         EA=1;
  225.         while(1)
  226.         {
  227.                 if(t==10000)
  228.                 {
  229.                         ET0=0;
  230.                         t=0;
  231.                         temp=ReadChaoshengbo();
  232.                         DataShowPreprocess(temp);
  233.                         sendlen=DataSendPreprocess(temp);
  234.                         SBUF=bufsend[0];
  235.                         ET0=1;
  236.                 }
  237.                 if(recvlen!=0)
  238.                 {
  239.                         DataRecvAnalysis(recvlen);
  240.                         recvlen=0;
  241.                
  242.                 }
  243.         }
  244. }
  245. //----------------------------------------------
  246. void T0_ISR() interrupt 1 using 1
  247. {
  248.         seg4show(t%100/5);
  249.         t++;
  250. }
  251. //----------------------------------------------
  252. void SCOMM_ISR() interrupt 4 using 2
  253. {
  254.         unsigned char i,j;
  255.         if(TI==1)
  256.         {
  257.                 TI=0;
  258.                 ES=0;
  259.                 for(i=1;i<sendlen;i++)
  260.                 {
  261.                         SBUF=bufsend[i];
  262.                         while(TI==0);
  263.                         TI=0;
  264.                 }
  265.                 ES=1;
  266.         }
  267.         if(RI==1)
  268.         {
  269.                 ES=0;
  270.                 bufrecv[0]=SBUF;
  271.                 RI=0;
  272.                 if(bufrecv[0]==0x7f) //协议分析第一部分开始
  273.                 {
  274.                         while(RI==0);
  275.                         bufrecv[1]=SBUF;
  276.                         RI=0;
  277.                         if(bufrecv[1]==MYID)
  278.                         {
  279.                                 while(RI==0);
  280.                                 bufrecv[2]=SBUF;
  281.                                 RI=0;
  282.                                 if(bufrecv[2]==UPID)
  283.                                 {
  284.                                         for(j=3;j<20;j++)
  285.                                         {
  286.                                                 while(RI==0);
  287.                                                 bufrecv[j]=SBUF;
  288.                                                 RI=0;
  289.                                                 if(bufrecv[j]==0xff)
  290.                                                         break;
  291.                                         }
  292.                                         if(j<20)
  293.                                         {
  294.                                                 if(j==bufrecv[3]+5)
  295.                                                         recvlen=j+1;
  296.                                         }
  297.                                 }
  298.                         }
  299.                 } //协议分析第一部分结束
  300.                 ES=1;
  301.         }
  302. }
复制代码
51hei.png
所有资料51hei提供下载:
上位机与下位机代码.zip (6.77 MB, 下载次数: 37)

评分

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

查看全部评分

回复

使用道具 举报

ID:891272 发表于 2021-3-12 20:53 | 显示全部楼层
原理图能不能上传下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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