单片机测量脉宽c语言程序,51单片机hc-sr04超声波测距(脉宽测量)DEMO程序
/***********************************************************************************************************/
//hc-sr04 超声波测距模块DEMO程序
//晶振:11。0592
//接线:模块TRIG接 P0.2 ECH0 接P0.1
//数码管:共阳数码管P1接数据口,P2.5 P2.4 P2.3接选通数码管
/***********************************************************************************************************/
#include //器件配置文件
#include
#define uchar unsigned char
#define uint unsigned int
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0,S1,S2;
bit flag =0;
sbit TX123=P3^4; //T
sbit RX123=P3^5; //E
sbit KJA=P3^6; //近距离存储按钮
sbit KJAN=P3^7; //远距离存储按钮
sbit S1J=P3^3; //近距离动作继电器
sbit S2J=P3^2; //远距离动作继电器
unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={ 0xdf,0xef,0xf7};
unsigned char disbuff[4]={ 0,0,0,0,};
/******************定义命令字节******************/
#define Read_COM 0x01 //字节读数据命令
#define Prog_COM 0x02 //字节编程数据命令
#define Erase_COM 0x03 //扇区擦除数据命令
#define En_Wait_TIME 0x81 //设置等待时间 ,并使能ISP/IAP
#define Start_ADDRH 0x20 //扇区地址高位
#define Start_ADDRL 0x00 //扇区地址低位
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/*****************关闭ISP&IAP功能*****************/
void ISP_IAP_disable(void)
{
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}
/*********************字节读**********************/
uchar Byte_read(uint byte_addr)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP,并送等待时间
ISP_CMD = Read_COM; //送字节读命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字节
ISP_TRIG = 0x46; //送触发命令字0x46
ISP_TRIG = 0xB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1; //开中断
return (ISP_DATA);
}
/*********************字节编程*********************/
void Byte_program(uint byte_addr,uchar isp_iap_data)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP,并送等待时间
ISP_CMD = Prog_COM; //送字节编程命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字节
ISP_DATA = isp_iap_data; //送数据进ISP_DATA
ISP_TRIG = 0x46; //送触发命令字0x46
ISP_TRIG = 0xB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1; //开中断
}
/*********************扇区擦除*********************/
void Sector_erase(uint sector_addr)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP;并送等待时间
ISP_CMD = Erase_COM; //送扇区擦除命令字
ISP_ADDRH = (uchar)(sector_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(sector_addr & 0X00FF); //送地址低字节
ISP_TRIG = 0X46; //送触发命令字0x46
ISP_TRIG = 0XB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1;
}
/********************************************************/
void Display(void) //扫描数码管
{
if(posit==0)
{P1=(discode[disbuff[posit]])&0x7f;}
else
{P2=discode[disbuff[2]];
P0=discode[disbuff[1]];}
if(++posit>=3)
posit=0;
}
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if((S>=250)||flag==1) //超出测量范围显示“-”
{
flag=0;
S=250;
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0xfc;
TL1=0x30;
Display();
timer++;
if(timer>=400) //调节测速频率
{
timer=0;
TX123=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX123=0;
}
}
/*****************************************************************************
* 延时子程序 *
* *
******************************************************************************/
void delay(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
/*********************************************************/
void main( void )
{
S1J=0;
delay(1000);
S1J=1;
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0xf8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //开启总中断
S1=Byte_read(0x2000);
S2=Byte_read(0x2200); //读EEPROM
disbuff[0]=S1%1000/100;
disbuff[1]=S1%1000%100/10;
disbuff[2]=S1%1000%10 %10;
Display();
delay(1000);
disbuff[0]=S2%1000/100;
disbuff[1]=S2%1000%100/10;
disbuff[2]=S2%1000%10 %10;
Display();
delay(1000);
while(1)
{
while(!RX123); //当RX为零时等待
TR0=1; //开启计数
while(RX123); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
if(!KJA){Sector_erase(0x2000); //扇区擦除
Byte_program(0x2000,S); //写EEPROM
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
S1=Byte_read(0x2000); }
if(!KJAN){Sector_erase(0x2200); //扇区擦除
Byte_program(0x2200,S); //写EEPROM
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
S2=Byte_read(0x2200); }
if(S>=S1)S1J=0;
else S1J=1;
}
}
单片机测量脉宽c语言程序,51单片机hc-sr04超声波测距(脉宽测量)DEMO程序相关推荐
- 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc
基于51单片机的电动机测速表的设计 基于51单片机的电动机测速表设计 摘 要 本文介绍了采用光电传感器实施电机转速测量的方法.基本原理,完成了一种基于AT89C51单片机平台的电动机测速表的软硬件设计 ...
- 单片机课程设计洗衣机c语言,基于51单片机洗衣机控制器的设计(附程序)☆
基于51单片机洗衣机控制器的设计(附程序)☆(任务书,开题报告,中期检查表,毕业论文21000字,程序) 摘 要 洗衣机是人们日常生活中常见的一种家电,已经成为人们生活中不可缺少的家用电器.在工业生 ...
- 单片机读取多路温度c语言,以51单片机为内核实现了两路温度采集与显示的温度控制器设计...
1.引言 目前,温度控制器存在的问题是如何缩减成本,减少功耗,温度测量的准确性和多路温度的同时显示.本方案设计的实现基于C51单片机的两路温度控制器,做到成本最低化,精确度高,两路温度的显示和控制,能 ...
- 用单片机c51电子秤的c语言,基于51单片机的电子秤系统设计
微机原理论文第八篇:基于51单片机的电子秤系统设计 摘要:本文主要分析51单片机下的数字电子秤.在设计过程中,这种电子秤具体包括电源.传感器.蓝牙.转换器.单片机.键盘.开关.显示器等组成部分,在实践 ...
- 单片机考试及答案c语言版,51单片机期末考试试卷及答案
制作人:兰香子 一.填空题 1.设X=5AH,Y=36H,则X与Y"或"运算为7EH,X与Y的"异或"运算为6CH. 2.若机器的字长为8位,X=17,Y=35 ...
- 单片机与gsm通信c语言,实现51单片机与GSM模块通信介绍
51单片机与GSM模块实现通信 1.检测串口线的好坏 1)将串口线插在电脑上,用短路子短接串口的2脚和3脚 2)打开串口调试助手 3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能 ...
- 单片机12864电子锁c语言代码,51单片机+LCD12864实现密码锁Proteus仿真和代码
#include // 包含51单片机寄存器定义的头文件 #include //包含_nop_()函数定义的头文件 #include #include <12864.h&g ...
- 单片机自动调光C语言,基于51单片机的DS18B20水温PID控制调节系统设计C语言程序...
#include 'reg52.h' #include 'stdio.h' #define uchar unsigned char #define uint unsigned int sbit s1= ...
- 51单片机两只老虎 c语言,基于51单片机做音乐盒(两只老虎)
/********************************************************************************* 项目:音频音乐盒 设计时间:201 ...
- 单片机简易电子钟设计c语言,基于51单片机的简易电子钟设计
单片机实现电子钟主要有两种方案.一种是利用单片机内部的定时/计数器产生标准秒信号,并根据时间系统的进位原则进行加1调整.另一种方法是为单片机配置一片可独立走时的实时钟(RTC)芯片,单片机通过串行信号 ...
最新文章
- 这届 AI 预测欧洲杯冠军,通通被打脸
- Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序(文末送书)
- 结对开发石家庄地铁系统
- 求大素数 - 埃拉托斯特尼筛法
- vscode php插件_vscode+phpstudy+xdebug无法断点(踩坑记)
- 《人月神话》读后感1
- opencv4快速入门pdf_云复工提升工作效率之九 福昕PDF阅读器
- 数字信号处理(1)- 频谱分析
- 怎么用计算机平方,手机计算器平方怎么按
- 【论文导读】Continuity Scaling: A Rigorous Framework for Detecting andQuantifying Causality Accurately
- 事务里面的脏读、不可重复读、虚读/幻读
- 网付「收钱云音箱」二代全新上市!
- 《硬核父母的五项修炼》读后感
- python判断文件后缀_Python 判断文件后缀
- HTML模仿静态京东登陆界面
- 【个人C++学习日记】
- 在线文档的制作(包含txt,word,pdf,excel的文档类型,一应俱全哦)
- 七巧板复原算法之三——摆放算法
- *寒假水105——Reduced ID Numbers
- 脚本之家c语言指针错误,wincc编译C语言脚本是出错!-工业支持中心-西门子中国...