本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
//使用AT89C2051单片机,12MHZ晶振,用共阳LED数码管
#include "reg2051.h"
#include "intrins.h" //_nop_();延时函数用
#define Disdata P1 //段码输出口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^2; //温度输入口
sbit wei1=P3^7;
sbit wei2=P3^1;
sbit wei3=P3^0;
sbit sw=P3^3;
bit Error_DS18B20;
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
uchar xs,zs;
uchar cnt;
//
//
/*****************11us延时函数*************************/
//
void delay(uint t)
{
for (;t>0;t--);
}
//
void Delay15(uchar n)//15us延时
{
do
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();
n--;
}
while(n);
}
void Delayms(uint number)//延时程序
{
int num;
for(;number>0;number--)
// for(num=112;num>0;num--);
num=112;
while((num--)>=0) ;
}
/****************显示扫描函数***************************/
void display1(uchar da,uchar da1)//显示
{
Disdata=dis_7[da/10];
wei1=0;
Delayms(6);
wei1=1;
Disdata=dis_7[da%10];
wei2=0;
Delayms(6);
wei2=1;
Disdata=dis_7[da1];
wei3=0;
Delayms(6);
wei3=1;
}
//
//
/****************DS18B20复位函数************************/
bit ow_reset(void)
{
DQ=0;
Delay15(36);
DQ=1;
Delay15(6);
Error_DS18B20=DQ;
Delay15(18);
DQ=1;
return(Error_DS18B20);
}
//
//
/****************DS18B20写命令函数************************/
//向1-WIRE 总线上写1个字节
void WR18B20(uchar d)
{
uchar i;
ACC=d;
for(i=8;i>0;i--)
{
DQ=0;
Delay15(1);
ACC=ACC>>1;
DQ=CY;
Delay15(3);
DQ=1;
}
}
//
/****************DS18B20读1字节函数************************/
//从总线上取1个字节
uchar RD18B20(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
delay(6); //66 us
}
return(value);
}
void Convert(void)
{
while(ow_reset());
WR18B20(0xcc);
WR18B20(0x44);
}
void ReadT(void)
{
uchar a,b;
while(ow_reset());
WR18B20(0xcc);
WR18B20(0xbe);
a=RD18B20();
b=RD18B20();
display[4]=a&0x0f; //取低字节的低4位--小数部分
xs=ditab[display[4]]; //存放小数部分
zs=((a&0xf0>>4)|((b&0x0f)<<4));//取整数部分
}
void Time_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
}
void time1(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
if(cnt==18)
{
ReadT();
}
if(cnt==19)
{
Convert();
}
if(cnt==20)
{
cnt=0;
}
}
/****************主函数************************/
main()
{
Time_init();
while(ow_reset());//开机先启动
WR18B20(0xcc);
WR18B20(0x44);
while(1)
{
display1(zs,xs);
}
}
//
程序仿真后温度显示不稳定 总是16度到正常温度之间跳动 希望高手指点小弟 |