本帖最后由 deasonata 于 2013-3-9 19:55 编辑
- #include<reg52.h>
- #include<intrins.h>
- #define displaytime 100 //等待扫描数码管显示次数
- #define delayT 30
- unsigned char code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- sbit DQ=P3^7;
- sbit D0=P3^0;
- sbit D1=P3^1;
- /***********************
- 延时
- ********************* */
- void delay(us)
- {
- for(;us>0;us--);
- }
- void Delay500us() //Delay500us()
- {
- unsigned char i;
- _nop_();
- i = 247;
- while (--i);
- }
- void Delay60us() //Delay60us()
- {
- unsigned char i;
- _nop_();
- i = 27;
- while (--i);
- }
- void Delay10us() //Delay10us()
- {
- unsigned char i;
- _nop_();
- i = 2;
- while (--i);
- }
- void Delay6us() //Delay6us()
- {
- _nop_();
- _nop_();
- }
- /***********************
- 按位读取
- ********************* */
- char Read_byte()
- {
- char i,date=0;
- for(i=8;i>0;i--)
- {
- date>>=1; //右移一位
- DQ=0; //拉低总线
- Delay6us(); //延时6us
- DQ=1; //释放总线
- Delay6us(); //延时6us
- if(DQ==1)
- date=(0x80|date); //数据最高位写入1
- Delay60us(); //延时60us
- // date>>=1; //右移一位
- }
- return date;
- }
- /***********************
- 按位写入
- ********************* */
- void Write_byte(char date)
- {
- char i;
-
- for(i=8;i>0;i--)
- {
- DQ=0; //拉低总线
- Delay10us(); //延迟10us
- DQ=date&0x01; //总线发送最低位
- Delay60us(); //延迟60us
- DQ=1; //释放总线
- date>>=1; //数据右移一位
- }
- }
- /***********************
- 复位
- ********************* */
- void Reset(void)
- {
- char present;
- while(present)
- { //总线高电平,开始复位。低电平结束复位
- DQ=0; //拉低总线
- Delay500us(); //延迟500us
- DQ=1; //拉高总线
- Delay60us();
- if(DQ==0)
- present=0;
- else
- present=1;
- }
- Delay500us(); //延迟500毫秒
- }
- /***********************
- 数码管显示
- ********************* */
- void Led_display(char temp)
- {
- D0=1;
- P2=LED[temp/10];
-
- delay(delayT);
- D0=0;
- P2=0xff;
- delay(delayT);
-
- D1=1;
- P2=LED[temp%10];
- delay(delayT);
- D1=0;
- P2=0xff;
- delay(delayT);
- }
- /***********************
- 温度转换
- ********************* */
- char Temp_change(char temp)
- {
- char i,th,tl;
- Reset(); //复位
- Write_byte(0xcc); //跳过ROM指令
- Write_byte(0x44); //温度转换指令
- for(i=displaytime;i>0;i--)
- Led_display(temp); //等待温度转换时间,数码管显示
- Write_byte(0xcc); //跳过ROM指令
- Write_byte(0xbe); //读取温度
- tl=Read_byte(); //读低八位
- th=Read_byte(); //读高八位
- tl>>=4; //低位去小数点
- th<<=4; //去符号位,留下最高符号位
- if(th&0x80==0x80) //判断符号位
- temp=-1; //最高位是1,负数
- else
- temp=1; //否则就是正数
- th&=0x7f; //取出最高位的符号位
- temp=temp*(th+tl); //高位低位相加,乘以符号
- return temp; //返回温度数据
- }
- /***********************
- 初始化
- ********************* */
- void Init(void)
- {
- D0=0;
- D1=0;
- }
- /***********************
- 主函数
- ********************* */
- void main()
- {
- char temp=0;
- Init();
- while(1)
- {
- temp=Temp_change(temp);
- Led_display(temp);
- }
- }
复制代码数码管显示部分单独测试过,没有问题,但是就是温度显示不出。!求高手解答
附:原理图和代码部分
-
-
DS18B20.zip
下载积分: 积分 -1 分
48.47 KB, 下载次数: 25, 下载积分: 积分 -1 分
一周热门 更多>