本文主要是关于stc12c5a60s2单片与超声波的下位机代码与上位机vs2010的串口通信
c#效果
c#效果
电路原理图如下:
电路图
整体设计与流程图:
整体设计
流程图
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define MYID 0x1f
- #define UPID 0X5f
- sfr AUXR=0x8e; //STC 应用辅助寄存器
- sfr BRT=0x9c; //独立波特率发生器寄存器,装入重装数
- 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;
- // 超声波应用端口及变量
- sbit RX=P0^4; //Echo
- sbit TX=P0^5; //Trig
- sbit PWM=P2^4;//直流电机串口定义
- 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 独立波特率发生器 9600bps@11.0592MHz
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON&=0x7F; //波特率不倍速
- SCON=0x50; //8 位数据,可变波特率
- AUXR&=0xFB; //独立波特率发生器时钟为 Fosc/12,即 12T
- BRT=0xFD; //设定独立波特率发生器重装值
- AUXR|=0x01; //串口 1 选择独立波特率发生器为波特率发生器
- AUXR|=0x10; //启动独立波特率发生器
- }
- //----------------------------------------------
- void Timer0Init(void) //200 微秒@11.0592MHz
- {
- AUXR&=0x7F; //定时器时钟 12T 模式
- TMOD&=0xF0; //设置定时器模式
- TMOD|=0x02; //设置定时器模式
- TL0=0x48; //设置定时初值
- TH0=0x48; //设置定时重载值
- TF0=0; //清除 TF0 标志
- TR0=1; //定时器 0 开始计时
- }
- //----------------------------------------------
- void Timer1Init(void)
- {
- AUXR&=0xBF; //定时器时钟 12T 模式
- TMOD&=0x0F; //设置定时器模式
- TMOD|=0x10; //设置定时器模式
- TL1=0x0; //设置定时初值
- TH1=0x0; //设置定时重载值
- TF1=0; //清除 TF1 标志
- TR1=1; //定时器 1 开始计时
- }
- //----------------------------------------------
- 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;
- }
- }
- //超声波距离计算
- 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 中断用来计数器溢出,超过测距范围
- {
- flag=1; //中断溢出标志
- }
- //----------------------------------------------
- void StartModule() //启动超声波模块
- {
- unsigned char i;
- TX=1;
- _nop_(); //20us 延时
- i = 52;
- while (--i);
- TX=0;
- }
- //----------------------------------------------
- //超声波读取数据
- unsigned int ReadChaoshengbo()
- {
- unsigned int len;
- StartModule();
- while(!RX); //当 RX 为零时等待
- TR1=1; //开启计数
- while(RX); //当 RX 为 1 计数并等待
- TR1=0; //关闭计数
- len=Conut(); //计算
- return len;
- }
- //----------------------------------------------
- //协议生成模块
- unsigned char DataSendPreprocess(unsigned int x)
- {
- unsigned char i,t=0;
- bufsend[0]=0x7f; //起始字节
- bufsend[1]=UPID; //接受者地址
- bufsend[2]=MYID; //发送者地址
- bufsend[3]=3; //数据长度
- bufsend[4]=0x14; //传感器类型 0x14--->HC-SR04 超声波测距
- bufsend[5]=x/256; //数据高字节
- bufsend[6]=x%256; //数据低字节
- for(i=1;i<=6;i++) //异或校验码生成
- t^=bufsend[i];
- bufsend[7]=t; //校验字节
- bufsend[8]=0xff; //结束字节
- 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; //不转
- }
- else if(bufrecv[5]==0x02)
- {
- PWM=0; //转
- }
- 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) //协议分析第一部分开始
- {
- 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;
- }
- }
- }
- } //协议分析第一部分结束
- ES=1;
- }
- }
复制代码
所有资料51hei提供下载:
上位机与下位机代码.zip
(6.77 MB, 下载次数: 37)
|