锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机电冰箱控制系统PCB原理图+源程序设计

时间:2023-03-02 16:30:00 继电器t1tr50继电器

#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();

一般可实现软件复位。*/

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章