Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
烘手機.png (128.96 KB, 下載次數: 96)
下載附件
原理圖
2019-10-20 10:57 上傳
控制板.png (156.65 KB, 下載次數: 72)
下載附件
原理圖
2019-10-20 10:57 上傳
0.png (41.19 KB, 下載次數: 72)
下載附件
2019-10-21 01:20 上傳
0.png (43.34 KB, 下載次數: 81)
下載附件
2019-10-21 01:21 上傳
單片機源程序如下:
- #include "reg51.h"
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define T1MS 0x11
- #define T2MS 0x19
- #define WT_30M 0x80
- #define WT_24M 0x81
- #define WT_20M 0x82
- #define WT_12M 0x83
- #define WT_6M 0x84
- #define WT_3M 0x85
- #define WT_2M 0x86
- #define WT_1M 0x87
- sfr ADC_CONTR = 0xbc;
- sfr ADC_RES = 0xbd;
- sfr ADC_RESL = 0xbe;
- sfr ADCCFG = 0xde;
- sbit EADC = IE^5;
- sfr IAP_DATA = 0xC2;
- sfr IAP_ADDRH = 0xC3;
- sfr IAP_ADDRL = 0xC4;
- sfr IAP_CMD = 0xC5;
- sfr IAP_TRIG = 0xC6;
- sfr IAP_CONTR = 0xC7;
- sfr AUXR = 0x8e;
-
- sfr P4M0=0xb4;
- sfr P4M1=0xb3;
- sfr P2M0=0x96;
- sfr P2M1=0x95;
- sfr P5M1=0xc9;
- sfr P5M0=0xca;
- sfr P1M0 = 0x92;
- sfr P1M1 = 0x91;
- bit M2wei=0,M3wei=1,M1wei=1,adcwei=0;
- sbit ACC_7 = ACC^7;
- sbit shoudong=P3^3;
- sbit M2kg=P3^4;
- sbit set=P3^5;
- sbit jia=P3^6;
- sbit jian=P3^7;
- sbit in=P2^2;
- sbit M3=P2^3;
- sbit M2=P2^4;
- sbit M1=P2^5;
- sbit M1hong=P1^0;
- sbit M1lv=P1^1;
- sbit M2hong=P1^2;
- sbit M2lv=P1^3;
- sbit M3hong=P1^4;
- sbit M3lv=P1^5;
- unsigned char data time[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- unsigned char code shuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
- unsigned char xdata bb=0,pp=2,oo=6,ii=3,uu=0,ll=2,pp1=2,oo1=6,ii1=3,uu1=4,pp2=2,oo2=6,ii2=3,uu2=4,adc1=0,adc2=0,adc3=0;
- unsigned int aa=0,aa1=0,qq=0,qq1=0,ww=0,dingshi=0,cc=0,cc1=0,cc2=0,cc3=0,cc4=0,cc5=0;
- unsigned char xdata trg=0,cont=0,read=0,trg1=0,cont1=0,read1=0,trg2=0,cont2=0,read2=0,trg3=0,cont3=0,read3=0,jian1=0,jian2=0,jian3=0,jian4=0,jiehuan=1;
- float dian;
- unsigned int vcc=0,res=0,chu=0,y=0,t=0,r=0,tvalue=0,v=0;
- unsigned char fen=0,miao=0,miao1=0,miao2=0,miao3=0,miao4=0,miao5=0,miao6=0,anjianshijian=0;
- bit fg=0,fg1=0,fg2,fg3,wei=0,wei1=0,wei2=0,dianjiwei=1,wei3=0,shoudong1=0,shoudong2=0,shoudong3=0,shoudong4=0,shoudongwei=0; //溫度正負標志
-
- void delay1(uint i)
- {
- uint j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void TM0() interrupt 1
- {
- aa++;
- bb++;
- switch(ll)
- { case 1: //顯示1 溫度顯示
-
-
-
- switch(bb)
- {
- case 1:
- P0=shuzi[pp];
- P4=0x02;
- break;
- case 2:
- P0=shuzi[oo];
- P4=0x04;
- break;
- case 3:
- P0=shuzi[ii];
- P4=0x08;
- break;
- case 4:
- P0=shuzi[uu];
- P4=0x10;
- break;
- case 5:
- P0=shuzi[10];
- P4=0x04;
- break;
- }
- if(bb==6)
- {bb=0;}
- break;
- case 2: // 顯示2 定時顯示
-
- switch(bb)
- {
- case 1:
- P0=shuzi[pp1];
- P4=0x02;
- break;
- case 2:
- P0=shuzi[oo1];
- P4=0x04;
- break;
- case 3:
- P0=shuzi[ii1];
- P4=0x08;
- break;
- case 4:
- P0=shuzi[uu1];
- P4=0x10;
- break;
- case 5:
- P0=shuzi[10];
- P4=0x04;
- break;
- }
- if(bb==6)
- {bb=0;}
- break;
- case 3: //xianshi 3 定時顯示 分
- read=jia^0xff;
- trg=read&(read^cont);
- cont=read;
- if(trg==1)
- {
- ww++;
- fen=0;
- miao=0;
- if(ww>=31)
- {ww=1;}
- }
- read1=jian^0xff;
- trg1=read1&(read1^cont1);
- cont1=read1;
-
- if(trg1==1)
- {
- fen=0;
- miao=0;
- delay1(15);
- ww--;
- if(ww<=0)
- {ww=30;}
- }
- switch(bb)
- {
- case 1:
- P0=shuzi[ww/10]; // 分延遲
- P4=0x02;
- break;
- case 2:
- P0=shuzi[ww%10];
- P4=0x04;
- break;
- case 3:
- P0=shuzi[cc3/10];
- P4=0x00;
- break;
- case 4:
- P0=shuzi[cc3%10];
- P4=0x00;
- break;
- case 5:
- P0=shuzi[10];
- P4=0x00;
- break;
- }
- if(bb==6)
- {bb=0;}
- break;
- case 4: //xianshi 4 定時顯示 秒
- read=jia^0xff;
- trg=read&(read^cont);
- cont=read;
- if(trg==1)
- {
- cc3++;
- if(cc3>=31)
- {cc3=1;}
- }
- read1=jian^0xff;
- trg1=read1&(read1^cont1);
- cont1=read1;
-
- if(trg1==1)
- {
- cc3--;
- if(cc3<=0)
- {cc3=30;}
- }
- switch(bb)
- {
- case 1:
- P0=shuzi[ww/10];
- P4=0x00;
- break;
- case 2:
- P0=shuzi[ww%10];
- P4=0x00;
- break;
- case 3:
- P0=shuzi[cc3/10]; // 秒
- P4=0x08;
- break;
- case 4:
- P0=shuzi[cc3%10]; // 秒
- P4=0x10;
- break;
- case 5:
- P0=shuzi[10];
- P4=0x00;
- break;
- }
- if(bb==6)
- {bb=0;}
- break;
- case 5: //顯示5 溫度報警-
- read=jia^0xff;
- trg=read&(read^cont);
- cont=read;
- if(trg==1)
- {
- cc++;
- if(cc>=70)
- {cc=35;}
- }
- read1=jian^0xff;
- trg1=read1&(read1^cont1);
- cont1=read1;
- if(trg1==1)
- {
- cc--;
- if(cc<=34)
- {cc=69;}
- }
- switch(bb)
- {
- case 1:
- P0=shuzi[cc/10]; // 溫度低溫恢復
- P4=0x02;
- break;
- case 2:
- P0=shuzi[cc%10];
- P4=0x04;
- break;
- case 3:
- P0=shuzi[qq/10];
- P4=0x00;
- break;
- case 4:
- P0=shuzi[qq%10];
- P4=0x00;
- break;
- case 5:
- P0=shuzi[10];
- P4=0x00;
- break;
- }
- if(bb==6)
- {bb=0;}
- break;
- case 6: //顯示6 溫度報警+
- read=jia^0xff;
- trg=read&(read^cont);
- cont=read;
- if(trg==1)
- {
- qq++;
- if(qq>=100)
- {qq=70;}
- }
- read1=jian^0xff;
- trg1=read1&(read1^cont1);
- cont1=read1;
-
- if(trg1==1)
- {
- delay1(15);
- qq--;
- if(qq<=69)
- {qq=99;}
- }
- switch(bb)
- {
- case 1:
- P0=shuzi[cc/10];
- P4=0x00;
- break;
- case 2:
- P0=shuzi[0];
- P4=0x00;
- break;
- case 3:
- P0=shuzi[qq/10]; // 溫度低溫恢復
- P4=0x08;
- break;
- case 4:
- P0=shuzi[qq%10];
- P4=0x10;
- break;
- case 5:
- P0=shuzi[10];
- P4=0x00;
- break;
- }
- if(bb==6)
- {bb=0;}
- break;
- }
- if(ll==7)
- {ll=1;}
- }
- void TM1() interrupt 3
- {
-
- dingshi++;
- }
- void anjian(void) // 設置按鍵
- {
- read2=set^0xff;
- trg2=read2&(read2^cont2);
- cont2=read2;
- if(trg2==1)
- {
- jian1=1;
- }
-
- if(jian1==set)
- {
- ll++;
- delay1(200);
- jian1=0;
- }
- }
- void M1kaiguan(void) // M1總開關
- {
- read3=M2kg^0xff;
- trg3=read3&(read3^cont3);
- cont3=read3;
- if(trg3==1)
- {
- jian2=1;
- }
-
- if( M2kg==jian2 )
- {
-
- delay1(2000);
- jian2=0;
- M3wei=~M3wei;
- }
-
- if(M3wei==0)
- { M1=1;
- M1hong=0;
- M1lv=1;
-
- if(shoudong==0)
- { shoudong1=1;
- }
- if(shoudong1==1 )
- {
- M3=1;
- M3lv=1;
- fen=0;
- miao=0;
- }
- if(shoudong==shoudong1)
- {
- M3=0;
- M3lv=0;
- fen=0;
- miao=0;
- shoudong1=0;
- }
-
-
-
-
- if(M1wei==1)
- {
- M2=1;
- M2lv=1;
- M2hong=0;
- }
-
- else
- {
- M2=0;
- M2lv=0;
- M2hong=1;
-
- }
- }
- else
- {
- M1=0;
- M1lv=0;
- M1hong=0;
- M2=0;
- M2lv=0;
- M2hong=0;
- M3=0;
- M3lv=0;
- M3hong=0;
- fen=0;
- miao=0;
- }
- }
- void ADCInit() // ADC初始化
- {
- ADCCFG = 0x2f; // ?? ADC ??????? /2/16/16
- ADC_CONTR = 0x86; // ?? ADC ?? , ???? 16 ??
- }
- int ADCRead() // 讀ADC
- {
- int res;
- ADC_CONTR |= 0x40; // ?? AD ??
- _nop_();
- _nop_();
- while (!(ADC_CONTR & 0x20)); // ?? ADC ????
- ADC_CONTR &= ~0x20; // ?????
- res = (ADC_RES << 8) | ADC_RESL; // ?? ADC ??
- return res;
- }
- void IapIdle() // 掉電保全 初始化
- {
- IAP_CONTR = 0; //??IAP??
- IAP_CMD = 0; //???????
- IAP_TRIG = 0; //???????
- IAP_ADDRH = 0x80; //???????IAP??
- IAP_ADDRL = 0;
- }
- char IapRead(int addr) // 讀數據
- {
- char dat;
- IAP_CONTR =WT_24M; //??IAP
- IAP_CMD = 1; //??IAP???
- IAP_ADDRL = addr; //??IAP???
- IAP_ADDRH = addr >> 8; //??IAP???
- IAP_TRIG = 0x5a; //?????(0x5a)
- IAP_TRIG = 0xa5; //?????(0xa5)
- _nop_();
- dat = IAP_DATA; //?IAP??
- IapIdle(); //??IAP??
- return dat;
- }
- void IapProgram(int addr, char dat) // 寫數據
- {
- IAP_CONTR =WT_24M; //??IAP
- IAP_CMD = 2; //??IAP???
- IAP_ADDRL = addr; //??IAP???
- IAP_ADDRH = addr >> 8; //??IAP???
- IAP_DATA = dat; //?IAP??
- IAP_TRIG = 0x5a; //?????(0x5a)
- IAP_TRIG = 0xa5; //?????(0xa5)
- _nop_();
- IapIdle(); //??IAP??
- }
- void IapErase(int addr) // 擦除數據
- {
- IAP_CONTR =WT_24M; //??IAP
- IAP_CMD = 3; //??IAP????
- IAP_ADDRL = addr; //??IAP???
- IAP_ADDRH = addr >> 8; //??IAP???
- IAP_TRIG = 0x5a; //?????(0x5a)
- IAP_TRIG = 0xa5; //?????(0xa5)
- _nop_(); //
- IapIdle(); //??IAP??
- }
- void shijian() // 延遲讀數據 定時 分
- {
- if(fg==0)
- {
- miao4++;
- if(miao4>=3)
- {
- v=IapRead(0x01fa);
- ww=v;
- cc3=IapRead(0x01fb);
- cc4=cc3;
- miao4=0;
- fg=1;
- }
- }
- }
- void wendu() // 讀溫度
- {
- if(fg1==0)
- {
- miao4++;
- if(miao4>=3)
- {
- qq1=IapRead(0x04b0);
- qq=qq1;
- cc1=IapRead(0x04b1);
- cc=cc1;
- miao4=0;
- fg1=1;
- }
- }
- }
- void adcwendu() // ADC 溫度抓取
- {
- int res,vcc;
- res=ADCRead();
- vcc = (int)(4095L*2260/ res); // ?? VREF ???? , ?????
- if(aa>=100)
- {
- uu=vcc%10; //ADC顯示 個
- ii=vcc/10%10; //ADC顯示 十
- oo=vcc/100%10; //ADC顯示 百
- pp=vcc/1000%10; //ADC顯示 千
- aa=0;
- }
- adc1=vcc/1000%10; // ADC 比較
- adc2=vcc/100%10; // ADC 比較
- adc3=(adc1*10)+adc2; // ADC 比較
- }
- int main()
- {
-
- P1=0x00;
- P5M1=0x00;
- P5M0=0x00;
- P4M0=0x1e;
- P4M1=0x00;
- P2M0=0x38;
- P2M1=0x00;
- P1M0 = 0x3f; //??P1.0?ADC?
- P1M1 = 0x40;
- M1=0;
- M2=0;
- M3=0;
- M1hong=0;
- M2hong=0;
- M3hong=0;
- M1lv=0;
- M2lv=0;
- M3lv=0;
- ADCInit();
-
- miao4=0;
- while(1)
- {
-
- TMOD = 0x00;
- TL0 = 0xa0;
- TH0 = 0xf6;
- TL1 = 0x80;
- TH1 = 0x44;
-
- TR0 = 1;
- TR1=1;
- ET0 = 1;
- ET1=1;
- EA = 1;
-
-
-
- shijian(); // 定時時間 分
- wendu(); // 溫度
- adcwendu(); //溫度
- anjian(); //按鍵 設置
- // 12V總開關
- // 紅外感應接口
- if(dingshi>=42) // 定時時間
- {
- miao++;
- if(miao==60)
- {
- fen++;
- miao=0;
- if(fen==30)
- {
- fen=0;
- }
-
- }
- dingshi=0;
- }
-
- M1kaiguan();
- pp1=fen/10%10; // 定時時間顯示 pp1
- oo1=fen%10; // 定時時間顯示 oo1
- ii1=miao/10%10; // 定時時間顯示 ii1
- uu1=miao%10; // 定時時間顯示 uu1
- if(adc3>=qq ) //溫度報警比對
- {
- adcwei=1;
- }
- if(adcwei==1) //溫度 位
- {
- M1wei=0;
- if(adc3<=cc ){adcwei=0;M1wei=1;} // 溫度恢復
- }
- if(fen>=v) // 分定時
- {
- M3=1;
- M3hong=0;
- M3lv=1;
- if( miao!=miao1 ) // 電機運行倒計時 秒
- { miao1=miao;
- miao2++;
- }
- }
- if(miao2>=cc3) // 秒比較
- {
- M3=0;
- M3hong=0;
- ^^^^限于篇幅余下內容請下載附件^^^^
-
復制代碼
0.png (3.43 KB, 下載次數: 74)
下載附件
2019-10-21 01:21 上傳
所有資料51hei提供下載:
控制板1008.rar
(496.19 KB, 下載次數: 18)
2019-10-20 10:55 上傳
點擊文件名下載附件
驅動 下載積分: 黑幣 -5
驅動板1008.rar
(7.9 MB, 下載次數: 17)
2019-10-20 10:57 上傳
點擊文件名下載附件
控制 下載積分: 黑幣 -5
定時電機控制.docx
(17.09 KB, 下載次數: 15)
2019-10-20 11:04 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|