📄 程序(若上面的工程文件打不开用这个).txt
字号:
#include"reg52.h"
#define led P1 //宏定义P1口为数码管的数据口
sbit key1=P2^4; //将P2^4口映射为变量key1
sbit key2=P2^5; //将P2^3口映射为变量key2
sbit key3=P2^6; //将P2^2口映射为变量key3
sbit key4=P2^7; //将P2^1口映射为变量key4
sbit ch1=P2^3; //通过三极管进行位选,,将P2^3口映射为变量ch1
sbit ch2=P2^2;
sbit ch3=P2^1;
sbit ch4=P2^0;
sbit DQ=P0^2; //DQ为ds18b12温度传感器的参数
sbit ji=P0^1; //将P0^1口映射为变量ji,是用来驱动电机的三极管,低电平有效
sbit deng=P0^3; //将P0^3口映射为变量deng,是用来驱动发光二极管,低电平有效
sbit feng=P0^0; //将P0^0口映射为变量feng,是用来驱动蜂鸣器的三极管,低电平有效
unsigned char code shu[]={0x88,0xf9,0xc4,0xe0,0xb1,0xa2,0x82,0xf8,0x80,0xa0};
//在rom的code区定义数组shu[],长度为10,存放的是不带小数点的0-9数码管显示数据
unsigned char code shu2[]={0x08,0x79,0x44,0x60,0x31,0x22,0x02,0x78,0x00,0x20};
//在rom的code区定义数组shu2[],长度为10,存放的是有小数点的0-9数码管显示数据
void ms(unsigned int Delay) //延时1毫秒的延时函数
{unsigned int a;
for(;Delay>0;Delay--)
{for(a=0;a<114;a++)
{;}
}
}
/***************************************************
功能函数:延时
入口参数:time
****************************************************/
//延时函数
void xdelay(unsigned int i) //ds18b20 的延时函数
{
while(i--);
}
/****************************************************
功能函数:DS18b20初始化
入口参数:
****************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
xdelay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
xdelay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
xdelay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
xdelay(20);
}
/******************************************************
功能函数:向DS18b20读一字节数据
入口参数:
******************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
xdelay(4);
}
return(dat);
}
/******************************************************
功能函数:向DS18b20写一字节数据
入口参数:
******************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
xdelay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************
功能函数:向DS18b20读温度值
入口参数:
出口参数:t
******************************************************/
unsigned ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
main()
{
unsigned int k=0;
int a,b,c,d; //定义存放温度数值的变量a,b,c,d
int w=0,x=2,y=8;
while(1)
{
while(1) //显示当前温度的死循环函数
{
k=ReadTemperature(); //把ds18b20读出的值赋给变量m
a=k/1000; //将温度的最高位赋给a
b=k%1000/100; //将温度的次高位赋给b
c=k%100/10; //将温度的次次高位赋给c
d=k%10; //将温度的最低位赋给d
ch1=0; //通过每一位的三极管关断来控制该位是否亮灭,同时将
//温度传感器采回的数值分别发送到数码管上
led=shu[d];
ms(1);
ch1=1;
ch2=0;
led=shu2[c];
ms(1);
ch2=1;
ch3=0;
led=shu[b];
ms(1);
ch3=1;
ch4=0;
led=shu[a];
ms(1);
ch4=1;
if(c>=y) //判断是否大于预置安全温度
{
if(b>=x)
{
deng=0;
ji=0;
feng=0;
}
if(b<x)
{
deng=1;
ji=1;
feng=1;
}
}
if(c<y)
{
if(b>x)
{
deng=0;
ji=0;
feng=0;
}
if(b<=x)
{
deng=1;
ji=1;
feng=1;
}
}
if(key1==0) break;
}
while(1) //显示进入预设温度显示的死循环函数
{
ch1=0;
led=shu[0];
ms(1);
ch1=1;
ch2=0;
led=shu2[y];
ms(1);
ch2=1;
ch3=0;
led=shu[x];
ms(1);
ch3=1;
ch4=0;
led=shu[w];
ms(1);
ch4=1;
if(key2==0)
{
ms(500);
y++;
if(y>9)y=0;
}
if(key3==0)
{
ms(500);
x++;
if(x>9)
{
w=1;
x=0;
}
if(w>1)w=0;
if(w==1)
{
if(x>2)
{
x=2;
y=5;
}
}
}
if(key4==0)
{
ms(500);
x--;
if(x<0)
{
x=9;
w=0;
}
}
if(key1==0)break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -