|
本帖最后由 迷失朋友 于 2018-3-4 20:48 編輯
我自己做一個模擬微波爐的控制器,大概就是用ds18b20提供的溫度控制步進(jìn)電機(jī),怎么我用ds18b20測溫數(shù)據(jù)時不時跳一下然后又正常。有沒有人幫我看一下,可以回復(fù),也可以加我qq904784778。
微波爐.rar
(28.5 KB, 下載次數(shù): 43)
2018-3-4 20:12 上傳
點擊文件名下載附件
微信截圖_20180304203959.png (222.44 KB, 下載次數(shù): 29)
下載附件
2018-3-4 20:40 上傳
微信截圖_20180304203948.png (217.49 KB, 下載次數(shù): 24)
下載附件
2018-3-4 20:40 上傳
單片機(jī)源程序如下:
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //七段數(shù)碼管顯示碼,顯示0~9
- uint tt=20; // 為了計時一秒,定時器一次中斷為50ms,20*50ms=1s
- uint tmax=30; //火力上限
- uint check=0;
- uint m;
- int count_s=0; //時間
- 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 P20=P2^0;
- sbit P21=P2^1;
- sbit P22=P2^2;
- sbit P23=P2^3;
- sbit P24=P2^4;
- sbit P25=P2^5;
- sbit P26=P2^6;
- sbit P30=P3^0;
- sbit P31=P3^1;
- sbit P32=P3^2;
- sbit P33=P3^3;
- sbit P34=P3^4;
- sbit P35=P3^5;
- sbit P36=P3^6;
- sbit P37=P3^7;
- sbit DQ=P2^7; //定義DS18B20總線I/O
- sbit DP=P0^7;
- void Delay(uint i)//延時
- {
- while( i-- );
- }
- void T_initalize()
- {
- EA=1; //開中斷
- ET0=1;
- ET1=1; //定時器 中斷允許
- TMOD=0x11; //定時器T0 定時 方式一
- TH0=0x3c;
- TL0=0xaf; //12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
- }
- void Init_DS18B20(void)//初始化DS18B20
- {
- uchar x=0;
- DQ=1;
- Delay(8); //稍做延時
- DQ=0; //單片機(jī)將DQ拉低
- Delay(80); //精確延時,大于480us
- DQ=1; //拉高總線
- Delay(14);
- x=DQ; //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
- Delay(20);
- }
- uchar Readonechar(void)//讀一個字節(jié)
- {
- uchar i=0;
- uchar dat=0;
- for (i=8;i>0;i--)
- {
- DQ=0; // 給脈沖信號
- dat>>=1;
- DQ=1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- Delay(4);
- }
- Delay(500);
- return(dat);
- }
- void Writeonechar(uchar dat)//寫一個字節(jié)
- {
- uchar i=0;
- for (i=8; i>0; i--)
- {
- DQ=0;
- DQ=dat&0x01;
- Delay(10);
- DQ=1;
- dat>>=1;
- }
- }
- void Tmperature_change(void) //發(fā)送溫度轉(zhuǎn)換命令
- {
- Init_DS18B20();
- Writeonechar(0xCC); //跳過讀序號列號的操作
- Writeonechar(0x44); //啟動溫度轉(zhuǎn)換
- }
- uint Read_temperature(void)//讀取溫度
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
- Tmperature_change();
- Init_DS18B20();
- Writeonechar(0xCC); //跳過讀序號列號的操作
- Writeonechar(0xBE); //讀取溫度寄存器
- a=Readonechar(); //讀低8位
- b=Readonechar(); //讀高8位
- t=b;
- t<<=8;
- t=t|a;
- t=t*0.0625;
- return(t);
- }
- void Display_temperature()//顯示溫度
- {
- uint f,g,h,i;
- i=Read_temperature(); //獲取溫度值
- f=i/100; //百位
- g=i%100/10; //十位
- h=i%10; //個位
- m=i;
- P24=1,P25=1,P26=1;
- P0=codevalue[h]; //顯示個位
- P24=1,P25=1,P26=0;
- Delay(160);
- P24=1,P25=1,P26=1;
- P0=codevalue[g]; //顯示十位
- P24=1;P25=0;P26=1;
- Delay(160);
- P24=1,P25=1,P26=1;
- P0=codevalue[f]; //顯示百位
- P24=0,P25=1,P26=1;
- Delay(160);
- P24=1,P25=1,P26=1;
- }
- void Display_time()//顯示時間
- {
- uint a,b,c,d;
- a=count_s/600; //取分的十位
- b=(count_s/60)%10; //取分的個位
- c=(count_s%60)/10; //取秒的十位
- d=(count_s%60)%10; //取秒的個位
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[d]; //顯示秒的個位
- P20=1,P21=1,P22=1,P23=0;
- Delay(150);
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[c]; //顯示秒的十位
- P20=1,P21=1,P22=0,P23=1;
- Delay(160);
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[b]; //顯示分的個位
- P20=1,P21=0,P22=1,P23=1;
- Delay(160);
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[a]; //顯示分的十位
- P20=0,P21=1,P22=1,P23=0;
- Delay(160);
- P20=1,P21=1,P22=1,P23=1;
- }
- void Display_initalize()
- {
- P2=0xff;
- P0=0x40;
- P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
- Delay(120);
- P2=0xff;
- P0=0x40;
- P20=1,P21=0,P22=1,P23=1,P24=1,P25=1,P26=1;
- Delay(120);
- P2=0xff;
- P0=0x40;
- P20=1,P21=1,P22=0,P23=1,P24=1,P25=1,P26=1;
- Delay(120);
- P2=0xff;
- P0=0x40;
- P20=1,P21=1,P22=1,P23=0,P24=1,P25=1,P26=1;
- Delay(120);
- P2=0xff;
- P0=0x40;
- P20=0,P21=1,P22=1,P23=1,P24=0,P25=1,P26=1;
- Delay(120);
- P2=0xff;
- P0=0x40;
- P20=0,P21=1,P22=1,P23=1,P24=1,P25=0,P26=1;
- Delay(120);
- P2=0xff;
- P0=0x40;
- P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=0;
- Delay(120);
- P2=0xff;
- }
- void Motor()//電機(jī)
- {
- if(check==1)
- {
- P33=1,P34=0,P35=0,P36=0;
- Delay(100);
- P33=0,P34=1,P35=0,P36=0;
- Delay(100);
- P33=0,P34=0,P35=1,P36=0;
- Delay(100);
- P33=0,P34=0,P35=0,P36=1;
- Delay(100);
- }
- }
- void Temperature_check()//溫度檢測
- {if(check==1)
- {
- if(m<=tmax)
- P17=0;
- if(m>tmax)
- P17=1;
- }
- }
- void Key_scan()//鍵位掃描
- {
- if(!P10)
- {
- Delay(150);
- if(!P10)
- count_s+=60; //時間+1分
- if (count_s>6000)
- count_s=0;
- }
-
- if(!P11)
- {
- Delay(150);
- if(!P11)
- count_s-=60; //時間-1分
- if (count_s<0)
- count_s=0;
- }
- if(!P12)
- {
- Delay(150);
- if(!P12)
- tmax=50; //小火
- }
- if(!P13)
- {
- Delay(150);
- if(!P13)
- tmax=80; //中火
- }
- if(!P14)
- {
- Delay(150);
- if(!P14)
- tmax=120; //大火
- }
- if(!P15)
- {
- Delay(150);
- if(!P15)
- {
- P22=1;
- if(count_s==0) //如果沒有設(shè)定時間,不加熱,定時器不工作
- TR0=0;
- else //如果已經(jīng)設(shè)定時間,則開始計時,開始加熱
- {
- T_initalize();
- TR0=1;
- check=1;
- P17=0;
- }
- }
- }
- if(!P16) //停止加熱,終止定時器
- {
- Delay(150);
- if(!P16)
- {P17=1;
- TR0=0;
- check=0;
- }
- }
- }
- void t0() interrupt 1//定時
- {
- TR0=0;
- TH0=0x3c;
- TL0=0xaf;
- tt--;
- if (tt==0)
- {tt=20;
- count_s--; //時間-1S
- if (count_s==0) //如果定時已到
- {
- P17=1; //停止加熱,定時器終止
- TR0=0;
- check=0;
- P37=0;
- Delay(500);
- P37=1;
- P37=0;
- Delay(500);
- P37=1;
- P37=0;
- Delay(500);
- P37=1;
- }
- else
- TR0=1; //繼續(xù)定時
- }
- else
- TR0=1;
-
- }
- void main()
- {
- uint j;
- P37=0;
- Delay(500);
- P37=1;
- Read_temperature();
- for(j=0;j<100;j++)
- {
- Display_initalize();
- }
- while(1)
- {
- Key_scan();
- Display_temperature();
- Display_time();
- Temperature_check();
- }
- }
復(fù)制代碼 |
|