完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include #include #define uchar unsigned char //宏定义 #define uint unsigned int //宏定义 ***it dula = P2^6; //数码管段定义 ***it wela = P2^7; //数码管位定义 ***it beep = P2^3; //蜂鸣器定义 ***it RS = P3^5; //1602 RS定义 ***it LCDEN = P3^4; //1602 LCDEN定义 void delayUs() //空指令延时 { _nop_(); } void delayMs(uint a)// //延时 { uint i, j; for(i = a; i > 0; i--) for(j = 100; j > 0; j--); } void writeComm(uchar comm) //1602写指令 { RS = 0; P0 = comm; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } //1602写数据:RS=1, RW=0; void writeData(uchar dat) { RS = 1; P0 = dat; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } void init() //1602初始化 { dula = wela = 0; //关数码管 段和位 writeComm(0x38); //显示模式 writeComm(0x0c); //光标显示 writeComm(0x06); //光标 指针 writeComm(0x01); //指针清零 } void writeString(uchar * str, uchar length) { uchar i; for(i = 0; i < length; i++) { writeData(str[i]); } } /**//*****************************DS18B20*******************************/ ***it ds = P2^2; void dsInit() { unsigned int i; ds = 0; i = 100; while(i>0) i--; ds = 1; i = 4; while(i>0) i--; } void dsWait() { unsigned int i; while(ds); while(~ds); i = 4; while(i > 0) i--; } bit readBit() { unsigned int i; bit b; ds = 0; i++; ds = 1; i++; i++; b = ds; i = 8; while(i>0) i--; return b; } 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; } void writeByte(unsigned char dat) { unsigned int i; unsigned char j; bit b; for(j = 0; j < 8; j++) { b = dat & 0x01; dat >>= 1; if(b) { ds = 0; i++; i++; ds = 1; i = 8; while(i>0) i--; } else { ds = 0; i = 8; while(i>0) i--; ds = 1; i++; i++; } } } void sendChangeCmd() { dsInit(); dsWait(); delayMs(1); writeByte(0xcc); writeByte(0x44); } void sendReadCmd() { dsInit(); dsWait(); delayMs(1); writeByte(0xcc); writeByte(0xbe); } int getTmpValue() { unsigned int tmpvalue; int value; float t; unsigned char low, high; sendReadCmd(); low = readByte(); high = readByte(); tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue; t = value * 0.0625; value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5 return value; } void display(int v) { unsigned char count; unsigned char datas[] = {0, 0, 0, 0, 0}; unsigned int tmp = abs(v); datas[0] = tmp / 10000; datas[1] = tmp % 10000 / 1000; datas[2] = tmp % 1000 / 100; datas[3] = tmp % 100 / 10; datas[4] = tmp % 10; writeComm(0xc0+3); if(v < 0) { writeString("- ", 2); } else { writeString("+ ", 2); } if(datas[0] != 0) { writeData('0'+datas[0]); } for(count = 1; count != 5; count++) { writeData('0'+datas[count]); if(count == 2) { writeData('.'); } } } /**//*****************************DS18B20*******************************/ void main() { uchar table[] = " temperature"; sendChangeCmd(); init(); writeComm(0x80); writeString(table, 16); while(1) { delayMs(1000); //温度转换时间需要750ms以上 writeComm(0xc0); display(getTmpValue()); sendChangeCmd(); } } |
|
相关推荐
8个回答
|
|
判断温度是否超过→是:蜂鸣器叫→否则:蜂鸣器关
|
|
|
|
|
|
|
|
这程序是网友发给我的,我是初学,不知道哪个是拿到的温度数值,拿哪个去比较,谢谢你 |
|
|
|
table是别人写得变量吧,他摆到显示里面了
|
|
|
|
为什么我添加了 if(tmp>25) { beep=!beep; } else { beep=1; } 超过25不响 |
|
|
|
首先你显示上面有显示了实际温度么?
|
|
|
|
有显示实际温度; 1602屏幕上显示如下 temperature: +温度数值 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1063 浏览 0 评论
693 浏览 0 评论
嵌入式学习-搭建自己的ubuntu系统之ubuntu网络设置
828 浏览 0 评论
龙芯中科胡伟武:3B6600 八核桌面 CPU 性能将达到英特尔中高端酷睿 12~13 代水平
892 浏览 0 评论
树莓派Pico 2发布,搭载RP2350双核RISC-V和Arm Cortex-M33微控制器!
843 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10784 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 15:42 , Processed in 0.712703 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号