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

標題: 單片機超聲波與上位機自定義協議串口通信 上位機與下位機代碼 [打印本頁]

作者: liuliuliu_    時間: 2020-5-6 11:39
標題: 單片機超聲波與上位機自定義協議串口通信 上位機與下位機代碼
本文主要是關于stc12c5a60s2單片與超聲波的下位機代碼與上位機vs2010的串口通信

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提供下載:
上位機與下位機代碼.zip (6.77 MB, 下載次數: 40)



作者: jyganjun1    時間: 2021-3-12 20:53
原理圖能不能上傳下




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产999在线观看 | 亚洲欧美国产视频 | 国产精品久久久久久久久图文区 | 先锋资源吧 | 国产综合区| 99视频免费看 | 91久久北条麻妃一区二区三区 | 国产一区二区在线免费观看 | 成人黄色在线 | 欧美日韩一区二区三区在线观看 | 亚洲精品1区2区3区 91免费看片 | 精品欧美一区二区三区久久久 | 亚洲精品在线免费观看视频 | www.9191.com | 欧美一级免费 | 成人激情视频在线 | 欧美在线观看一区 | 中文字幕成人在线 | 最新av在线播放 | 蜜桃av鲁一鲁一鲁一鲁 | 一区二区三区视频在线免费观看 | 国产wwwcom| 综合激情网 | 黄网站免费观看 | 欧美一级全黄 | 国产麻豆乱码精品一区二区三区 | 国产精品一区二区欧美 | 日韩欧美在线视频观看 | 蜜臀av日日欢夜夜爽一区 | 在线看av的网址 | 日韩精品欧美精品 | 中文字幕成人免费视频 | 久久99深爱久久99精品 | 成年人网站在线观看视频 | 一区二区在线 | 日本一区二区视频 | 欧美日韩在线视频一区 | 美女久久 | 久久国产精品免费视频 | 日韩精品免费在线观看 | 欧美日韩精品中文字幕 |