一个超声波测距的程序源码
更新时间:2023-11-14 13:12:01 阅读量:3 教育文库 文档下载
- stm32超声波测距程序推荐度:
- 相关推荐
一个超声波测距的程序源码
下面是一个超声波测距的程序,硬件电路由于电脑格盘已丢失,下面的代码是从样机上复制的。
硬件电路包括液晶显示、超声波的发射、超声波的接受、滤波、单片机处理。 液晶显示采用LCD1602模块,下面的代码里有液晶的驱动,可以拷贝用于它处。 超声波发射电路包括压电换能器及其支持电路,发射约44KHz的超声波。 超声波的接收电路包含一块CD40106处理芯片。
技术指标大约是测距范围在三米左右,测量精度约在厘米级别。大量用于倒车雷达的测距中。
#include
#define Busy 0x80 //用于检测LCM状态字中的Busy标识 #define LCM_Data P0 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long
extern void cs_t(void); extern void delay(uint);
void LCMInit(void);
void DisplayOneChar(uchar X, uchar Y, uchar DData); void DisplayListChar(uchar X, uchar Y, uchar *DData); void Delay5Ms(void); void Delay100Ms(void);
void WriteDataLCM(uchar WDLCM);
void WriteCommandLCM(uchar WCLCM,BuysC);
data float distant=0.0;
uchar ReadDataLCM(void); uchar ReadStatusLCM(void);
uchar cdle_net[] = {%uchar email[] = {%uchar cls[]={%uchar DIS[7]; data ulong time; float distant;
sbit LCM_RS=P1^1; //定义LCD引脚 sbit LCM_RW=P1^2; sbit LCM_E=P1^3; sbit P10=P1^0;
data uchar flag;
void zhuanhuan(float juli) {
unsigned long juli1; juli1=juli*100;
DIS[6]=juli1+0x30;
juli1=juli1/10;
DIS[5]=juli1+0x30; juli1=juli1/10; DIS[4]='.';
DIS[3]=juli1+0x30; juli1=juli1/10;
DIS[2]=juli1+0x30; juli1=juli1/10;
DIS[1]=juli1+0x30; DIS[0]=juli1/10+0x30; }
void main(void) {
Delay100Ms(); //启动等待,等LCM讲入工作状态 P10=1;
TMOD=0x01; //计数器0工作在方式1 TH0=0;
TL0=0; //计数值初始化 IT1=0; //低电平触发中断 EA=1; //开总中断
//IP=0x04; //设置外部中断1为高优先级中断 flag=0;
LCMInit(); //LCM初始化
while(1) {
cs_t();
Delay5Ms();
ET0=1; //打开计数器0中断 EX1=1; //打开外部中断1 TR0=1; while(!flag) {
DisplayListChar(0, 0, cdle_net); DisplayListChar(0, 1, email); }
if(flag==1) {
time=TH0;
time=(time<<8)|TL0; distant=time*1.72/100; zhuanhuan(distant);
if(DIS[0]=='0') DisplayOneChar(5,1,' '); else DisplayOneChar(5,1,DIS[0]);
if((DIS[0]=='0')&&(DIS[1]=='0')) DisplayOneChar(6,1,' '); else DisplayOneChar(6,1,DIS[1]);
if((DIS[0]=='0')&&(DIS[1]=='0')&&(DIS[2]=='0')) DisplayOneChar(7,1,' '); else DisplayOneChar(7,1,DIS[2]); DisplayOneChar(8,1,DIS[3]); DisplayOneChar(9,1,DIS[4]); DisplayOneChar(10,1,DIS[5]); DisplayOneChar(11,1,DIS[6]);
DisplayOneChar(12,1,'c'); DisplayOneChar(13,1,'m'); flag=0; } else {
DisplayListChar(5,1,\ flag=0; }
TH0=0; TL0=0;
Delay100Ms(); } }
void cs_r(void) interrupt 2 {
TR0=0; EX1=0; ET0=0; flag=1; }
void overtime(void) interrupt 1 {
EX1=0; TR0=0; ET0=0; flag=2; }
//写数据
void WriteDataLCM(uchar WDLCM) {
ReadStatusLCM(); //检测忙 LCM_Data=WDLCM; LCM_RS=1; LCM_RW=0;
LCM_E=0; //若晶振速度太高可以在这后加小的延时 LCM_E=0; //延时 LCM_E=1; }
//写指令
void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测 {
if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0;
LCM_E = 1; }
//读数据
uchar ReadDataLCM(void) {
LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1;
return(LCM_Data); }
//读状态
uchar ReadStatusLCM(void) {
LCM_Data=0xFF; LCM_RS=0; LCM_RW=1; LCM_E=0; LCM_E=0; LCM_E=1;
while(LCM_Data & Busy); //检测忙信号 return(LCM_Data); }
void LCMInit(void) //LCM初始化 {
LCM_Data=0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms();
WriteCommandLCM(0x38,0); Delay5Ms();
WriteCommandLCM(0x38,0); Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0F,1); // 显示开及光标设置 }
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData) {
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码
WriteCommandLCM(X, 1); //发命令字 WriteDataLCM(DData); //发数据 }
//按指定位置显示一串字符
void DisplayListChar(uchar X, uchar Y, uchar *DData) {
uchar ListLength;
ListLength = 0; Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出 {
if (X <= 0xF) //X坐标应小于0xF {
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; X++; } } }
//5ms延时
void Delay5Ms(void) {
uint TempCyc = 200; while(TempCyc--); }
//400ms延时
void Delay100Ms(void) {
uchar TempCycA = 1; uint TempCycB; while(TempCycA--) {
TempCycB=7269; while(TempCycB--); } }
正在阅读:
一个超声波测距的程序源码11-14
天津市新人教版数学2013高三单元测试题7《圆与方程》01-04
腾讯(技术和专业族)员工职业发展规划书05-13
青科大字167号 关于印发《青岛科技大学双学位、双专业教育管理办法(修订稿)》的通知12-02
广西2017年全区行政执法人员资格(续职)培训考试(单选、多选、05-17
6671--互联网金融及邮储银行内部风险管理--论文开题报告 - 修改303-30
超氧化物歧化酶活性的测定11-14
液晶材料的合成及其应用(华师版)06-16
家属取保候审申请书03-31
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 测距
- 程序源码
- 超声波
- 一个
- 碎石生产线建设项目可行性研究报告
- “弘扬锐气、攻坚克难”专项活动实施方案
- 精神文明市民应知应会
- 关于米东区卫生监督所进一步明确科室设置1
- 国外教师专业发展研究概述
- 学生突发疾病处置预案
- 公开合议庭意见的现实可能性
- 创设情境与小学英语对话教学案例
- 新人教版小学数学三年级上册教材分析
- 重庆模式研究 - 市场经济架构下的红色政权
- 美国西南航空公司的战略性人力资源管理
- 贵州省黔南布依族苗族自治州自治条例
- 超氧化物歧化酶活性的测定
- 抓牛主图通达信指标公式源码
- 城投集团党风廉政建设工作总结
- 3.开题报告
- 中国人失掉自信力了吗教案导学案(4)
- 国防知识竞赛部分参考答案 - 图文
- 医院临床医技科室综合目标管理考核办法
- VB程序设计期末题库