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

请帮忙做个详细的解释 我自己看不懂

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

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

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

×
#include <AT89X51.h>
#include "lcd1602.h"

#define uchar unsigned char
#define uint unsigned int


uchar t0,t1,t2;
uchar data disdata[5];
uint wendu; //温度值
uchar biao; //温度正负标志
char c=0;

char a=5;
uchar b;

sbit DQ=P1^7; //ds18b20与单片机连接口
sbit green=P3^5;
sbit red=P3^6;
sbit baojin=P3^7;

void delay_18B20(unsigned int i) //延时1微秒
{
while(i--);
}

void ds1820rst() //ds1820复位
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}

uchar ds1820rd() //读一字节数据
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}

void ds1820wr(uchar wdata) //写一字节数据
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}

read_temp()/*读取温度值并转换*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度寄存器等(共可读9个寄存器) 前两个就是温度*/
a=ds1820rd(); //低位
b=ds1820rd(); //高位
wendu=b;
wendu<<=8;
wendu=wendu|a;
if(wendu<0x0fff) biao=0;
else
{
wendu=~wendu+1;
biao=1;
}
wendu=wendu*(0.625);//温度值扩大10倍,精确到1位小数
return(wendu);
}

void ds1820disp()//温度值显示
{
uchar flagdat;
disdata[0]=wendu/1000+0x30;//百位数
disdata[1]=wendu%1000/100+0x30;//十位数
disdata[2]=wendu%100/10+0x30;//个位数
disdata[3]=wendu%10+0x30;//小数位

if(biao==0) flagdat=0x20;//正温度不显示符号
else flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30) disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
wr_com(0x86);
wr_dat(flagdat);//显示符号位
wr_com(0x87);
wr_dat(disdata[0]);//显示百位
wr_com(0x88);
wr_dat(disdata[1]);//显示十位
wr_com(0x89);
wr_dat(disdata[2]);//显示个位
wr_com(0x8a);
wr_dat(0x2e);//显示小数点
wr_com(0x8b);
wr_dat(disdata[3]);//显示小数位
delay_18B20(100);
}

void shezhi() //设置显示
{
if(a<0) {c=256-a;wr_com(0xc8); wr_dat(0x2d);} //如果温度值低于0则转换成正值显示
else {c=a;wr_com(0xc8); wr_dat(0x20);} //否则直接显示
t0=c/100; wr_com(0xc9); wr_dat(t0+0x30); //显示百位
t1=c/10%10; wr_com(0xca); wr_dat(t1+0x30); //显示十位
t2=c%10; wr_com(0xcb); wr_dat(t2+0x30); //显示个位
delay_18B20(10);
}

void int0(void) interrupt 0 using 0
{
a--;
//shezhi();
}


void int1(void) interrupt 2 using 0
{
a++;
//shezhi();
}

void tiaokong() //控制温度
{
b=wendu/10;
if(b>c) {green=1;red=0;baojin=1;}
else if(b<c) {green=0;red=1;baojin=0;}
else {green=1;red=1;baojin=1;}
}

void main()
{
TMOD=0x01;
// PT0=1;
IE0=1;
EX0=1;
IT0=1; //外部中断0 用于紧急状况
//ET0=1;
//TR0=1; //定时器0 定时1s时间
IE1=1;
EX1=1;
IT1=1; //外部中断1 用于设定灯的时间
//ET1=1;
//TR1=1; //定时器1 用于显示时间

PX0=1; //外部中断1的优先级
PX1=1; //外部中断0的优先级
EA=1; //开中断
rest();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
shezhi();
tiaokong(); //控制温度
}
}

5_101576_4ef1303d0afa074.jpg
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2024-11-29 03:41 , Processed in 0.053191 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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