完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include"temp.h" #define uint unsigned int #define uchar unsigned char ***it K=P1^7; ***it LED=P1^0; uchar code DIG_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值 void display(int temp ); void Delay(uint z); void elec(int temp); void main() { while(1) { elec(Ds18b20ReadTemp()); display( Ds18b20ReadTemp()); } } //显示函数 void display(int temp ) { if(temp<0) { temp=temp-1; temp=~temp; P0=0x00; P0=0x40; P2=0x7f; Delay(1); P0=0x00; P0=DIG_CODE[temp/100]; P2=0xbf; Delay(1); P0=0x00; P0=DIG_CODE[temp%100/10]; P2=0xdf; Delay(1); P0=0x00; P0=DIG_CODE[temp%100%10]; P2=0xef; Delay(1); } else { P0=0x00; P0=0x00; P2=0x7f; Delay(1); P0=0x00; P0=DIG_CODE[temp/100]; P2=0xbf; Delay(1); P0=0x00; P0=DIG_CODE[temp%100/10]; P2=0xdf; Delay(1); P0=0x00; P0=DIG_CODE[temp%100%10]; P2=0xef; Delay(1); } } //延时函数 void Delay(uint z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void elec(int temp) { if(temp>-15) { LED=1; Delay(100); LED=0; Delay(100); } if(temp<-30) K=1; while(temp>-25) { K=0; } return; } /*******************************************************************************/ #include"temp.h" /******************************************************************************* * 函数名 : Delay1ms * 函数功能 : 延时函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Delay1ms(unsigned int y) { unsigned int x; for(y;y>0;y--) for(x=110;x>0;x--); } /******************************************************************************* * 函数名 : Ds18b20Init * 函数功能 : 初始化 * 输入 : 无 * 输出 : 初始化成功返回1,失败返回0 *******************************************************************************/ unsigned char Ds18b20Init() { unsigned int i; DQ=0; //将总线拉低480us~960us i=70; while(i--);//延时642us DQ=1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 i=0; while(DQ) //等待DS18B20拉低总线 { i++; if(i>5000)//等待>5MS return 0;//初始化失败 } return 1;//初始化成功 } /******************************************************************************* * 函数名 : Ds18b20WriteByte * 函数功能 : 向18B20写入一个字节 * 输入 : com * 输出 : 无 *******************************************************************************/ void Ds18b20WriteByte(unsigned char dat) { unsigned int i,j; for(j=0;j<8;j++) { DQ=0; //每写入一位数据之前先把总线拉低1us i++; DQ=dat&0x01; //然后写入一个数据,从最低位开始 i=6; while(i--); //延时68us,持续时间最少60us DQ=1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat>>=1; } } /******************************************************************************* * 函数名 : Ds18b20ReadByte * 函数功能 : 读取一个字节 * 输入 : com * 输出 : 无 *******************************************************************************/ unsigned char Ds18b20ReadByte() { unsigned char byte,bi; unsigned int i,j; for(j=8;j>0;j--) { DQ=0;//先将总线拉低1us i++; DQ=1;//然后释放总线 i++; i++;//延时6us等待数据稳定 bi=DQ; //读取数据,从最低位开始读取 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/ byte=(byte>>1)|(bi<<7); i=4; //读取完之后等待48us再接着读取下一个数 while(i--); } return byte; } /******************************************************************************* * 函数名 : Ds18b20ChangTemp * 函数功能 : 让18b20开始转换温度 * 输入 : com * 输出 : 无 *******************************************************************************/ void Ds18b20ChangTemp() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令 // Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了 } /******************************************************************************* * 函数名 : Ds18b20ReadTempCom * 函数功能 : 发送读取温度命令 * 输入 : com * 输出 : 无 *******************************************************************************/ void Ds18b20ReadTempCom() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令 } /******************************************************************************* * 函数名 : Ds18b20ReadTemp * 函数功能 : 读取温度 * 输入 : com * 输出 : 无 *******************************************************************************/ int Ds18b20ReadTemp() { int temp=0; unsigned char tmh,tml; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml=Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh=Ds18b20ReadByte(); //再读高字节 temp=tmh; temp<<=8; temp|=tml; return temp; } #ifndef __TEMP_H_#define __TEMP_H_ #include ***it DQ=P3^7; void Delay1ms(unsigned int );unsigned char Ds18b20Init();void Ds18b20WriteCom(unsigned char com);unsigned char Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp(); #endif |
|
相关推荐
6个回答
|
|
真奇怪的提问。。。
编译器又不会帮你检查程序的运行结果,你只要不违反它规定的语法规则,它就会给你通过。 再者,你也没说是怎么个仿真不了。是在电脑上仿真不了,还是下载到芯片仿真不了。 最后,你这个程序贴得让人看着很痛苦,难怪没人回答。 但是,我找到一个有问题的地方,在这里提出来----------------- 在void elec(int temp)这断代码的倒数7行左右,也就是 while(temp>-25) { K=0; } 这有可能是个永远跳不出去的死循环,知道吗?一旦你传进来的参数在 [-24, -15]这个范围内,那你就再也见不到数码管或者LED有什么变化了。 希望这对你有用!!! |
|
|
|
如果我没有猜错的话while后面那个return是放在大括号里面的。
|
|
|
|
首先你的编译器得支持仿真啊。
|
|
|
|
采用的是软件仿真还是JLINK仿真? 软件仿真只需要设置时钟主频率就能得到比较正确的结果
|
|
|
|
仿真不了是说不能硬件仿真嘛,还是你的仿真器的问题,用个例程单独试下查看下
|
|
|
|
这问题
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
811 浏览 0 评论
525 浏览 0 评论
嵌入式学习-搭建自己的ubuntu系统之ubuntu网络设置
646 浏览 0 评论
龙芯中科胡伟武:3B6600 八核桌面 CPU 性能将达到英特尔中高端酷睿 12~13 代水平
710 浏览 0 评论
树莓派Pico 2发布,搭载RP2350双核RISC-V和Arm Cortex-M33微控制器!
670 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10719 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-17 19:55 , Processed in 0.513695 second(s), Total 50, Slave 44 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号