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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3598|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)超聲波與上位機(jī)自定義協(xié)議串口通信 上位機(jī)與下位機(jī)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本文主要是關(guān)于stc12c5a60s2單片與超聲波的下位機(jī)代碼與上位機(jī)vs2010的串口通信

c#效果


電路原理圖如下:


整體設(shè)計(jì)與流程圖:


單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. #define MYID 0x1f
  4. #define UPID 0X5f
  5. sfr AUXR=0x8e; //STC 應(yīng)用輔助寄存器
  6. sfr BRT=0x9c; //獨(dú)立波特率發(fā)生器寄存器,裝入重裝數(shù)
  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. // 超聲波應(yīng)用端口及變量
  19. sbit RX=P0^4; //Echo
  20. sbit TX=P0^5; //Trig
  21. sbit PWM=P2^4;//直流電機(jī)串口定義

  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 獨(dú)立波特率發(fā)生器 9600bps@11.0592MHz
  59. void UartInit(void) //9600bps@11.0592MHz
  60. {
  61.         PCON&=0x7F; //波特率不倍速
  62.         SCON=0x50; //8 位數(shù)據(jù),可變波特率
  63.         AUXR&=0xFB; //獨(dú)立波特率發(fā)生器時(shí)鐘為 Fosc/12,即 12T
  64.         BRT=0xFD; //設(shè)定獨(dú)立波特率發(fā)生器重裝值
  65.         AUXR|=0x01; //串口 1 選擇獨(dú)立波特率發(fā)生器為波特率發(fā)生器
  66.         AUXR|=0x10; //啟動(dòng)獨(dú)立波特率發(fā)生器
  67. }

  68. //----------------------------------------------
  69. void Timer0Init(void) //200 微秒@11.0592MHz
  70. {
  71.         AUXR&=0x7F; //定時(shí)器時(shí)鐘 12T 模式
  72.         TMOD&=0xF0; //設(shè)置定時(shí)器模式
  73.         TMOD|=0x02; //設(shè)置定時(shí)器模式
  74.         TL0=0x48; //設(shè)置定時(shí)初值
  75.         TH0=0x48; //設(shè)置定時(shí)重載值
  76.         TF0=0; //清除 TF0 標(biāo)志
  77.         TR0=1; //定時(shí)器 0 開始計(jì)時(shí)
  78. }
  79. //----------------------------------------------
  80. void Timer1Init(void)
  81. {
  82.         AUXR&=0xBF; //定時(shí)器時(shí)鐘 12T 模式
  83.         TMOD&=0x0F; //設(shè)置定時(shí)器模式
  84.         TMOD|=0x10; //設(shè)置定時(shí)器模式
  85.         TL1=0x0; //設(shè)置定時(shí)初值
  86.         TH1=0x0; //設(shè)置定時(shí)重載值
  87.         TF1=0; //清除 TF1 標(biāo)志
  88.         TR1=1; //定時(shí)器 1 開始計(jì)時(shí)
  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. //超聲波距離計(jì)算
  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 中斷用來計(jì)數(shù)器溢出,超過測(cè)距范圍
  113. {
  114.         flag=1; //中斷溢出標(biāo)志
  115. }
  116. //----------------------------------------------
  117. void StartModule() //啟動(dòng)超聲波模塊
  118. {
  119.         unsigned char i;
  120.         TX=1;
  121.         _nop_(); //20us 延時(shí)
  122.         i = 52;
  123.         while (--i);
  124.         TX=0;
  125. }
  126. //----------------------------------------------
  127. //超聲波讀取數(shù)據(jù)
  128. unsigned int ReadChaoshengbo()
  129. {
  130.         unsigned int len;
  131.         StartModule();
  132.         while(!RX); //當(dāng) RX 為零時(shí)等待
  133.         TR1=1; //開啟計(jì)數(shù)
  134.         while(RX); //當(dāng) RX 為 1 計(jì)數(shù)并等待
  135.         TR1=0; //關(guān)閉計(jì)數(shù)
  136.         len=Conut(); //計(jì)算
  137.         return len;
  138. }
  139. //----------------------------------------------
  140. //協(xié)議生成模塊
  141. unsigned char DataSendPreprocess(unsigned int x)
  142. {
  143.         unsigned char i,t=0;
  144.         bufsend[0]=0x7f; //起始字節(jié)
  145.         bufsend[1]=UPID; //接受者地址
  146.         bufsend[2]=MYID; //發(fā)送者地址
  147.         bufsend[3]=3; //數(shù)據(jù)長(zhǎng)度
  148.         bufsend[4]=0x14; //傳感器類型 0x14--->HC-SR04 超聲波測(cè)距
  149.         bufsend[5]=x/256; //數(shù)據(jù)高字節(jié)
  150.         bufsend[6]=x%256; //數(shù)據(jù)低字節(jié)
  151.         for(i=1;i<=6;i++) //異或校驗(yàn)碼生成
  152.                 t^=bufsend[i];
  153.         bufsend[7]=t; //校驗(yàn)字節(jié)
  154.         bufsend[8]=0xff; //結(jié)束字節(jié)
  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;          //不轉(zhuǎn)
  190.                              }
  191.                                 else if(bufrecv[5]==0x02)
  192.                                 {
  193.                                     PWM=0;        //轉(zhuǎn)
  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) //協(xié)議分析第一部分開始
  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.                 } //協(xié)議分析第一部分結(jié)束
  300.                 ES=1;
  301.         }
  302. }
復(fù)制代碼

所有資料51hei提供下載:
上位機(jī)與下位機(jī)代碼.zip (6.77 MB, 下載次數(shù): 40)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:891272 發(fā)表于 2021-3-12 20:53 | 只看該作者
原理圖能不能上傳下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区| 国产美女精品视频 | 日本久久一区二区三区 | 日韩精品三区 | 久久久免费观看视频 | 在线观看免费av网站 | 国产高清性xxxxxxxx | 综合在线视频 | 一级高清免费毛片 | 亚洲成av人片在线观看无码 | 青青草在线视频免费观看 | 中文字幕一区二区三区日韩精品 | 99re在线播放 | jizz视频 | 日本精品一区二区三区在线观看视频 | 91精品国产一区二区三区 | 午夜在线 | 久久爆操 | 精品国产欧美一区二区 | 久久久青草婷婷精品综合日韩 | av激情在线 | 亚洲精品日日夜夜 | 亚洲成人免费视频 | 久久久综合色 | 国产精品久久一区二区三区 | 国产精品欧美一区二区三区不卡 | 成人二区 | 视频二区在线观看 | 亚洲免费一区二区 | 99免费| 国产一区二区三区 | 中文字幕亚洲无线 | 欧美一级在线 | 黄色大全免费看 | 夜夜骑首页| 国产成人久久精品一区二区三区 | 超碰免费在线 | 免费在线成人网 | 亚洲精品99| 久久久久亚洲视频 | 狠狠的操|