|
原理圖是用ad軟件畫的,單片機微波爐課程設計資料包里面含程序源碼 proteus仿真和ad畫的原理圖
0.png (76.81 KB, 下載次數: 53)
下載附件
2017-2-27 23:20 上傳
仿真原理圖:
0.png (38.78 KB, 下載次數: 58)
下載附件
2017-2-27 23:20 上傳
單片機微波爐的程序源碼:
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uint dis[]={0x00,0x00,0x00,0x00};
- uint pv=1,pv_j=6,pv_l=24; //定義 檔位、加熱時間、冷卻時間(每個周期)
- uint count_s=0; //記錄定時時間
- uint cyc0=20,cyc1=20; // 為了計時一秒,定時器一次中斷為50ms,20*50ms=1s
- uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; //七段數碼管顯示碼,顯示0~9和全亮
- uchar codecho[]={0xfe,0xfd,0xfb,0xf7}; //位選碼
- sbit P10=P1^0; //引腳定義
- sbit P11=P1^1;
- sbit P12=P1^2;
- sbit P13=P1^3;
- sbit P14=P1^4;
- sbit P15=P1^5;
- sbit P16=P1^6;
- sbit P17=P1^7;
- sbit duan=P2^0;
- sbit wei=P2^1;
- sbit P22=P2^2;
- sbit P23=P2^3;
- sbit P24=P2^4;
- /*--------------------
- 延時函數,大致延時一毫秒
- -------------------*/
- void delay_ms(uint t)
- {uchar i;
- while(t--)
- {
- i=250;
- while(--i);
- }
- }
- /*------------------------
- 定時器初始化
- --------------------------*/
- void t_clr()
- {
- EA=1; //CPU開中斷
- ET0=1;
- ET1=1; //定時器 中斷允許
- TMOD=0X11; //定時器T1、T0 定時 方式一
- TH0=0X3c;
- TL0=0Xaf;
- //12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
- TH1=0X3c;
- TL1=0X0af;
- }
- /*------------------------
- 鍵盤掃描函數
- --------------------------*/
- void key_scan()
- {
- if(!P10)
- {
- delay_ms(70);
- if(!P10)
- count_s+=30; //時間 +30秒
- if (count_s>6000)
- count_s=0;
- }
-
- if(!P11)
- {
- delay_ms(70);
- if(!P11)
- count_s+=60; //時間 +1 分
- if (count_s>6000)
- count_s=0;
- }
- if(!P12)
- {
- delay_ms(70);
- if(!P12)
- count_s+=300; //時間+5分
- if (count_s>6000)
- count_s=0;
- }
- if(!P13)
- {
- delay_ms(70);
- if(!P13)
- count_s=0; //時間清零
- }
- if(!P14)
- {
- delay_ms(70);
- if(!P14)
- {if (pv<3)
- pv++; //檔位+1
- pv_j=pv*6+6; //加熱時間
- pv_l=30-pv_j; //冷卻時間
- }
- }
- if(!P15)
- {
- delay_ms(70);
- if(!P15)
- {if (pv>0)
- pv--; //檔位-1
- pv_j=pv*6+6;
- pv_l=30-pv_j;
- }
- }
- if(!P16)
- {
- delay_ms(70);
- if(!P16)
- {
- P22=1;
- if(count_s==0) //如果沒有設定時間,不加熱,定時器不工作
- {TR0=0;
- TR1=0;}
- else //如果已經設定時間,則開始計時,開始加熱
- {
- pv_j=6*pv+6;
- pv_l=30-pv_j;
- t_clr();
- TR0=1;
- TR1=1;
- P22=0;}
- }
- }
- if(!P17) //停止加熱,終止定時器
- {
- delay_ms(70);
- if(!P17)
- {P22=1;
- P23=0;
- TR0=0;
- TR1=0;
- }
- }
- }
- /*------------------------
- 時間變換為每個顯示位
- --------------------------*/
- void time_converter()
- {
- dis[0]=count_s/600; //取分的十位
- dis[1]=(count_s/60)%10; //取分的個位
-
- dis[2]=(count_s%60)/10; //取秒的十位
- dis[3]=(count_s%60)%10; //取秒的個位
- }
- /*------------------------
- 顯示函數
- --------------------------*/
- void display()
- {
-
- uchar t;
- uchar k;
- for(k=0;k<4;k++) //LED顯示
- {
- wei=1;
- P0=codecho[k];
- wei=0;
- P0=0xff;
- delay_ms(1);
- duan=1;
- P0=codevalue[dis[k]];
- duan=0;
- P0=0xff;
- delay_ms(1);
- }
- P3=codevalue[pv]; //顯示檔位 */
- while(!P24) //按鍵測試
- {
- for(t=0;t<4;t++)
- {
- wei=1;
- P0=codecho[t];
- wei=0;
- P0=0xff;
- delay_ms(1);
- duan=1;
- P0=codevalue[10];
- duan=0;
- P0=0xff;
- delay_ms(1);
- P3=codevalue[10];
- }
- }
- }
- /*------------------------
- 主函數
- --------------------------*/
- void main()
- {
- uchar n=200;
- P23=0;
- t_clr(); //初始化
- while(1)
- {
- key_scan(); //鍵盤掃描
- time_converter();//數值轉換
- display(); //顯示
- }
- }
- /*------------------------
- 定時器T0中斷
- --------------------------*/
- void t0() interrupt 1
- {
- TR0=0;
- TH0=0X3c;
- TL0=0Xaf;
- cyc0--;
- if (cyc0==0)
- {cyc0=20;
- count_s--; //時間-1S
- if (count_s==0) //如果定時已到
- {
- P22=1; //停止加熱,定時器終止
- TR0=0;
- TR1=0;
- P23=1;
- }
- else
- TR0=1; //繼續定時
- }
- else
- TR0=1;
-
- }
- /*------------------------
- 定時器T1中斷
- --------------------------*/
- void t1() interrupt 3
- {
- TR1=0;
- TH1=0X3c;
- TL1=0X0af;
- TR1=1;
- if (pv_j!=0) //需要加熱
- {cyc1--;
- if (cyc1==0)
- {cyc1=20;
- pv_j--;
- if (pv_j==0) //加熱時間到
- {
- P22=1; //否則,停止加熱,進入冷卻階段
- }
- }
- }
- else if (pv_l!=0) //是否需要冷卻
- {cyc1--;
- if (cyc1==0)
- {cyc1=20;
- pv_l--;
- if (pv_l==0) //冷卻時間到
- {
- P22=0; //進行加熱
- pv_j=pv*6+6;} //再次設定加熱時間
復制代碼

完整的資料包下載(含程序源碼 proteus仿真和ad畫的原理圖):
http://www.zg4o1577.cn/bbs/dpj-77955-1.html
|
|