|
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)
|
评分
-
查看全部评分
|