/***********************************************************************************************************/

//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程序相关推荐

  1. 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc

    基于51单片机的电动机测速表的设计 基于51单片机的电动机测速表设计 摘 要 本文介绍了采用光电传感器实施电机转速测量的方法.基本原理,完成了一种基于AT89C51单片机平台的电动机测速表的软硬件设计 ...

  2. 单片机课程设计洗衣机c语言,基于51单片机洗衣机控制器的设计(附程序)☆

    基于51单片机洗衣机控制器的设计(附程序)☆(任务书,开题报告,中期检查表,毕业论文21000字,程序) 摘  要 洗衣机是人们日常生活中常见的一种家电,已经成为人们生活中不可缺少的家用电器.在工业生 ...

  3. 单片机读取多路温度c语言,以51单片机为内核实现了两路温度采集与显示的温度控制器设计...

    1.引言 目前,温度控制器存在的问题是如何缩减成本,减少功耗,温度测量的准确性和多路温度的同时显示.本方案设计的实现基于C51单片机的两路温度控制器,做到成本最低化,精确度高,两路温度的显示和控制,能 ...

  4. 用单片机c51电子秤的c语言,基于51单片机的电子秤系统设计

    微机原理论文第八篇:基于51单片机的电子秤系统设计 摘要:本文主要分析51单片机下的数字电子秤.在设计过程中,这种电子秤具体包括电源.传感器.蓝牙.转换器.单片机.键盘.开关.显示器等组成部分,在实践 ...

  5. 单片机考试及答案c语言版,51单片机期末考试试卷及答案

    制作人:兰香子 一.填空题 1.设X=5AH,Y=36H,则X与Y"或"运算为7EH,X与Y的"异或"运算为6CH. 2.若机器的字长为8位,X=17,Y=35 ...

  6. 单片机与gsm通信c语言,实现51单片机与GSM模块通信介绍

    51单片机与GSM模块实现通信 1.检测串口线的好坏 1)将串口线插在电脑上,用短路子短接串口的2脚和3脚 2)打开串口调试助手 3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能 ...

  7. 单片机12864电子锁c语言代码,51单片机+LCD12864实现密码锁Proteus仿真和代码

    #include       //  包含51单片机寄存器定义的头文件 #include     //包含_nop_()函数定义的头文件 #include #include <12864.h&g ...

  8. 单片机自动调光C语言,基于51单片机的DS18B20水温PID控制调节系统设计C语言程序...

    #include 'reg52.h' #include 'stdio.h' #define uchar unsigned char #define uint unsigned int sbit s1= ...

  9. 51单片机两只老虎 c语言,基于51单片机做音乐盒(两只老虎)

    /********************************************************************************* 项目:音频音乐盒 设计时间:201 ...

  10. 单片机简易电子钟设计c语言,基于51单片机的简易电子钟设计

    单片机实现电子钟主要有两种方案.一种是利用单片机内部的定时/计数器产生标准秒信号,并根据时间系统的进位原则进行加1调整.另一种方法是为单片机配置一片可独立走时的实时钟(RTC)芯片,单片机通过串行信号 ...

最新文章

  1. 这届 AI 预测欧洲杯冠军,通通被打脸
  2. Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序(文末送书)
  3. 结对开发石家庄地铁系统
  4. 求大素数 - 埃拉托斯特尼筛法
  5. vscode php插件_vscode+phpstudy+xdebug无法断点(踩坑记)
  6. 《人月神话》读后感1
  7. opencv4快速入门pdf_云复工提升工作效率之九 福昕PDF阅读器
  8. 数字信号处理(1)- 频谱分析
  9. 怎么用计算机平方,手机计算器平方怎么按
  10. 【论文导读】Continuity Scaling: A Rigorous Framework for Detecting andQuantifying Causality Accurately
  11. 事务里面的脏读、不可重复读、虚读/幻读
  12. 网付「收钱云音箱」二代全新上市!
  13. 《硬核父母的五项修炼》读后感
  14. python判断文件后缀_Python 判断文件后缀
  15. HTML模仿静态京东登陆界面
  16. 【个人C++学习日记】
  17. 在线文档的制作(包含txt,word,pdf,excel的文档类型,一应俱全哦)
  18. 七巧板复原算法之三——摆放算法
  19. *寒假水105——Reduced ID Numbers
  20. 脚本之家c语言指针错误,wincc编译C语言脚本是出错!-工业支持中心-西门子中国...

热门文章

  1. 最全的芯片封装技术详细介绍(珍藏版)
  2. nmake编译dll
  3. Java Excel转图片
  4. Linux dstat 监控工具
  5. Linux系统tomcat修改端口
  6. steam游戏直连工具
  7. 微信公众号在线答题小程序系统怎么做答题游戏活动
  8. java 性能调优案例_java性能调优实战,java性能调优
  9. 12306网站抢票机制攻与防
  10. 微信朋友圈点赞和评论测试用例