找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

为什么我的18B20+89s52显示温度大于61度便出错

[复制链接]
admin 发表于 2012-9-4 03:48:43 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
程序如下,C写的:
#include<reg51.h>
#include<absacc.h>
unsigned char code tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P2_0=P2^0; //数码管千位定义
sbit P2_1=P2^1; //数码管百位定义
sbit P2_2=P2^2; //数码管十位定义
sbit P2_3=P2^3; //数码管个位定义
sbit P1_0=P1^0; //1820检测状态指示
sbit DQ=P1^1; //数据传输线与单片机相连的引脚
sbit alARM=P1^7; //蜂鸣器引脚
unsigned char tempL=0; //设全局变量
unsigned char tempH=0;
unsigned int temperature; //温度值保存在temperature里
void delay(unsigned int time) //延时子程序
{
unsigned int n;
n=0;
while(n<time)
{n++;}
return;
}
void delay1(void) //数码管显示延时子程序
{
int k;
for(k=0;k<600;k++);
}
void display(int k) ////数码管显示子程序
{
P2_0=0; //显示千位
P0=tab[k/1000];
delay1();
P2_0=1;
P2_1=0; //显示百位
P0=tab[k/100];
delay1();
P2_1=1;
P2_2=0; //显示十位
P0=tab[k%100/10];
delay1();
P2_2=1;
P2_3=0; //显示个位
P0=tab[k%10];
delay1();
P2_3=1;
}

Init_DS1B820(void)//1820初始化子程序
{
unsigned char x=0; //
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(120); //延时(>480us)
DQ=1; // 拉高数据线
delay(10); //等待(15——60us)
x=DQ; //用x值来判断1820初始化有没有成功1820存在的话x=0,否则x=1
if(x==1)
{P1_0=0; //1820检测不到,LED亮
}
else
P1_0=1;
return(x);
}
ReadOneChar(void) //向1820读一字节数据
{
unsigned char i=0; //主机数据线先从高拉低1ms以上,再拉高,从而产生读信号
unsigned char dat=0;//每个读周期最短的持续时间为60ms,各个读周期之间必须有1ms以上的高电平恢复期
for(i=8;i>0;i--)//一个字节8位
{
DQ=1;
delay(1);
DQ=0;
dat >>=1; //右移一位
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
WriteOneChar(unsigned char dat) //向1820写一字节数据
{
unsigned char i=0;
for(i=8;i>0;i--) //数据线从高电平拉至低电平,产生写起始信号
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1; //右移一位
}
delay(4);
return(dat);
}
ReadTemperature(void) //向1820读温度值
{
Init_DS1B820(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //延时用于温度转换至少200uS
Init_DS1B820(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
temperature=(tempH*16+tempL/16);//温度转换 (此处舍去小数部分即tempL低四位)
delay(200);
return (temperature);
}
void main()
{
alarm=1;
P1=0xff;
while(1)
{
unsigned int i;
i=ReadTemperature(); //读出温度
display(i); //显示温度
if(i>80) //如果温度大于80度
{
alarm=0; //报警
}
else //温度小于设定值,解除报警
alarm=1;
}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-30 02:14 , Processed in 0.052215 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表