标题:
用vb上位机控制单片机测距的设计
[打印本页]
作者:
大青衣
时间:
2018-12-30 15:56
标题:
用vb上位机控制单片机测距的设计
上午是我第一次发帖,,竟然通过了而且还奖励了88币,啧啧太美了,迫不及待的再发一个!如题也是上位机控制的单片机,不过这次高级一点:测距。
vb上位机的运行界面:
捕获.PNG
(26.65 KB, 下载次数: 65)
下载附件
2018-12-30 15:54 上传
也是用vb编写的。
捕获2.PNG
(9.15 KB, 下载次数: 60)
下载附件
2018-12-30 15:54 上传
单片机源程序:
/*****************************************
* 项目: 单片VB上位机视频教程 *
* 单片机: STC89C52 *
* 晶振: 11.0592M *
* 开发: E动力电子工作室 *
* 作者: LinHill *
* 邮箱: power_e@126.com *
******************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Echo = P2^0; // 接Echo端
sbit Trig = P2^1; // 接Trig端
bit flag =0; // 定时器0是否溢出的标志,1表示溢出
bit enable=0; // 用于判断是否允许测量,1表示允许
/***********************************
函数:void InitUart()
----------------------
说明:对串口进行初始化
参数:无
返回值:无
***********************************/
void InitUart()
{
TMOD = 0x21; // 高4位(定时器1)用于串口,低4位(定时器0)用于超声波计时
SCON = 0x50;
TH1 = 0xFD; // 波特率 9600
TL1 = 0xFD;
ES = 1; // 允许串口中断
ET0 = 1; // 允许定时器0中断
TR1 = 1; // 开启定时器1
EA = 1; // 开启总中断
}
/***********************************
函数:void DelayMs(uint ms)
----------------------
说明:毫秒级程序延时
参数:ms代表要延时的毫秒数
返回值:无
***********************************/
void DelayMs(uint ms)
{
uint x,y;
for(x=ms;x>0;x--)
for(y=110;y>0;y--);
}
/***********************************
函数:void StartModule()
---------------------------
说明:启动超声波模块
参数:无
返回值:无
***********************************/
void StartModule()
{
Trig=1;
DelayMs(1);
Trig=0;
}
/***********************************
函数:uint Conut(void)
------------------------
说明:计算测到的距离
参数:无
返回值:测得的距离
***********************************/
uint Conut(void)
{
uint time; // 用于记录测得的时间
uint ss; // 用于记录测得的距离
time = (TH0*256+TL0)*1.09; // 总时间
TH0=0;
TL0=0;
if(flag==1) // 如果超出测量距离,则不传输数据
{
flag=0;
ss=0;
}
else
{
ss=time*1.7/100; // 空气中声音的速度是340m/s
}
return ss;
}
/***********************************
函数:void send(uint dat)
---------------------------
说明:将测得的距离通过串口发送出去
参数:dat是测得的距离
返回值:无
***********************************/
void Send(uint dat)
{
SBUF=(dat/100)+ 48; // 发送 百 位
while(!TI);
TI=0;
SBUF=(dat%100/10)+48; // 发送 十 位
while(!TI);
TI=0;
SBUF=(dat%10)+48; // 发送 个 位
while(!TI);
TI=0;
}
/***********************************
函数:void main(void)
----------------------
说明:主函数
参数:无
返回值:无
***********************************/
void main(void)
{
uint ss; // 记录测量到的距离
InitUart();
while(1)
{
if(enable==1)
{
StartModule();
while(!Echo); // 当RX为零时等待
TR0=1; // 开启计数
while(Echo); // 当RX为1计数并等待
TR0=0; // 关闭计数
ss=Conut(); // 计算
Send(ss); // 将计算的值通过串口发送出去
DelayMs(800);
}
}
}
/***********************************
函数:void Inter() interrupt 4
------------------------------
说明:串口中断处理
参数:无
返回值:无
***********************************/
void Inter() interrupt 4
{
if(RI==1)
{
RI=0;
if(SBUF == 0x01)
{
enable = 1;
}
if(SBUF == 0x02)
{
enable = 0;
}
}
}
/***********************************
函数:void zd0() interrupt 1
------------------------------
说明:T0中断用来计数器溢出,超过测距范围则置flag为1
参数:无
返回值:无
***********************************/
void zd0() interrupt 1
{
flag=1;
}
复制代码
所有资料51hei提供下载:
新建文件夹.zip
(44.63 KB, 下载次数: 50)
2018-12-30 15:55 上传
点击文件名下载附件
下载积分: 黑币 -5
源码都在一起。
作者:
admin
时间:
2019-1-6 16:00
好资料,51黑有你更精彩
作者:
帅鹏
时间:
2019-1-9 20:22
好资料,51有你更精彩
作者:
ys519277123
时间:
2019-1-14 11:18
好资料,51有你更精彩
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1