完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
有 DS18B20+4位数码管动态显示(共阴极)+3个独立按键+设置温度上下限报警的C语言程序 (DS18B20接P3.3; 扬声器接P3.7; 按键接P1;数码管接P0口和P2口) |
|
相关推荐
11个回答
|
|
网上找一个 修改下就可以用了
|
|
|
|
有没有用点阵的--我做的这个要用点阵
|
|
|
|
简单啊
|
|
|
|
|
|
|
|
|
|
|
|
呵呵,别老菜鸟的啦。有点自信呗! https://bbs.elecfans.com/forum.p ... p;highlight=ds18b20 https://bbs.elecfans.com/forum.p ... p;highlight=ds18b20 参考一下。哪里看不懂,把程序贴出来。具体问题一步步分析呗。我会关注你的帖子的。 |
|
|
|
武力戡乱 发表于 2015-4-18 23:56 这段程序没有错,可是为什么我的原理图还是没办法显示温度啊,求指点 #include #include #include //---------------------------------------------------------------------------------------------- //变量声明 //---------------------------------------------------------------------------------------------- char led_code_tab[18] = {0xc0, //0 0xf9, //1 0xa4, //2 0xb0, //3 0x99, //4 0x92, //5 0x82, //6 0xf8, //7 0x80, //8 0x90, //9 0x88, //10_a 0x83, //11_b 0xc6, //12_c 0xa1, //13_d 0x86, //14_e 0x8e, //15_f 0xbf, //16_- 0x7f //17_. }; //字段编码 char led_buff[4] = {0,0,0,0}; //字段缓冲 char float_tab[16] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数表 ***it ds18b20_io = P3^7; //---------------------------------------------------------------------------------------------- //延时函数 //---------------------------------------------------------------------------------------------- void delay_xus(unsigned char x) { while(--x); } void delay_xms(unsigned char x) { while(--x) { delay_xus(250); delay_xus(245); }; } //---------------------------------------------------------------------------------------------- //显示函数 //---------------------------------------------------------------------------------------------- void display() { //显示000X P2 = P2 & 0x0f;//清除P2口高4位 P2 = P2 | 0x10; P0 = led_buff[3]; delay_xms(2); P0 = 0xff; //显示00X0 P2 = P2 & 0x0f; P2 = P2 | 0x20; P0 = led_buff[2]; delay_xms(2); P0 = 0xff; //显示0X00 P2 = P2 & 0x0f; P2 = P2 | 0x40; P0 = led_buff[1] & led_code_tab[17]; delay_xms(2); P0 = 0xff; //显示X000 P2 = P2 & 0x0f; P2 = P2 | 0x80; P0 = led_buff[0]; delay_xms(2); P0 = 0xff; } //---------------------------------------------------------------------------------------------- //DS18B20操作函数 //---------------------------------------------------------------------------------------------- bit ds18b20_init() { bit is_success = 1; ds18b20_io = 1; delay_xus(2);//延时9us ds18b20_io = 0;//拉低IO口 delay_xus(250);//延时505us,复位 ds18b20_io = 1;//提升数据线 delay_xus(28);//延时61us if(ds18b20_io == 1) is_success = 0; delay_xus(118);//延时241us return is_success; } void ds18b20_writebyte(unsigned char buff) { unsigned char i; ds18b20_io = 1;//准备发送 delay_xus(1);//延时7us for(i=0;i<8;i++) { if(buff & 0x01)//获取1位,低位在前 { ds18b20_io = 0;//开始发送1位 delay_xus(5);//延时15us ds18b20_io = 1;//发送1 } else { ds18b20_io = 0;//开始发送1位 delay_xus(5);//延时15us //发送0 } delay_xus(20);//延时45us,等待发送完毕 ds18b20_io = 1;//准备发送 delay_xus(8);//延时21us buff >>= 1; } } unsigned char ds18b20_readbyte(void) { unsigned char i; unsigned char buff = 0; ds18b20_io = 1;//准备读取 delay_xus(1);//延时7us for(i=0;i<8;i++) { buff >>= 1; ds18b20_io = 0;//开始读取1位 delay_xus(1);//延时7us ds18b20_io = 1;//必须写1,否则读出来的将是不预期的数据 delay_xus(1);//延时7us if(ds18b20_io)//在14us处读取数据 buff |= 0x80; delay_xus(20);//延时45us,等待读取完毕 ds18b20_io = 1;//准备读取 delay_xus(8);//延时21us } return buff; } //---------------------------------------------------------------------------------------------- //主函数 //---------------------------------------------------------------------------------------------- void main() { bit ds18b20_busy = 0; unsigned char ds18b20_tt_count = 0; unsigned char th = 0; unsigned char tl = 0; unsigned int temperature = 0; bit isminus = 0; bit isoverflow = 0; while(1) { if(ds18b20_busy == 0) { //启动一次转换 if(ds18b20_init() == 1)//初始化ds18b20 { ds18b20_writebyte(0xCC);//跳过读序号列号的操作 ds18b20_writebyte(0x44);//启动温度转换 ds18b20_busy = 1;//置ds18b20忙标志,等待 } } else { //读取温度 if(ds18b20_tt_count > 85) { if(ds18b20_init() == 1) { ds18b20_writebyte(0xCC);//跳过读序号列号的操作 ds18b20_writebyte(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度 tl = ds18b20_readbyte();//低位 th = ds18b20_readbyte();//高位 //计算温度 temperature = (th << 8) + tl; isminus = 0; if((temperature&0xf000) == 0xf000)//判断是否是负温度 { temperature = ~temperature + 1; isminus = 1; } temperature = (temperature >> 4) * 10 + float_tab[(temperature & 0x0f)]; //规整温度:大于99.9,则都是99.9;小于-9.9,则都是-9.9 isoverflow = 0; if(temperature > 999 && isminus == 0) { temperature = 999; isoverflow = 1; } if(temperature > 99 && isminus == 1) { temperature = 99; isoverflow = 1; } //读温度完毕 ds18b20_busy = 0;//取消ds18b20忙标志 ds18b20_tt_count = 0; } } } if(isminus == 1) { led_buff[0] = led_code_tab[16]; P1 = 0; } else { led_buff[0] = led_code_tab[temperature/100]; P1 = 1; } led_buff[1] = led_code_tab[(temperature%100)/10]; led_buff[2] = led_code_tab[temperature%10]; if(isoverflow == 0) { led_buff[3] = led_code_tab[12]; } else { led_buff[3] = led_code_tab[14]; } display(); ds18b20_tt_count++; } } |
|
|
|
额,没法显示还没有错! 还有,实际能行的,仿真不一定能过,反之可以!proteus逻辑有时候要求很严格! https://bbs.elecfans.com/forum.p ... p;extra=#pid3496263 里面有个ds18b20的仿真,你参考一下他的程序! |
|
|
|
非常有帮助!非常有帮助!
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
6178 浏览 3 评论
7445 浏览 1 评论
7685 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
9477 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1277 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 14:55 , Processed in 0.876727 second(s), Total 97, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号