📄 lesson7.c
字号:
#include <AT89X52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define flag1 F0 //18b20存在标志
sbit io=P2^2;
sbit key1=P1^0; //查看温度上下限
sbit key2=P1^1; // 减1
sbit key3=P1^2; // 加1
sbit duan=P2^6;
sbit wei=P2^7;
uchar count; //key1按下的次数
uchar code disp[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0xbf,0xff//显示"-",不显示
}; // 16, 17
uchar code xiaoshu[16]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar a,b,h,l;//从ds18b20读出来的数据
uchar shi,ge,xiao,temp;
uchar delay1; //作延时用
void delay(uint i); //延时11us *i
void deal_with();
void display();
void reset();
uchar read(); //读一个字节
void write(uchar dat); //写一个字节到ds18b20
void set(); //改变温度上下限和精度
void copy();//复制温度上下限到ROM
void check(); //把当前温度与上下限比较
void main()
{
while(1)
{
reset();
while(flag1)
{
beep();
reset();
}
reset();
write(0xcc);// 跳过读序号列号的操作
write(0x44); // 启动温度转换
reset();
write(0xcc);// 跳过读序号列号的操作
write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=read(); //温度低位
b=read(); //温度高位
h=read(); //温度上限
l=read(); //温度下限
if(count==0) //如果无键按下
deal_with();
display();
keyscan();
check();
}
}
void delay(uint i) //延时11us *i
{
while(i--);
}
void deal_with()
{
b=b<<4; //舍弃符号位
xiao=a;
a=a>>4; //舍弃小数
xiao=xiao&0x0f;//得到小数
temp=b|a; //得到温度整数部分
shi=temp/10;
ge=temp%10;
}
void display()
{
uchar d;
duan=1;
P0=disp[shi];
duan=0;
wei=1;
P0=0x01;
delay(100);
P0=0;
wei=0;
duan=1;
d=disp[ge];
P0=d&0x7f;//显示小数点
duan=0;
wei=1;
P0=0x02;
delay(100);
P0=0;
wei=0;
duan=1;
P0=disp[xiaoshu[xiao]];
duan=0;
wei=1;
P0=0x04;
delay(100);
P0=0;
wei=0;
duan=1;
P0=disp[12];//显示"C"
duan=0;
wei=1;
P0=0x08;
delay(100);
P0=0;
wei=0;
}
void reset()
{
flag1=1;
io=1;
delay(8); //稍做延时
io=0;
delay(80);//延时大于480us
io=1;
delay(6);
flag1=io;//如果flag是0,则初始化成功
delay(20);
}
uchar read() //读一个字节
{
uchar k,dat=0;
for(k=0;k<8;k++)
{
io=0;
dat>>=1;
io=1;
if(io)
dat=dat|0x80;
delay(4);
}
return dat;
}
void write(uchar dat) //写一个字节到ds18b20
{
uchar j;
for(j=0;j<8;j++)
{
io=0;
dat=dat>>1; //把dat的最低位送到io口
io=CY;
delay(5);
io=1;
delay1=1; //延时2us
}
delay(4);
}
void set() //改变温度上下限和精度
{
reset();
write(0xcc);// 跳过读序号列号的操作
write(0x4e);//把设定的温度值写入寄存器
write(h);//温度上限
write(l); //下限
write(0x7f);//12位精度
}
void copy()//复制温度上下限到ROM
{
reset();
write(0xcc);// 跳过读序号列号的操作
write(0x48);//把温度上下限寄存器的内容写入到ROM
}
void check() //把当前温度与上下限比较
{
if((temp>h)||(temp<l))
beep();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -