单片机源程序如下:
#include #define uchar unsigned char #define uint unsigned int unsigned int time=0; unsigned int timer=0; unsigned long S=0; //距离变量 bit flag =0; //超声波模块量程溢出标志(>5米时置1) sbit echo=P1^0; //超声波模块的发射端 sbit trig=P1^1; //超声波模块的接收端 sbit ds=P2^2; //DS18B20的信号线 sbit P24=P2^4; sbit P25=P2^5; sbit P26=P2^6; sbit P27=P2^7; sbit P07=P0^7; int temp; //八位共阳极 unsigned char code shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /*********************************************************/ //毫秒级延时 void delayms(unsigned char z) { unsigned char a,b; for(a=z; a>0; a--) for(b=110; b>0; b--); } /*********************************************************/ /*********************************************************/ //微秒级延时 void delayus(unsigned char z) { while(z) z--; } /********************************************************/ void delay_ms(unsigned int ms) //1ms延时 { uchar a; while(ms--) for(a=123;a>0;a--); } /*********************************************************/ //DS18B20初始化 void ds18b20init() { ds=0; delayus(80); //延时480-960us ds=1; delayus(4); //等待应答 } /*********************************************************/ //DS18B20读命令子程序(读一字节) uchar dushuju() { uchar i,dat,m; for(i=8;i>0;i--) { ds=0; delayus(1); ds=1; delayus(2); m=ds; dat=(m<<7)|(dat>>1); //读出的数据最低位在最前面,刚好一个字节在dat里 delayus(8); } return dat; } /*********************************************************/ //DS18B20写命令子程序(写一字节) void xiemingling(uint shuju) { uint i; bit m; for(i=8;i>0;i--) { m=shuju&0x01; shuju=shuju>>1; if(m) //写1 { ds=0; delayus(2); ds=1; delayus(8); } else //写0 { ds=0; delayus(8); ds=1; delayus(2); } } } /*********************************************************/ //DS18B20开始获取温度并转换 void zhuanhuan() { ds18b20init(); delayms(1); xiemingling(0xcc); //写跳过读ROM指令 xiemingling(0x44); //写温度转换命令 } /*********************************************************/ //DS18B20读寄存器中存储的温度数据 int duwendu() { uint a,b; ds18b20init(); delayms(1); xiemingling(0xcc); //跳过ROM,忽略64位ROM地址 xiemingling(0xbe); //读内部RAM中的9字节的温度数据 a=dushuju(); //读低8位 b=dushuju(); //读高8位 b=b<<8; //高8位左移8位 temp=b|a; // 高8位和低8位组合为1个字 temp=temp*0.0625; //温度在寄存器中位12位,分辨率为0.0625度 return temp; } /*********************************************************/ //显示子程序 void xianshi(unsigned long num) { unsigned char bai,shi,ge; bai=num/100; //分离三位距离数据 shi=num%100/10; ge=num%10; P24=0; P0=shuzu[ge]; delay_ms(1); P24=1; P25=0; P0=shuzu[shi]; P07=1; delay_ms(1); P25=1; P26=0; P0=shuzu[bai]; delay_ms(1); P26=1; // P24=0; // P0=shuzu[bai]; // P07=1; // delay_ms(1); // P24=1; } /*********************************************************/ //计算距离子程序 void Conut() { float a; time=TH0*256+TL0; //这是最后计算到的时间,但应该再乘以12/11.092 //时间应该是time*12/11.0592 TH0=0; //定时器0的初始值位0 TL0=0; a=(331.5+0.607*temp); //声速与温度的函数关系:声速=331.5+0.607*温度 S=(time*a/200)/100; //算出来是cm if (S>=500) //最大距离为5m,即500cm S=888; if (flag==1) //判断是否溢出 { S=888; flag=0; TH0=0; TL0=0; } } /********************************************************/ //初始化定时器0和定时器1 void T0_init() { TMOD=0x11; TH0=0; TL0=0; TH1=0xf8; //定时器1赋初值,应该是2ms
上一篇:stc89c51单片机和lcd12864显示sin函数图像
下一篇:单片机+L298直流电机驱动程序
推荐阅读最新更新时间:2024-11-13 11:22
设计资源 培训 开发板 精华推荐
- DC2069A、LT8490 演示板、高效 MPPT 降压-升压型电池充电器控制器 17V 至 54V,高达 200W 太阳能电池板输入电压。 12V SLA 电池,充电电流高达 16.6A
- 具有重合跟踪和 6V 输入 UVLO 的 LTC3633AEFE 1.2V/1.8V 降压稳压器的典型应用电路
- LT6656AIDC-4.096、4.096V 低功率精密高压电源监视器的典型应用
- TS9010SCX5 RF 150mA, 3.3V CMOS LDO with Enable 典型应用电路
- 光电隔离模块(原理图+方案设计).rar
- RY-2405S 5V、200mA输出DC/DC转换器典型应用电路
- CH340N烧录器
- 使用 Analog Devices 的 LT1086CT-2.85 的参考设计
- ADP8863 电荷泵、7 通道趣味照明 LED 驱动器的典型应用电路
- L78L09AB正压稳压器Edit boost电路的典型应用