|
溫控風(fēng)扇仿真圖
0.png (29.17 KB, 下載次數(shù): 73)
下載附件
2019-5-14 18:32 上傳
單片機(jī)源程序如下:
- #include<reg52.h> //頭文件
- #include<intrins.h>
- #include "DS18b20.H"
- #include "eeprom52.h"
- #include "Nixie tube.h"
- #define uchar unsigned char //宏定義
- #define uint unsigned int
- uchar code ss[]= //第一個(gè)數(shù)碼管數(shù)組沒(méi)有帶小數(shù)點(diǎn)
- {
- 0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90
- };
- uchar code ss1[]= //這個(gè)數(shù)碼管數(shù)組帶小數(shù)點(diǎn)
- {
- 0x40,0x79,0x24,0x30,0x19,
- 0x12,0x02,0x78,0x00,0x10,
- 0xc7,0x89,0xbf //0xc7=L 0x89=H 0xbf=- 負(fù)號(hào)
- }; //0-9為帶小數(shù)點(diǎn)的
- uchar ms; //定義一個(gè)計(jì)數(shù)變量
- sbit key1=P3^4;
- sbit key2=P3^5;
- sbit key3=P3^3; //按鍵控制 P3^4設(shè)置切換 3.5上下限加 3.6上下限減
- sbit led_0=P1^0; //上限溫度報(bào)警燈
- sbit led_2=P1^2; //下限溫度報(bào)警燈
- char H,L,T_ms; //用于設(shè)置上下限度 上下限度與要比較的數(shù)據(jù)類型最好相同 T_ms用于PWM調(diào)節(jié)
- uchar flag,PWM_ON; //PWM_ON是風(fēng)扇開(kāi)關(guān)標(biāo)志位
- sbit Fan=P1^6; //風(fēng)扇端口定義
- bit voled=0; //voled用來(lái)判斷風(fēng)扇軟啟動(dòng)
- int temp; //存儲(chǔ)讀出來(lái)的溫度,與H,L上下限度數(shù)據(jù)類型相同
- void delay(uint T) //短延時(shí)
- {
- while(T--);
- }
- void display() //顯示函數(shù)
- {
- if(flag==0&&temp>=0) //溫度為正數(shù)時(shí)執(zhí)行
- {
- if(temp>999) Nixietube(ss[temp/1000%10],ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
- if(temp>99) Nixietube(0xff,ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
- if(temp<99&&temp/100%10<=0) Nixietube(0xff,0xff,ss1[temp/10%10],ss[temp%10]);
- }
- if(flag==0&&temp<0) //溫度為負(fù)數(shù)時(shí)
- {
- if(temp*-1/100%10<=0) Nixietube(0xff,ss1[12],ss1[temp*-1/10%10],ss[temp*-1%10]);
- if(temp*-1/100%10>0) Nixietube(ss1[12],ss[temp*-1/100%10],ss1[temp*-1/10%10],ss[temp*-1%10]);
- }
- if(flag==1) //flag==0顯示溫度 =1 顯示上限 =2 顯示下限
- {
- if(H>99) Nixietube(ss1[11],ss[H/100],ss[H%100/10],ss[H%10]); //溫度范圍是125~-55 ,當(dāng)上限值大于99時(shí)執(zhí)行
- if(H>=10&&H<=99) Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]); //當(dāng)上限值大于12小于99時(shí)執(zhí)行 不顯示最高位
- if(H<10&&H>=0) Nixietube(ss1[11],0xff,0xff,ss[H%10]); //不顯示百位 十位
- if(H<0&&H>=-9) Nixietube(ss1[11],0xff,ss1[12],ss[H*-1%10]); //設(shè)置的為負(fù)數(shù)且介于0~-9之間時(shí)執(zhí)行 不顯示十位
- if(H<0&&H<-9) Nixietube(ss1[11],ss1[12],ss[H*-1%100/10],ss[H*-1%10]); //最低可以到55
- }
-
- if(flag==2) //同上
- {
- if(L>99) Nixietube(ss1[10],ss[L/100],ss[L%100/10],ss[L%10]);
- if(L>=10&&L<=99) Nixietube(ss1[10],0xff,ss[L/10],ss[L%10]);
- if(L<10&&L>=0) Nixietube(ss1[10],0xff,0xff,ss[L%10]);
- if(L<0&&L>=-9) Nixietube(ss1[10],0xff,ss1[12],ss[L*-1%10]);
- if(L<0&&L<-9) Nixietube(ss1[10],ss1[12],ss[L*-1%100/10],ss[L*-1%10]);
-
- }
- }
- void key() //按鍵處理
- {
- if(!key1) //設(shè)置上限
- {
- delay(500);
- if(!key1)
- {
- while(!key1);//display();
- if(flag==1)
- {
- if(H<125)H++;
- SectorErase(0x2000); //每修改一次上下限數(shù)據(jù)就寫(xiě)進(jìn)EEROM
- byte_write(0x2000,H);
- }
- else if(flag==2)
- {
- if(L<H-1) L++; //原則是下限不超過(guò)上限
- SectorErase(0x2200);
- byte_write(0x2200,L);
- }
- }
- }
-
- if(!key2) //設(shè)置下限
- {
- delay(500);
- if(!key2)
- {
- while(!key2);//display();
- if(flag==1)
- {
- if(H>L+1) H--; //原則上限不低于下限
- SectorErase(0x2000); //每修改一次上下限數(shù)據(jù)就寫(xiě)進(jìn)EEROM
- byte_write(0x2000,H);
- }
- else if (flag==2)
- {
- if(L>-55)L--;
- SectorErase(0x2200);
- byte_write(0x2200,L);
- }
- }
- }
- if(!key3) //設(shè)置上限下限切換按鍵
- {
- delay(1000);
- if(!key3)
- {
- while(!key3);
- flag=(flag+1)%3;
- }
- }
- }
- void alarm() //報(bào)警
- {
-
- if(temp/10>=H) //上限,當(dāng)測(cè)得的值,大于等于設(shè)定值得時(shí)候,
- {
- led_0=0; PWM_ON=20; //上限警示燈亮,風(fēng)扇PWM調(diào)節(jié)最大
- }
- else
- {
- led_0=1;
- }
- if((L<=temp/10)&&(temp/10<=H)) //當(dāng)溫度介于上下限之間時(shí),風(fēng)扇弱風(fēng)轉(zhuǎn)動(dòng)
- {
- PWM_ON=4;
- }
- if(temp/10<=L) //如果溫度在下限以下,那么風(fēng)扇停止轉(zhuǎn)動(dòng) 下限指示燈亮
- {
- led_2=0; PWM_ON=0; voled=0;
- Fan=1;
- }
- else
- {
- led_2=1;
- }
- }
- void main() //主函數(shù)
- {
- do
- {
- temp=Temper();
- }
- while(temp==850); //因?yàn)镈S18B20上電之后會(huì)讀出來(lái)850,但不是溫度值,所以等待讀出溫度值
- H=byte_read(0x2000);
- L=byte_read(0x2200); //讀EEROM里面的數(shù)據(jù)
- if((H>99)||(L>99)||(L>=H)) //如果數(shù)據(jù)不對(duì),賦予初始值
- {
- H=35;
- L=16;
- }
- TMOD=0x21; //使用兩個(gè)定時(shí)器,0工作在方式1,用來(lái)定時(shí)讀取與顯示溫度 1工作在方式2,用來(lái)模擬PWM
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256; //裝入初始值,一次定時(shí)10MS
- TH1 = 0x06;
- TL1 = 0x06; //一次定時(shí)0.25ms
- EA=1; // 打開(kāi)總中斷
- ET0=1; //打開(kāi)定時(shí)器0中斷
- TR0=1; //開(kāi)始啟動(dòng)定時(shí)器0
- ET1=1; //打開(kāi)定時(shí)器1中斷
- TR1=1; //開(kāi)始啟動(dòng)定時(shí)器1
-
- while(1)
- {
- display(); //消影問(wèn)題,仿真里對(duì)中斷里的顯示函數(shù)只執(zhí)行一次,不能達(dá)到一直顯示
- //所以,在仿真時(shí)解除屏蔽此語(yǔ)句,屏蔽中斷里的display();
- key();
- alarm();
- }
- }
- void UART_1() interrupt 1
- {
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;; //一次定時(shí)10MS
- ms++;
- //display(); //顯示函數(shù) 因?yàn)閿?shù)碼管存在消影問(wèn)題,如果在電路上,不屏蔽此句子,如果需要仿真,屏蔽此句子,使用主函數(shù)里的顯示函數(shù)
- if(ms>100) //每1秒刷新一次溫度數(shù)據(jù)
- {
- ms=0;
- temp=Temper(); //讀溫度
- }
- }
- void T1_time() interrupt 3
- {
- TH1 = 0x06;
- TL1 = 0x06; //一次定時(shí)0.25ms
- T_ms++;
- if(voled==0&&temp/10>L) //軟啟動(dòng),因?yàn)殡妷禾停L(fēng)扇不易啟動(dòng)/由溫度低于下限的不啟動(dòng)到啟動(dòng),電壓太低也啟動(dòng)不了
- {
- voled=1;
- Fan=0;
- delay(3200);
- Fan=1;
- }
- if(T_ms<PWM_ON)
- {
- Fan=0;
- }
- else
- {
- Fan=1;
- }
- if(T_ms>20)
- {
- T_ms=0;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
Desktop1.zip
(334.04 KB, 下載次數(shù): 86)
2019-5-14 12:44 上傳
點(diǎn)擊文件名下載附件
仿真圖 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|