前期是用51单片机做的,后面会更新32制作图
Altium Designer画的电路原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #include <stdio.h>
- #include <math.h>
- #include <reg52.h>
- #include <string.h>
- #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,光标从右向左加1位移动
- 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<n;i++)
- for(j=0;j<2000;j++);
- }
- void delay(uint m) //延时程序
- {
- uint i,j;
- for(i=0;i<m;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();
- 一般可实现软件复位。*/
复制代码
所有资料51hei提供下载:
电冰箱温控器设计.rar
(5.4 MB, 下载次数: 113)
|