|
這是我之前做過的微波爐單片機(jī)課程設(shè)計(jì),用了大概一周的時(shí)間
我是用protues做的仿真
附件里面有文檔,源碼和protues仿真的實(shí)驗(yàn)
希望和大家多多交流
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
圖片1.png (49.14 KB, 下載次數(shù): 53)
下載附件
2019-6-18 22:12 上傳
單片機(jī)源程序如下:
- Wendu.h (頭文件)
- #define jump_ROM 0xCC//ds18B20定義
- #define start 0x44
- #define read_EEROM 0xBE
- void delay(unsigned int N);
- void delay_1();
- unsigned char Reset(void);//復(fù)位DS18B20
- unsigned char read_bit(void);//從DS18B20讀一個(gè)位值
- void write_bit(unsigned char bitval);//向DS18B20寫一位
- unsigned char read_byte(void);//從DS18B20讀一個(gè)字節(jié)
- void write_byte(unsigned char val);// 向DS18B20寫一個(gè)字節(jié)
- Wendu.c (Wendu.h 的實(shí)現(xiàn))
- #include<reg52.h>
- #include"wendu.h"
- sbit DQ = P2^3; //DS18B20數(shù)據(jù)口
- /********************************************************************
- * 名稱 : delay()
- * 功能 : 延時(shí),延時(shí)時(shí)間大概為140US。
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay_1()
- {
- int i,j;
- for(i=0; i<=10; i++)
- for(j=0; j<=2; j++);
- }
- /********************************************************************
- * 名稱 : delay()
- * 功能 : 延時(shí)函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay(unsigned int N)
- {
- int i;
- for(i=0; i<N; i++);
- }
- /********************************************************************
- * 名稱 : Reset()
- * 功能 : 復(fù)位DS18B20
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- unsigned char Reset(void)
- {
- unsigned char deceive_ready;
- DQ = 0;
- delay(29);
- DQ = 1;
- delay(3);
- deceive_ready = DQ;
- delay(25);
- return(deceive_ready);
- }
- /********************************************************************
- * 名稱 : read_byte()
- * 功能 : 從DS18B20讀一個(gè)字節(jié)
- * 輸入 : 無
- * 輸出 : 從DS18B20讀到的值
- ***********************************************************************/
- /********************************************************************
- * 名稱 : read_bit()
- * 功能 : 從DS18B20讀一個(gè)位值
- * 輸入 : 無
- * 輸出 : 從DS18B20讀出的一個(gè)位值
- ***********************************************************************/
- unsigned char read_bit(void)
- {
- unsigned char i;
- DQ = 0;
- DQ = 1;
- for(i=0; i<3; i++);
- return(DQ);
- }
- /********************************************************************
- * 名稱 : write_bit()
- * 功能 : 向DS18B20寫一位
- * 輸入 : bitval(要對DS18B20寫入的位值)
- * 輸出 : 無
- ***********************************************************************/
- void write_bit(unsigned char bitval)
- {
- DQ=0;if(bitval==1)
- DQ=1;
- delay(5);
- DQ=1;
- }
- /********************************************************************
- * 名稱 : read_byte()
- * 功能 : 從DS18B20讀一個(gè)字節(jié)
- * 輸入 : 無
- * 輸出 : 從DS18B20讀到的值
- ***********************************************************************/
- unsigned char read_byte(void)
- {
- unsigned char i,m,receive_data;
- m = 1;
- receive_data = 0;
- for(i=0; i<8; i++)
- {
- if(read_bit())
- {
- receive_data = receive_data + (m << i);
- }
- delay(6);
- }
- return(receive_data);
- }
- /********************************************************************
- * 名稱 : write_byte()
- * 功能 : 向DS18B20寫一個(gè)字節(jié)
- * 輸入 : val(要對DS18B20寫入的命令值)
- * 輸出 : 無
- ***********************************************************************/
- void write_byte(unsigned char val)
- {
- unsigned char i,temp;
- for(i=0; i<8; i++)
- {
- temp = val >> i;
- temp = temp & 0x01;
- write_bit(temp);
- delay(5);
- }
- }
- 主函數(shù)的實(shí)現(xiàn)
- #include<reg52.h>
- #include"wendu.h"
- sbit key1=P1^4; //矩陣鍵盤定義
- sbit key2=P1^5;
- sbit key3=P1^6;
- sbit key4=P1^7;
- sbit S1=P3^2; //按鍵定義
- sbit S2=P3^3;
- sbit S3=P3^4;
- sbit RS=P2^5; //12864定義
- sbit RW=P2^6;
- sbit E=P2^7;
- sbit BEEP = P2^0; //蜂鳴器定義
- sbit Hot=P2^1;
- unsigned char TMPH,TMPL,key41=1,Temp,T; //溫度常量
- unsigned int count1,count2,count3; //時(shí)間常量
- unsigned int countor,m,s; //計(jì)時(shí)常量
- unsigned char button,sound; //其他常量
- unsigned char code table[]={"0123456789"};
- /******************子程序說明********************/
- void delay_1ms(unsigned int i); //1ms延時(shí)
- void delay(); //延時(shí)子程序
- void beep(); //響鈴程序
- void set(char n); //12864寫指令子程序
- void weizhi(int hang,int lie); //12864字符顯示位置
- void wdata(unsigned char d); //往12864寫數(shù)據(jù),單個(gè)字符
- void wsdata(char tab[]); //往12864寫數(shù)據(jù),字符串
- void scan(); //矩陣鍵盤第一列掃描,確定所輸入的時(shí)間
- void setTemp(); //溫度設(shè)定,采用掃描獨(dú)立鍵盤來確定輸入
- void setTime(); //時(shí)間設(shè)定
- void showTime(); //顯示時(shí)間
- void chu12864(); //初始化12864
- void chuDS(); //初始化DS18B20
- /********************主程序*************************/
- void main() //主函數(shù)
- {
- chu12864();//12864的初始化
- setTemp();
- setTime();
- while(1)
- {
- chuDS();
- if(Temp==T)
- TR0=1;
- showTemp();
- showTime();
- if(sound==1)
- beep();
- }
- }
- /******************************************/
- void time0(void) interrupt 1 using 1 //定時(shí)中斷程序
- {
- countor++;
- if(countor==20)
- {
- if(m==0&&s==0) //倒計(jì)時(shí)
- {
- m=0;
- s=0;
- sound=1;
- Hot=0;
- TR0=0;
- }
- else
- if(s==0)
- { m--;s=59;}
- else
- s--;
- countor=0;
- }
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- }
- /************************************************/
- void delay_1ms(unsigned int i) //1ms延時(shí)
- {
- unsigned char x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- /************************************************/
- void delay() //延時(shí)子程序
- {
- int a,b;
- for(a=0;a<100;a++)
- for(b=0;b<10;b++);
- }/************************************************/
- void beep() //響鈴程序
- {
- unsigned char i;
- for (i=0;i<100;i++)
- {
- delay_1ms(1);
- BEEP=!BEEP; //BEEP取反
- }
- BEEP=1; //關(guān)閉蜂鳴器
- }
- /************************************************/
- void set(char n) //12864寫指令子程序
- {
- P0=n;
- RS=0;
- RW=0;
- E=0;
- delay();
- E=1;
- delay();
- }
- /******************************************/
- void weizhi(int hang,int lie) //12864字符顯示位置
- {
- char a;
- if(hang==1) a=0x80;
- if(hang==2) a=0xc0;
- a=a+lie-1;
- set(a);
- }
- /******************************************/
- void wdata(unsigned char d) //往12864寫數(shù)據(jù),單個(gè)字符
- {
- RS=1;
- RW=0;
- P0=d;
- E=0;
- delay();
- E=1;
- delay();
- }
- /******************************************/
- void wsdata(char tab[]) //往12864寫數(shù)據(jù),字符串
- {
- int i=0;
- RS=1;
- RW=0;
- while(tab[i]!='\0') //不是結(jié)束符時(shí)執(zhí)行
- {
- P0=tab[i];
- E=0;
- delay();
- E=1;
- delay();
- i++;
- }
- }
- /******************************************/
- void scan() //矩陣鍵盤第一列掃描,確定所輸入的時(shí)間
- {
- P1=0xfe;
- if(key1==0)
- { delay();
- if(key1==1)
- { count1++;
- beep();
- }
- }
- if(key2==0)
- { delay();
- if(key2==1)
- {
- count2++;
- beep();
- }
- }
- if(key3==0)
- { delay();
- if(key3==1)
- {
- count3++;
- beep();
- }
- }
- if (key4==0)
- {
- key41=0;
- beep();
- }
- }
- /******************************************/
- void setTemp() //溫度設(shè)定,采用掃描獨(dú)立鍵盤來確定輸入
- {
- while(1)
- {
- P3=0xff;
- if(S1==0) button=1; //20度
- if(S2==0) button=2; //30度
- if(S3==0) button=3; //50度
- if(button==1)
- {
- T=20;
- weizhi(2,5);
- wdata(table[2]);
- delay_1ms(1);
- weizhi(2,6);
- wdata(table[0]);
- }
- if(button==2)
- {
- T=30;
- weizhi(2,5);
- wdata(table[3]);
- delay_1ms(1);
- weizhi(2,6);
- wdata(table[0]);
- }
- if(button==3)
- {
- T=50;
- weizhi(2,5);
- wdata(table[5]);
- delay_1ms(1);
- weizhi(2,6);
- wdata(table[0]);
- }
- if(button==1||button==2||button==3)
- break;
- }
- }
- /****************************************/
- void setTime() //時(shí)間設(shè)定
- {
- while(1)
- {
- scan();
- if(key41==0)
- break;
- }
- m=(1*count1)+(2*count2)+(5*count3); //計(jì)算所設(shè)定的時(shí)間
- Hot=1;
- }
- void showTime() //顯示時(shí)間
- {
- weizhi(2,11);
- wdata(table[m/10]); //顯示分
- delay_1ms(1);
- weizhi(2,12);
- wdata(table[m%10]);
- delay_1ms(1);
- weizhi(2,13);
- wdata(':');
- delay_1ms(1);
- weizhi(2,14);
- wdata(table[s/10]); //顯示秒
- delay_1ms(1);
- weizhi(2,15);
- wdata(table[s%10]);
- delay_1ms(1);
- }
- /****************************************/
- void showTemp() //顯示溫度
- {
- delay_1ms(1);
- weizhi(1,13);
- wdata(table[Temp/10]);
- delay_1ms(1);
- weizhi(1,14);
- wdata(table[Temp%10]);
- delay_1ms(1);
- }
- /****************************************/
- void chu12864() //初始化12864
- {
- set(0x01); //清屏
- set(0x38); //顯示模式
- set(0x0c); //顯示開
- set(0x06); //光標(biāo)設(shè)置
- weizhi(1,4); //定義字符顯示位置 第一行,第四列
- wsdata("Welcome"); //顯示開機(jī)歡迎語
- weizhi(2,3);
- wsdata("T=");
- weizhi(2,7);
- wsdata("oC");
- IE=0x82; //設(shè)定定時(shí)器工作方式
- TMOD=0X01;
- TH0=(65536-50000)/256; //設(shè)定計(jì)時(shí)器的定時(shí)時(shí)長50MS
- TL0=(65536-50000)%256;
- button=0; //初始化參數(shù)
- count1=0;
- count2=0;
- count3=0;
- Hot=0;
- m=0;
- s=0;
- T=0;
- }
- void chuDS() //初始化DS18B20
- {
- Reset();
- write_byte(jump_ROM);
- write_byte(start);
- Reset();
- write_byte(jump_ROM);
- write_byte(read_EEROM);
- TMPL = read_byte();
- TMPH = read_byte();
- Temp = TMPL / 16 + TMPH * 16;
- delay_1ms(1);
- }
復(fù)制代碼
全部資料51hei下載地址:
仿真 程序.zip
(82.38 KB, 下載次數(shù): 97)
2019-6-18 22:13 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|