完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
请大神看看哪出了问题 显示不是显示温度 而且还会一会变8一会变0 ;
如图所示: 程序如下: #include #include #define uchar unsigned char #define uint unsigned int ***it DS=P2^2; ***it lcden=P3^4; ***it lcdrs=P3^5; ***it lcdrw=P3^6; ***it dula=P2^6; ***it wela=P2^7; uchar code table[]="temperature:"; void delayus(uint z) {while(--z);} void delayms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } void Write_1602com(uchar com) { lcdrs=0; P0=com; delayms(5); lcden=1; delayms(5); lcden=0; } void Write_1602date(uchar date) { lcdrs=1; P0=date; delayms(5); lcden=1; delayms(5); lcden=0; } void init() { dula=0; wela=0; lcden=0; lcdrw=0; Write_1602com(0x38); Write_1602com(0x01); Write_1602com(0x0c); Write_1602com(0x06); } void Write_sfm(uchar add,uchar date) //1250 { uchar qian,bai,shi,ge; qian=date/1000; bai=date%1000/100; shi=date%1000%100/10; ge=date%1000%100%10; Write_1602com(0x80+0x40+add); Write_1602date(0x30+qian); Write_1602date(0x30+bai); Write_1602date(0x30+shi); Write_1602date(0x30+ge); } bit DS18B20_init() // DS18b20初始函数 { bit i; DS=1; _nop_(); DS=0; delayus(75); //75*6.5+12=500 DS=1; delayus(2);//2*6.5+12=25 i=DS; delayus(20);//20*6.5+12=132 DS=1; _nop_(); return i; } void Write_DS18B20byte(uchar date)//写 { uchar i; for(i=0;i<8;i++) { DS=0; _nop_(); DS=date&0x01; delayus(15);//6.5*15=110 DS=1; _nop_(); date>>=1; } } uchar Read_DS18B20byte() //读 { uchar i,j,date; for(i=0;i<8;i++) { DS=0; _nop_(); DS=1; delayus(1);//6.5+12=18.5 j=DS; delayus(10);//6.5*10+12=72 DS=1; _nop_(); date=(j<<7)|(date>>1); return date; } } DS18B20_init(); Write_DS18B20byte(0xcc); Write_DS18B20byte(0x44); DS18B20_init(); Write_DS18B20byte(0xcc); Write_DS18B20byte(0xbe); L= Read_DS18B20byte(); M= Read_DS18B20byte(); i=M; i<<=8; i|=L; i=i*0.0625*10+0.5; void main() { uint i,num,a; uchar L,M; init(); Write_1602com(0x80); for(num=0;num<12;num++) { Write_1602date(table[num]); delayms(5); } while(1) { DS18B20_init(); Write_DS18B20byte(0xcc); Write_DS18B20byte(0x44); DS18B20_init(); Write_DS18B20byte(0xcc); Write_DS18B20byte(0xbe); L= Read_DS18B20byte(); M= Read_DS18B20byte(); i=M; i<<=8; i|=L; i=i*0.0625*10+0.5; Write_sfm(5,a); } }
|
|
相关推荐
27个回答
|
|
应该是你DS18B20部分的时序有问题,没有符合one-wire总线的要求。
|
|
|
|
好的 那我试试、我就感觉这样可以显示的 可是就不知道为什么显示不出来 |
|
|
|
还是不行 你帮我看看我的程序哪里出了问题了 拜托了 |
|
|
|
你的读部分的程序return放在了for循环里,暂时只看到这个。 |
|
|
|
本帖最后由 NUIST_XKFYT 于 2017-3-6 13:15 编辑
这是我自己的读DS18B20部分的代码,你可以参考下,写得很清晰。
|
|
|
|
你的能多点测温吗?求程序
|
|
|
|
|
|
|
|
程序如下: #include #include"LCD1602.h" #define uchar unsigned char #define uint unsigned int ***it TSCLK=P1^0; ***it TIO=P1^1; ***it TEN=P1^2; uchar Year,Month,Day,Hour,Min,Sec; void delayms(uint z) //延时函数ms { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } void Write_1302date(uchar com,uchar dat) //DS1302写数据 { uchar i; TEN=0; TSCLK=0; TEN=1; for(i=0;i<8;i--) { TSCLK=0; TIO=com&0x01; TSCLK=1; com>>=1; } for(i=0;i<8;i--) { TSCLK=0; TIO=dat&0x01; TSCLK=1; dat>>=1; } } uchar Read_1302date(uchar com) //DS1302读数据 { uchar i,dat; TEN=0; TSCLK=0; TEN=1; for(i=0;i<8;i++) { TSCLK=0; TIO=com&0x01; TSCLK=1; com>>=1; } for(i=0;i<8;i++) { TSCLK=0; dat>>=1; if(TIO) dat|=0x80; //如果TIO为高电平写1 否则写0 TSCLK=1; } return dat; } uchar date_BCD(uchar dat) //数据转BCD { uchar dat1,dat2; dat1=dat/10; dat2=dat%10; dat2=dat2+dat1*16; return dat2; } uchar BCD_date(uchar dat) //BCD转数据 { uchar dat1,dat2; dat1=dat/16; dat2=dat%16; dat2=dat2+dat1*10; return dat2; } void main() { init(); Write_1302date(0x8e,0);//关闭写保护 Write_1302date(0x80,date_BCD(30)); //秒 Write_1302date(0x82,date_BCD(15)); //分 Write_1302date(0x84,date_BCD(5)); //时 Write_1302date(0x86,date_BCD(30)); //日 Write_1302date(0x88,date_BCD(9)); //月 Write_1302date(0x8c,date_BCD(17));;//年 Write_1302date(0x8e,0x80);//开启写保护 while(1) { Write_1302date(0x8e,0);//关闭写保护 Sec=BCD_date(Read_1302date(0x81)); Min=BCD_date(Read_1302date(0x83)); Hour=BCD_date(Read_1302date(0x85)); Day=BCD_date(Read_1302date(0x87)); Month=BCD_date(Read_1302date(0x89)); Year=BCD_date(Read_1302date(0x8d)); Write_1302date(0x8e,0x80);//开启写保护 ONE_Write_sfm(7,Year); ONE_Write_sfm(10,Month); ONE_Write_sfm(13,Day); TWO_Write_sfm(6,Hour); TWO_Write_sfm(9,Min); TWO_Write_sfm(12,Sec); } } 1602.h程序如下: #define uchar unsigned char #define uint unsigned int ***it lcden=P3^4; //使能端 ***it lcdrs=P3^5; //数据命令选择端 ***it lcdrw=P3^6; //读写控制端 ***it dula=P2^6; ***it wela=P2^7; uchar code table3[]="Date:20 - - "; uchar code table4[]="Time: - - "; void delay(uint z) //延时函数ms { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } void Write_1602com(uchar com) //1602写命令 { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void Write_1602date(uchar dat) { lcdrs=1; P0=dat; delay(5); lcden=1; delay(5); lcden=0; } void ONE_Write_sfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; Write_1602com(0x80+add); Write_1602date(0x30+shi); Write_1602date(0x30+ge); } void TWO_Write_sfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; Write_1602com(0x80+0x40+add); Write_1602date(0x30+shi); Write_1602date(0x30+ge); } void init() { uchar num; dula=0; wela=0; lcden=0; lcdrw=0; Write_1602com(0x38); Write_1602com(0x01); Write_1602com(0x0c); Write_1602com(0x06); Write_1602com(0x80); for(num=0;num<15;num++) { Write_1602date(table3[num]); delay(5); } Write_1602com(0x80+0x40); for(num=0;num<15;num++) { Write_1602date(table4[num]); delay(5); } } 帮我看一下这个程序 ,他显示的数值不是我自己设定的 而且每次复位都会变 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85是DS1302中非常经典的错误,应该是你的读写时序还存在问题。晚点我会补段代码上来。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
298 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
309 浏览 0 评论
826 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1911 浏览 2 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1427 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 02:42 , Processed in 1.003578 second(s), Total 108, Slave 90 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号