|
stc15f104e+ds18b20+ULN2003A簡易散熱風扇控制器,壓縮包內有用C51的仿真和原程序C。新手發帖,請多指教
下面是風扇控制器的仿真原理圖:
F1 40度啟動 F2 50度啟動
F1 小于35度停止 F2 小于 45度停止
用8051仿真15F104E,用小燈泡代替小風扇好看點,因為風扇停止太慢。
散熱風扇控制器的單片機源程序:
-
- ///朱旭東2017年改 89c52rc 11.0592MHZ
- //+99.9~-9.9
- // 十位 個位 小數 小c P0.0-P0.7 A-G點,使用3位管時不用小C
- //#include<reg52.h>
- #include <intrins.h>
- #include <STC15Fxxxx.H>
- //code unsigned char seg7code[12]={0x3f,0x06,0x5b,0x4f,0x66,
- // 0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x61}; //顯示段碼0,1,2,3,4,5,6,7,8,9,-.C
- unsigned int tem;
- sbit led1=P3^4;
- sbit led=P3^5;
- sbit TMDAT =P3^2; //DS18B20的數據輸入/輸出腳DQ,根據情況設定
- sbit led2=P3^3;
- bit fg=0; //溫度正負標志
- unsigned char k;
- //sbit w1=P1^0;
- //sbit w2=P1^1;
- //sbit w3=P1^2;
- //sbit w4=P1^3;
- void delay_us(unsigned char n)// STC15系列單片機延時1微秒@12MHZ
- {
- while (n--)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- void Delay(unsigned int tc) //顯示延時程序
- {while( tc != 0 )
- {unsigned int i;
- for(i=0; i<100; i++);
- tc--;}
- }
-
- void Init_DS18B20(void) //發送復位
- {
- unsigned char i=0;
- //TMDAT=0; delay_us(240); delay_us(240);//168 for(i=0;i<103;i++); //370us
- // TMDAT = 1;delayus(46);//5 for(i=0;i<4;i++); // 16 us
- TMDAT = 1; //DQ復位
- delay_us(80); //稍做延時
- TMDAT = 0; //單片機將DQ拉低
- delay_us(240); //精確延時 大于 480us
- delay_us(240);
- TMDAT = 1; //拉高總線
- delay_us(60);
- i=TMDAT;
- delay_us(240); //等待設備釋放數據線
- delay_us(180);
-
- }
-
- unsigned char ReadOneChar(void){//讀一個字節
- unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--){
- TMDAT = 0; // 給脈沖信號
- dat>>=1;
- TMDAT = 1; // 給脈沖信號
- if(TMDAT ==1){
- dat|=0x80;
- }
- delay_us(60);
- }
- return(dat);
- }
-
- void WriteOneChar(unsigned char dat)//寫一個字節
- { unsigned char i=0;
- for (i=8; i>0; i--)
- {
- TMDAT= 0;
- TMDAT = dat&0x01;
- delay_us(60);
- TMDAT = 1;
- dat>>=1;
- }
- }
- unsigned int ReadTemperature(void)//讀取溫度
- { unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器
- a=ReadOneChar(); //讀低8位
- b=ReadOneChar(); //讀高8位
- t=b;
- t<<=8;
- t=t|a;
- if(t<0x0fff)//前五位為0
- fg=0; //+溫度時的標志
- else
- {fg=1;
- t=~t+1*10-7;//得到真實溫度*10 ,為了顯示后一位小數,-7使負誤差減小為0.1度
- } //-溫度時的標志
- tt=t*0.0625;
- t= tt*10+0.5; //放大10倍輸出并四舍五入
- tem=t;
- return(t);
- }
- /*
- void Led()
- {
- if(fg==0) //溫度為正時顯示的數據
- {
- w1=w2=w3=w4=1;
- w1=0;
- P3=seg7code[tem%1000/100];//輸出十位數
- Delay(15);
- w1=1;
- w2=0;
- P3=seg7code[tem%100/10]|0x80; //輸出個位和小數點
- Delay(15);
- w2=1;
- w3=0;
- P3=seg7code[tem%10]; //輸出小數點后第一位
- Delay(15);
- w3=1;
- w4=0;
- P3=seg7code[11];//輸出c
- Delay(15);
- w1=w2=w3=w4=1;
- // P0=seg7code[xiaoshu2]; //輸出小數點后第二位
- // Delay(4); P2=P2|0xf0;
- }
-
- if(fg==1) //溫度為負時顯示的數據
- { w1=w2=w3=w4=1;
- w1=0;
- P3=seg7code[10]; //負號
- Delay(15);
- w1=1;
- w2=0;
- P3=seg7code[tem%100/10]|0x80; //輸出個位數和小數點
- Delay(15);
- w2=1;
- w3=0;
-
- P3=seg7code[tem%10]; //輸出小數第1位
- Delay(15);
- w3=1;
- w4=0;
-
- P3=seg7code[11];//輸出c
- Delay(15);
- w1=w2=w3=w4=1;
- //P0=seg7code[xiaoshu]; //輸出小數點后第一位
- // Delay(4); P2=P2|0xf0;
- }
- }
- */
- main()
- {fg=0;
- led=0;
- led1=0;
- P3M0=0x00;
- P3M1=0x00;//P3口推挽
- // P1M0=0x00;
- // P1M1=0x00;
- while(1)
- {
- for(k=0;k<100;k++)
- {Delay(15);
- ReadTemperature();
- // Led();
- Delay(15);
- if(tem>=400)//風扇1啟動溫度40
- {led=1;
- }
- if(tem>=500)//風扇2啟動溫度50
- {led1=1;
- }
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料下載(含仿真與源碼):
1820帶溫度控制104e.rar
(98.84 KB, 下載次數: 94)
2017-4-30 12:35 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|