#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[];
uint door;
uchar fushu;
uchar fushu1;
uint temp;
uchar ys;
uchar yskey=20;
uint n=0;
sbit RS =P2^4;
sbit WRD=P2^5;
sbit E=P2^6;
sbit PSB=P2^1;
sbit RES=P2^3;
sbit DQ=P1^7;//ds18b20 端口
sbit ysj_0=P1^1;
//sbit ysj_1=P3^4;
//sbit ysj_2=P3^5;
//sbit ysj_3=P3^6; //控制继电器
sbit KEY_1 = P3^3; //上
sbit KEY_2 = P3^1; //下
sbit KEY_3 = P3^2; //
sbit KEY_4 = P1^2; // 模拟电压是否正常
void lcd_w_gzztpd(void);
void lcd_w_menkg(void);
void LCD_w_wd(uchar add2,int wwd,uchar fs);
void TransferData(char data1,bit DI);
void delayms(uint n);
void delay(uint m);
void lcd_mesg(uchar code *adder1);
void lcd_mesg2(uchar add,uchar code *adder2);
void lcd_w_hz(char address,char *hanzi);
uint ReadTemperature(void);
void Init_DS18B20(void);
uchar ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delayds(unsigned int i);
uchar key(void);
void soft_reset(void);
void znkzysj(void);
uchar code table[]={
"贺州学院"
"--李-袁-陀--"
"机电设计-通信设计-通信设计-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通信-通通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通-通"
"智能控制冰箱"
};
uchar code table1[]={
"预设: ℃"
" "
"当前: ℃"
"工作状态: "
};
uchar code men[]={"----门已打开----"};
uchar code men1[]={"----门已关闭----"};
uchar code gzzt0[]={"--冰箱工作--"};
uchar code gzzt1[]={"--冰箱不工作--"};
uchar code gzzt2[]={
"制冷片工作ON or OFF"
"电压正常吗!"
"正常情况下,请检查电源"
"然后重启冰箱!"
};
/*********************************************************************************/
void initinal(void) //LCD字库初始化程序
{
delay(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式
delay(1); //延时
RES=0; //复位
delay(1); //延时
RES=1; //复位高
delay(10);
TransferData(0x30,0);//Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(100); //大于100uS的延时程序
TransferData(0x30,0);//Function Set
delay(37); 大于37uS的延时程序
TransferData(0x08,0);//Display on Control
delay(100); //大于100uS的延时程序
TransferData(0x10,0);//Cursor Display Control光标设置
delay(100); //大于100uS的延时程序
TransferData(0x0C,0);//Display Control,D=1,显示开
delay(100); //大于100uS的延时程序
TransferData(0x01,0);//Display Clear
delay(10); //大于10mS的延时程序
TransferData(0x06,0);//Enry Mode Set,光标从右向左移动
delay(100); //大于100uS的延时程序
delay(100);//大于100uS的延时程序
lcd_mesg(table); //显示中文汉字
delayms(50);
lcd_mesg(table1);
}
/******************************************************************************/
void main(void)
{
initinal(); //调用LCD字库初始化程序
/* 定时、中断初始化 */
TMOD = 0x10; // T1使用定时模式,工作模式1,无门控位
TH1 = 0x15; // 为T1填入初值,定时时间50ms
TL1 = 0xA0;
ET1 = 1; // 允许定时器1中断
EA = 1; // CPU开放中断
while(1)
{
temp=ReadTemperature();
LCD_w_wd(0x93,temp,fushu);
ys=key();
if(ys>=20){fushu1=0;ys=ys-20;}
else {fushu1=1;ys=20-ys;}
znkzysj();
ys=ys*10;LCD_w_wd(0x83,ys,fushu1);
lcd_w_menkg();
//delayms(50);
lcd_w_gzztpd();
delayms(50);
//delayms(240);
}
}
/*************************以下是12864的代码***********************************/
void lcd_mesg(uchar code *adder1)
{
uchar i;
TransferData(0x80,0); //Set Graphic Display RAM Address
delay(100);
for(i=0;i<32;i++)
{
TransferData(*adder1,1);
adder1++;
}
TransferData(0x90,0); //Set Graphic Display RAM Address
delay(100);
for(i=32;i<64;i++)
{
TransferData(*adder1,1);
adder1++;
}
}
void lcd_mesg2(uchar add,uchar code *adder2)
{ uchar i;
TransferData(add,0); //Set Graphic Display RAM Address
delay(100);
for(i=0;i<16;i++)
{
TransferData(*adder2,1);
adder2++;
}
}
/******************************************************************************/
//温度显示处理并送入LCD的指定区域
void LCD_w_wd(uchar add2,int wwd,uchar fs)
{uchar te1,te2,te3;
te1=wwd/100+48;te2=(wwd/10)%10+48;te3=wwd%10+48;if(te1==48)te1=0x20;
TransferData(add2,0);
if(fs)TransferData(0x2d,1);
else TransferData(0x20,1);
TransferData(te1,1);
TransferData(te2,1);
TransferData(0x2e,1);
TransferData(te3,1);
}
/******************************************************************************/
void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.
{
WRD=0;
RS=DI;
delay(1);
P0=data1;
E=1;
delay(1);
E=0;
}
/******************************************************************************/
void delayms(uint n) //延时10×n毫秒程序
{
uint i,j;
for(i=0;i
for(j=0;j<2000;j++);
}
void delay(uint m) //延时程序
{
uint i,j;
for(i=0;i
for(j=0;j<10;j++);
}
void delayds(unsigned int i)//延时函数
{
while(i--);
}
/******************************************************************************/
//关门与否显示处理
void lcd_w_menkg(void)
{
if(door==1) {lcd_mesg2(0x88,men);};
if(door==0) {lcd_mesg2(0x88,men1);};
}
/******************************************************************************/
//工作状态判断
void lcd_w_gzztpd(void)
{
if(KEY_4==1&&ysj_0==1) lcd_mesg2(0x98,gzzt0);
if(KEY_4==1&&ysj_0==0) lcd_mesg2(0x98,gzzt1);
if(KEY_4==0)
{ysj_0=0;TR1=0; lcd_mesg(gzzt2);
while(KEY_4==0);
soft_reset();}
}
/***********************以上是12864的代码**************************************/
/*********************以下是DS18B20 的代码************************************/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delayds(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delayds(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delayds(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delayds(5);
}
//读一个字节
unsigned char 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;
delayds(5);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delayds(5);
DQ = 1;
dat>>=1;
}
delayds(5);
}
//读取温度
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delayds(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
if(b&0x80)
{fushu=1;b=0xff-b;a=0xff-a;}
else fushu=0;
t=(b<<8)+a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/******************************************************************************/
uchar key(void)
{
if(!KEY_1)
{
delay(10); //去抖
if(!KEY_1)
{ yskey++;
if(yskey>40)yskey=40;
}
}
if(!KEY_2)
{
delay(10); //去抖
if(!KEY_2)
{ yskey--;
if(yskey<=1)yskey=1;
}
}
if(!KEY_3)door=0;else door=1;
return(yskey);
}
/**************************************************************************/
void znkzysj(void)//智能控制制冷片工作
{
if(fushu==0&&fushu1==0){if(ys<=temp/10)TR1=1;else {ysj_0=0;TR1=0;n=0;}}
if(fushu==0&&fushu1==1)TR1=1;
if(fushu==1&&fushu1==0){ysj_0=0;TR1=0;n=0;}
if(fushu==1&&fushu1==1){if(ys<=temp/10){ysj_0=0;TR1=0;n=0;}else TR1=1;}
}
/**************************************************************************/
/* T1溢出中断处理函数 */
void timer1_int() interrupt 3 using 2 // T1溢出中断,使用工作组2
{
n++;
if(n!=500){ TH1= 0x15; // 重新填入初值
TL1= 0xA0;}
else {ysj_0=1;n=0;TR1=0;}
}
/**************************************************************************/
void soft_reset(void)
{
((void(code*)(void))0x0000)();
}
/*在需要软件复位的地方使用语句:
soft_reset();
一般可实现软件复位。*/