📄 wenkongxitong.c
字号:
#include<reg52.h>
#include<stdio.h>
#include <intrins.h>
#define unchar unsigned char
#define unint unsigned int
sbit warmer=P2^1;
sbit heat1=P2^2;
sbit heat2=P2^3;
sbit cool= P2^4;
sbit redled=P2^5;
sbit greled=P2^6
/******************************************************************************/
/******************************************************************************/
键盘扫描
/******************************************************************************/
/*******************************************************************************/
void delay0()
{
unchar m,n;
for(m=10;m>0;m--)
for(n=100;n>0;n--);
}
unsigned char Getch()
{
unchar X,Y,Z,k;
unchar su[3]={0,5,0};
P0=0x0f; /*先寻P1置数 行扫描*/
if(P0!=0x0f) /*判断是否有按键按下*/
{
delay0(); //延时,软件去干扰
if(P0!=0x0f) //确认按键下X=P1;
{
X=P0; /*保存行扫描时有按键按下状态*/
P0=0xf0; //列扫描
Y=P0; //保存列扫描时有按键按下时的状态
Z=X|Y; //取出键值
switch(Z) //判断键值(那一个按键按下)
{
case 0xee:k=0;break; //对键值赋值
case 0xde:k=1;break;
case 0xbe:k=2;break;
case 0x7e:k=3;break;
case 0xed:k=4;break;
case 0xdd:k=5;break;
case 0xbd:k=6;break;
case 0x7d:k=7;break;
case 0xeb:k=8;break;
case 0xdb:k=9;break;
case 0xbb:k=10;break;
case 0x7b:k=11;break;
case 0xe7:k=12;break;
case 0xd7:k=13;break;
case 0xb7:k=14;break;
case 0x77:k=15;break;
}
su[2]=a[1];
su[1]=a[0];
su[0]=k;
while(Z!=0xff)
{
P0=0xf0;
X=P0; //保存行扫描时有按键按下状态
P0=0xf0; //列扫描
Y=P0; //保存列扫描时有按键按下状态
Z=X|Y; //取出键值
display0();
}
}
}
return(su);
}
/******************************************************************************/
//****************************************************************************//
温度测量
/******************************************************************************/
//****************************************************************************//
sbit DQ =P2^0; //定义通信端口
//延时函数
unsigned char delay1(unsigned int i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay1(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay1(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay1(20);
}
//读一个字节
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;
delay1(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay1(4);
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
a=a>>4; //低位右移4位,舍弃小数部分
t=b<<4; //高位左移4位,舍弃符号位
t=t|a;
return(t);
}
/******************************************************************************/
//****************************************************************************//
温度值显示
/******************************************************************************/
//****************************************************************************//
sbit RS=P3^7; /*P2.0 LCD 的RS 21*/
sbit RW=P3^6; /*P2.1 LCD 的R/W 22*/
sbit E=P3^5; /*P2.4 LCD 的E 25*/
/*P0 LCD 数据为0X80,P1为0x90,D0=P0.0*/
//sfr赋给地址
sfr LcdBus=0x90;
/*延时10ms函数***********************/
void delay2(unsigned char count)
{
unsigned char j,k;
while(count--!=0)
{
for(j=0;j<43;j++)
for(k=0;k<73;k++);
}
}
/*检查LCD 忙*/
bit Lcd_CheckBusy()
{
register LcdState;
delay2(10); //控制字符显示速度
RS=0; /*RS=1为数据,=0为命令.*/
RW=1; /*RW=1为读,=0为写.*/
E=0;
_nop_();
E=1; /*E=1选通.*/
LcdState=LcdBus;
E=1;
return((bit)(LcdState&0x80)); //与运算,取高位
}
/*写LCD 命令*/
void WriteCmd(unsigned char LcdCmd)
{
while(Lcd_CheckBusy());
LcdBus=LcdCmd;
RS=0; /*RS=1为数据,=0为命令.*/
RW=0; /*RW=1为读,=0为写.*/
E=1; /*E=1选通.*/
_nop_();
E=0;
LcdBus=0xff;
}
/*在当前显示位置显示数据*/
void WriteOneByte(char LcdData)
{
while(Lcd_CheckBusy());
LcdBus=LcdData;
RS=1; /*RS=1为数据,=0为命令.*/
RW=0; /*RW=1为读,=0为写.*/
E=1; /*E=1选通.*/
_nop_();
E=0;
LcdBus=0xff;
}
/*在当前显示位置显示LCD 字符串*/
void WriteData(char *strpoint)
{
register i=0;
while(strpoint[i]!=0)
{
WriteOneByte(strpoint[i]);
i++;
}
}
/*初始化*/
void lcd_init()
{
WriteCmd(0x38); /*设置8 位格式,2 行,5*7*/
WriteCmd(0x0c); /*整体显示,0x0f为开光标,闪烁,0x0c为关光标,不闪烁*/
//WriteCmd(0x06); /*设定输入方式,增量不移位*/
//WriteCmd(0x01); /*清除显示*/
}
//-----------------------
//main开始
//----------------------
void display(void)
{
unsigned char a[]={'n','o','w',':',0,0,0,'.','0',250,'c'};
unsigned char b[]={0,0,0,'.','0'};
unsigned char tt=ReadTemperature();
unsigned char kk=Getch();
b[0]=((kk/100)%10)+48;
b[1]=((kk/10)%10)+48;
b[2]=(kk%10)+48;
b[6]='\0';
a[4]=((tt/100)%10)+48; // a[4]=((tt*10/2/1000)%10)+48;
a[5]=((tt/10)%10)+48;
a[6]=(tt%10)+48; // a[5]=((tt*10/2/100)%10)+48;
a[11]='\0'; // a[6]=((tt*10/2/10)%10)+48;
// a[11]='\0';
lcd_init();
/*******写第二行***************/
WriteCmd(0xc0);
WriteData(a);
/********写第一行***************/
WriteCmd(0x80);
WriteData("Input:");
WriteData(b);
}
/*==========================中断程序======================================*/
void leng_re() interrupt 0
{
cool=0;IE=0;
}
/*-------------------------主函数开始----------------------------*/
void main()
{
EA=1;EX0=1;
unchar tem,gkey,
while(1){
ReadTemperature(); //温度测量
display(); //温度显示
Getch(); //键盘扫描
display();
gkey= Getch();
tem= ReadTemperature();
if(tem-gkey>=20){IE0=1;}
if(tem<gkey)
{ cool=1; heat1=0; } //关风扇,同时启动一个热得快。
if(tem==gkey){heat1=1; heat2=1;cool=1;} // 不采取措施
if(tem>gkey)
{heat1=1; heat2=1;cool=0;} //关热得快,启动风扇。
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -