完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
指
求大神指导怎么写出一个温度传感器的程序: 1602+三个按键+ds18b20 功能如下: 在1602上显示当前收集到的温度,保留俩位有效数字 任意设置上下限温度,单温度低于或者高于下限1时,蜂鸣器报警,LED1慢慢闪烁,低于或者高于2度时,蜂鸣器报警LED1快闪烁 温度传感器实在不知道该怎么写,希望大神谁能指点一二 |
|
相关推荐
5 个讨论
|
|
//这个程序是抄来的,供参考
#include //通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值 ***it wela = P2^7; //数码管位选 ***it dula = P2^6; //数码管段选 ***it ds = P2^2; //0-F数码管的编码(共阴极) unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-9数码管的编码(共阴极), 带小数点 unsigned char code tableWidthDot[]={0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef}; //延时函数, 例i=10,则大概延时10ms. void delay(unsigned char i) { unsigned char j, k; for(j = i; j > 0; j--) for(k = 125; k > 0; k--); } //初始化DS18B20 //让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动 void dsInit() {//一定要使用unsigned int型, 一个i++指令的时间, 作为与DS18B20通信的小时间间隔 //以下都是一样使用unsigned int型 unsigned int i; ds = 0; i = 103; while(i>0) i--; ds = 1; i = 4; while(i>0) i--; } //向DS18B20读取一位数据 //读一位, 让DS18B20一小周期低电平, 然后两小周期高电平, //之后DS18B20则会输出持续一段时间的一位数据 bit readBit() { unsigned int i; bit b; ds = 0; i++; ds = 1; i++; i++; b = ds; i = 8; while(i>0) i--; return b; } //读取一字节数据, 通过调用readBit()来实现 unsigned char readByte() { unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i<8; i++) { j = readBit(); //最先读出的是最低位数据 dat = (j << 7) | (dat >> 1); } return dat; } //向DS18B20写入一字节数据 void writeByte(unsigned char dat) { unsigned int i; unsigned char j; bit b; for(j = 0; j < 8; j++) { b = dat & 0x01; dat >>= 1; //写"1", 让低电平持续2个小延时, 高电平持续8个小延时 if(b) { ds = 0; i++; i++; ds = 1; i = 8; while(i>0) i--; } else //写"0", 让低电平持续8个小延时, 高电平持续2个小延时 { ds = 0; i = 8; while(i>0) i--; ds = 1; i++; i++; } } } //向DS18B20发送温度转换命令 void sendChangeCmd() { dsInit(); //初始化DS18B20 delay(1); //延时1ms writeByte(0xcc); //写入跳过序列号命令字 writeByte(0x44); //写入温度转换命令字 } //向DS18B20发送读取数据命令 void sendReadCmd() { dsInit(); delay(1); writeByte(0xcc); //写入跳过序列号命令字 writeByte(0xbe); //写入读取数据令字 } //获取当前温度值 unsigned int getTmpValue() { unsigned int value; //存放温度数值 float t; unsigned char low, high; sendReadCmd(); //连续读取两个字节数据 low = readByte(); high = readByte(); //将高低两个字节合成一个整形变量 value = high; value <<= 8; value |= low; //DS18B20的精确度为0.0625度, 即读回数据的最低位代表0.0625度 t = value * 0.0625; //将它放大10倍, 使显示时可显示小数点后一位, 并对小数点后第二2进行4舍5入 //如t=11.0625, 进行计数后, 得到value = 111, 即11.1 度 value = t * 10 + 0.5; return value; } //显示当前温度值, 精确到小数点后一位 void display(unsigned int v) { unsigned char count; unsigned char datas[] = {0, 0, 0}; datas[0] = v / 100; datas[1] = v % 100 / 10; datas[2] = v % 10; for(count = 0; count < 3; count++) { //片选 wela = 0; P0 = ((0xfe << count) | (0xfe >> (8 - count))); //选择第(count + 1) 个数码管 wela = 1; //打开锁存, 给它一个下降沿量 wela = 0; //段选 dula = 0; if(count != 1) { P0 = table[datas[count]]; //显示数字 } else { P0 = tableWidthDot[datas[count]]; //显示带小数点数字 } dula = 1; //打开锁存, 给它一个下降沿量 dula = 0; delay(5); //延时5ms, 即亮5ms //清除段先, 让数码管灭, 去除对下一位的影响, 去掉高位对低位重影 //若想知道影响效果如何, 可自行去掉此段代码 //因为数码管是共阴极的, 所有灭的代码为: 00H dula = 0; P0 = 0x00; //显示数字 dula = 1; //打开锁存, 给它一个下降沿量 dula = 0; } } void main() { unsigned char i; unsigned int value; while(1) { //启动温度转换 sendChangeCmd(); value = getTmpValue(); //显示3次 for(i = 0; i < 3; i++) { display(value); } } } |
|
|
|
|
|
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
846 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
820 浏览 0 评论
910 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1693 浏览 0 评论
1307 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12070 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 15:41 , Processed in 0.615502 second(s), Total 46, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号