|
本文主要是關(guān)于stc12c5a60s2單片與超聲波的下位機(jī)代碼與上位機(jī)vs2010的串口通信
c#效果
圖片4.png (681.03 KB, 下載次數(shù): 68)
下載附件
c#效果
2020-5-6 11:34 上傳
電路原理圖如下:
圖片3.png (17.49 KB, 下載次數(shù): 65)
下載附件
電路圖
2020-5-6 11:34 上傳
整體設(shè)計(jì)與流程圖:
圖片1.png (23.58 KB, 下載次數(shù): 52)
下載附件
整體設(shè)計(jì)
2020-5-6 11:34 上傳
圖片2.png (38.07 KB, 下載次數(shù): 55)
下載附件
流程圖
2020-5-6 11:34 上傳
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define MYID 0x1f
- #define UPID 0X5f
- sfr AUXR=0x8e; //STC 應(yīng)用輔助寄存器
- sfr BRT=0x9c; //獨(dú)立波特率發(fā)生器寄存器,裝入重裝數(shù)
- unsigned char code ying_table[]=
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
- //共陰
- unsigned char showdata[4]={1,3,5,7};
- unsigned char bufsend[20]={0},sendlen;
- unsigned char bufrecv[20]={0},recvlen;
- sbit ASEG=P0^0;
- sbit BSEG=P0^1;
- sbit CSEG=P0^2;
- sbit DSEG=P0^3;
- // 超聲波應(yīng)用端口及變量
- sbit RX=P0^4; //Echo
- sbit TX=P0^5; //Trig
- sbit PWM=P2^4;//直流電機(jī)串口定義
- bit flag=0;
- //
- sbit LED1=P3^4;
- sbit SOUNDER1=P3^5;
- unsigned int t,temp=0;
- void seg4show(unsigned char i)
- {
- switch(i)
- {
- case 0:
- ASEG=0; BSEG=1;
- CSEG=1; DSEG=1; break;
- case 1:
- ASEG=1; BSEG=0;
- CSEG=1; DSEG=1; break;
- case 2:
- ASEG=1; BSEG=1;
- CSEG=0; DSEG=1; break;
- case 3:
- ASEG=1; BSEG=1;
- CSEG=1; DSEG=0; break;
- default:
- ASEG=1; BSEG=1;
- CSEG=1; DSEG=1; break;
- }
- if(i==0)
- {
- if(showdata[i]==0)
- P1=0;
- }
- else if(i==1)
- P1=ying_table[showdata[i]]|0x80;
- else
- P1=ying_table[showdata[i]];
- }
- //----------------------------------------------
- //STC 獨(dú)立波特率發(fā)生器 9600bps@11.0592MHz
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON&=0x7F; //波特率不倍速
- SCON=0x50; //8 位數(shù)據(jù),可變波特率
- AUXR&=0xFB; //獨(dú)立波特率發(fā)生器時(shí)鐘為 Fosc/12,即 12T
- BRT=0xFD; //設(shè)定獨(dú)立波特率發(fā)生器重裝值
- AUXR|=0x01; //串口 1 選擇獨(dú)立波特率發(fā)生器為波特率發(fā)生器
- AUXR|=0x10; //啟動(dòng)獨(dú)立波特率發(fā)生器
- }
- //----------------------------------------------
- void Timer0Init(void) //200 微秒@11.0592MHz
- {
- AUXR&=0x7F; //定時(shí)器時(shí)鐘 12T 模式
- TMOD&=0xF0; //設(shè)置定時(shí)器模式
- TMOD|=0x02; //設(shè)置定時(shí)器模式
- TL0=0x48; //設(shè)置定時(shí)初值
- TH0=0x48; //設(shè)置定時(shí)重載值
- TF0=0; //清除 TF0 標(biāo)志
- TR0=1; //定時(shí)器 0 開始計(jì)時(shí)
- }
- //----------------------------------------------
- void Timer1Init(void)
- {
- AUXR&=0xBF; //定時(shí)器時(shí)鐘 12T 模式
- TMOD&=0x0F; //設(shè)置定時(shí)器模式
- TMOD|=0x10; //設(shè)置定時(shí)器模式
- TL1=0x0; //設(shè)置定時(shí)初值
- TH1=0x0; //設(shè)置定時(shí)重載值
- TF1=0; //清除 TF1 標(biāo)志
- TR1=1; //定時(shí)器 1 開始計(jì)時(shí)
- }
- //----------------------------------------------
- void DataSend(unsigned char ss[],unsigned char len)
- {
- unsigned char i;
- for(i=0;i<len;i++)
- {
- SBUF=ss[i];
- while(TI==0);
- TI=0;
- }
- }
- //超聲波距離計(jì)算
- unsigned int Conut(void)
- {
- unsigned int time,kk;
- time=TH1*256+TL1;
- TH1=0;
- TL1=0;
- kk=(unsigned int)((time*1.87)/100); //算出來是 CM
- return kk;
- }
- //----------------------------------------------
- void zd1() interrupt 3 //T1 中斷用來計(jì)數(shù)器溢出,超過測(cè)距范圍
- {
- flag=1; //中斷溢出標(biāo)志
- }
- //----------------------------------------------
- void StartModule() //啟動(dòng)超聲波模塊
- {
- unsigned char i;
- TX=1;
- _nop_(); //20us 延時(shí)
- i = 52;
- while (--i);
- TX=0;
- }
- //----------------------------------------------
- //超聲波讀取數(shù)據(jù)
- unsigned int ReadChaoshengbo()
- {
- unsigned int len;
- StartModule();
- while(!RX); //當(dāng) RX 為零時(shí)等待
- TR1=1; //開啟計(jì)數(shù)
- while(RX); //當(dāng) RX 為 1 計(jì)數(shù)并等待
- TR1=0; //關(guān)閉計(jì)數(shù)
- len=Conut(); //計(jì)算
- return len;
- }
- //----------------------------------------------
- //協(xié)議生成模塊
- unsigned char DataSendPreprocess(unsigned int x)
- {
- unsigned char i,t=0;
- bufsend[0]=0x7f; //起始字節(jié)
- bufsend[1]=UPID; //接受者地址
- bufsend[2]=MYID; //發(fā)送者地址
- bufsend[3]=3; //數(shù)據(jù)長(zhǎng)度
- bufsend[4]=0x14; //傳感器類型 0x14--->HC-SR04 超聲波測(cè)距
- bufsend[5]=x/256; //數(shù)據(jù)高字節(jié)
- bufsend[6]=x%256; //數(shù)據(jù)低字節(jié)
- for(i=1;i<=6;i++) //異或校驗(yàn)碼生成
- t^=bufsend[i];
- bufsend[7]=t; //校驗(yàn)字節(jié)
- bufsend[8]=0xff; //結(jié)束字節(jié)
- return 9;
- }
- void DataRecvAnalysis(unsigned char len) //
- {
- unsigned char i,t=0;
- for(i=1;i<len-2;i++)
- t^=bufrecv[i];
- if(t==bufrecv[len-2])
- {
- switch(bufrecv[4])
- {
- case 0x01:
- if(bufrecv[5]==0x01)
- {
- LED1=0; //亮
- }
- else if(bufrecv[5]==0x02)
- {
- LED1=1;
- }
- break;
- case 0x02:
- if(bufrecv[5]==0x01)
- {
- SOUNDER1=0; //響
- }
- else if(bufrecv[5]==0x02)
- {
- SOUNDER1=1;
- }
- break;
- case 0x05:
- if(bufrecv[5]==0x01)
- {
- PWM=1; //不轉(zhuǎn)
- }
- else if(bufrecv[5]==0x02)
- {
- PWM=0; //轉(zhuǎn)
- }
- break;
- case 0x03:
- if(bufrecv[5]==0x01)
- DataSend(bufsend,sendlen);
- else if(bufrecv[5]==0x02);
- break;
- }
- }
- }
- //----------------------------------------------
- void DataShowPreprocess(unsigned int t)
- {
- showdata[0]=t%10000/1000;
- showdata[1]=t%1000/100;
- showdata[2]=t%100/10;
- showdata[3]=t%10;
- }
- //----------------------------------------------
- //----------------------------------------------
- void main()
- {
- recvlen=0;
- Timer0Init();
- Timer1Init();
- UartInit();
- ET0=1;
- TI=0;
- RI=0;
- ES=1;
- EA=1;
- while(1)
- {
- if(t==10000)
- {
- ET0=0;
- t=0;
- temp=ReadChaoshengbo();
- DataShowPreprocess(temp);
- sendlen=DataSendPreprocess(temp);
- SBUF=bufsend[0];
- ET0=1;
- }
- if(recvlen!=0)
- {
- DataRecvAnalysis(recvlen);
- recvlen=0;
-
- }
- }
- }
- //----------------------------------------------
- void T0_ISR() interrupt 1 using 1
- {
- seg4show(t%100/5);
- t++;
- }
- //----------------------------------------------
- void SCOMM_ISR() interrupt 4 using 2
- {
- unsigned char i,j;
- if(TI==1)
- {
- TI=0;
- ES=0;
- for(i=1;i<sendlen;i++)
- {
- SBUF=bufsend[i];
- while(TI==0);
- TI=0;
- }
- ES=1;
- }
- if(RI==1)
- {
- ES=0;
- bufrecv[0]=SBUF;
- RI=0;
- if(bufrecv[0]==0x7f) //協(xié)議分析第一部分開始
- {
- while(RI==0);
- bufrecv[1]=SBUF;
- RI=0;
- if(bufrecv[1]==MYID)
- {
- while(RI==0);
- bufrecv[2]=SBUF;
- RI=0;
- if(bufrecv[2]==UPID)
- {
- for(j=3;j<20;j++)
- {
- while(RI==0);
- bufrecv[j]=SBUF;
- RI=0;
- if(bufrecv[j]==0xff)
- break;
- }
- if(j<20)
- {
- if(j==bufrecv[3]+5)
- recvlen=j+1;
- }
- }
- }
- } //協(xié)議分析第一部分結(jié)束
- ES=1;
- }
- }
復(fù)制代碼
51hei.png (3.04 KB, 下載次數(shù): 79)
下載附件
2020-5-6 14:21 上傳
所有資料51hei提供下載:
上位機(jī)與下位機(jī)代碼.zip
(6.77 MB, 下載次數(shù): 40)
2020-5-6 11:37 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|