前期是用51單片機做的,后面會更新32制作圖
Altium Designer畫的電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (52.59 KB, 下載次數(shù): 63)
下載附件
2019-7-21 15:44 上傳
0.png (25.52 KB, 下載次數(shù): 59)
下載附件
2019-7-21 15:45 上傳
0.png (8.42 KB, 下載次數(shù): 46)
下載附件
2019-7-21 15:45 上傳
單片機源程序如下:
- #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[]={
- "預設: ℃"
- " "
- "當前: ℃"
- "工作狀態(tài): "
- };
- 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(); //調(diào)用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的指定區(qū)域
- 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) //傳送數(shù)據(jù)或者命令,當DI=0是,傳送命令,當DI=1,傳送數(shù)據(jù).
- {
- 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)//延時函數(shù)
- {
- while(i--);
- }
- /******************************************************************************/
- //關門與否顯示處理
- void lcd_w_menkg(void)
- {
- if(door==1) {lcd_mesg2(0x88,men);};
- if(door==0) {lcd_mesg2(0x88,men1);};
- }
- /******************************************************************************/
- //工作狀態(tài)判斷
- 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初始化函數(shù)
- 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);
- }
- //讀一個字節(jié)
- 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);
- }
- //寫一個字節(jié)
- 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); // 啟動溫度轉(zhuǎn)換
- 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溢出中斷處理函數(shù) */
- 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();
- 一般可實現(xiàn)軟件復位。*/
復制代碼
所有資料51hei提供下載:
電冰箱溫控器設計.rar
(5.4 MB, 下載次數(shù): 113)
2019-7-21 10:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|