完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我写了 一个程序,程序编译通过但是keil中调试的时候有的语句好像没有执行只能执行到chtemp(),烧录到单片机也工作。不知道什么原因?大家帮帮忙忙
#include #include typedef unsigned char BYTE; ***it DQ = P2^2; //DS18B20的数据口 BYTE TPH; //温度转换的高位 BYTE TPL; //温度转换的低位 ***it ds=P2^2; ***it fm=P2^3; ***it htemp=P1^0; ***it ltemp=P1^2; ***it dula=P2^7; ***it wela=P2^6; int hbound=270; int lbound=240; ***it hadd=P2^1; ***it lsub=P2^0; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //不带小数点数字编码 unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19, 0x12,0x02,0x78,0x00,0x10}; //带小数点数字编码 void init() { IT0=0; EX0=1; EA=1; } void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*数码管的显示 */ void display(unsigned int temp) { unsigned char shu1,shu2,xiao; shu1=temp/100; shu2=temp%100/10; xiao=temp%10; dula=1; P0=table[shu1]; dula=0; P0=0xff;//消隐 wela=1; P0=0x01;//位选通百位 wela=0; delay(20); dula=1; P0=table1[shu2]; dula=0; P0=0xff; wela=1; P0=0x02; wela=0; delay(20); dula=1; P0=table[xiao]; dula=0; P0=0xff; wela=1; P0=0x04; wela=0; delay(20); dula=1; P0=0xc6; dula=0; wela=1; P0=0x08; wela=0; delay(20); dula=1; P0=0xff; dula=0; } void DelayXus(BYTE n); void DS18B20_Reset(); void DS18B20_WriteByte(BYTE dat); BYTE DS18B20_ReadByte(); void chtemp() { DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0x44); //开始转换命令 while (!DQ); //等待转换完成 } unsigned int readscr() { unsigned int a,b,temp; float wendu; DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0xBE); //读暂存存储器命令 TPL = DS18B20_ReadByte(); //读温度低字节 TPH = DS18B20_ReadByte(); //读温度高字节 a=TPL; b=TPH; temp=b; temp<<=8; temp=temp|a; wendu=temp*0.0625; temp=wendu*10+0.5; display(temp); return(temp); } void control(unsigned int wen) { unsigned int i; if(wen>hbound||wen if(wen>hbound) { htemp=0; fm=0; display(readscr()); fm=1; display(readscr()); } else { ltemp=0; fm=0; for(i=2;i>0;i++) display(readscr()); fm=1; for(i=2;i>0;i++) display(readscr()); } } else display(readscr()); } void main() { unsigned int wen,i; static unsigned int flag=1; while(1) { init(); chtemp(); if(flag) { for(i=57;i>0;i--) display(0); flag=0; } else { wen=readscr(); control(wen); } } } /************************************** 延时X微秒 **************************************/ void DelayXus(BYTE n) { while (n--) { _nop_(); _nop_(); } } /************************************** 复位DS18B20,并检测设备是否存在 **************************************/ void DS18B20_Reset() { unsigned int CY = 1; while (CY) { DQ = 0; //送出低电平复位信号 DelayXus(240); //延时至少480us DelayXus(240); DQ = 1; //释放数据线 DelayXus(60); //等待60us CY = DQ; //检测存在脉冲 DelayXus(240); //等待设备释放数据线 DelayXus(180); } } /************************************** 从DS18B20读1字节数据 **************************************/ BYTE DS18B20_ReadByte() { BYTE i; BYTE dat = 0; for (i=0; i<8; i++) //8位计数器 { dat >>= 1; DQ = 0; //开始时间片 DelayXus(1); //延时等待 DQ = 1; //准备接收 DelayXus(1); //接收延时 if (DQ) dat |= 0x80; //读取数据 DelayXus(60); //等待时间片结束 } return dat; } /************************************** 向DS18B20写1字节数据 **************************************/ void DS18B20_WriteByte(BYTE dat) { unsigned int CY = 1; char i; for (i=0; i<8; i++) //8位计数器 { DQ = 0; //开始时间片 DelayXus(1); //延时等待 CY=dat&0x01; dat >>= 1; //送出数据 DQ = CY; DelayXus(60); //等待时间片结束 DQ = 1; //恢复数据线 DelayXus(1); //恢复延时 } } |
|
相关推荐
3个回答
|
|
|
|
|
|
你keil仿真的时候他只是51内部的软件仿真,就相当于一个没有接什么外围设备的单片机在运行。没有外围器件的仿真,只能手动设计对应管脚的拉高拉低。如果想硬件仿真就得和Proteus一起仿真才行,或者用仿真器。
|
|
|
|
程序执行到 init();
chtemp(); 会调用下面这个函数,调试时可能已经错过了检查存在脉冲的时机,所以不会继续执行。 void DS18B20_Reset() { unsigned int CY = 1; while (CY) { DQ = 0; //送出低电平复位信号 DelayXus(240); //延时至少480us DelayXus(240); DQ = 1; //释放数据线 DelayXus(60); //等待60us CY = DQ; //检测存在脉冲 DelayXus(240); //等待设备释放数据线 DelayXus(180); } } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
195 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
172 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
453 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
697 浏览 2 评论
602 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11983 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 03:37 , Processed in 0.585304 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号