标题:
简易散热风扇控制器设计STC15F104e单片机+DS18B20+ULN2003A仿真和源程序
[打印本页]
作者:
3760609865
时间:
2017-4-30 12:39
标题:
简易散热风扇控制器设计STC15F104e单片机+DS18B20+ULN2003A仿真和源程序
stc15f104e+ds18b20+ULN2003A简易散热风扇控制器,压缩包内有用C51的仿真和原程序C。新手发帖,请多指教
下面是风扇控制器的仿真原理图:
0.png
(33.2 KB, 下载次数: 77)
下载附件
2017-4-30 17:37 上传
F1 40度启动 F2 50度启动
F1 小于35度停止 F2 小于 45度停止
用8051仿真15F104E,用小灯泡代替小风扇好看点,因为风扇停止太慢。
0.png
(71.91 KB, 下载次数: 78)
下载附件
2017-4-30 17:36 上传
散热风扇控制器的单片机源程序:
///朱旭东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 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2017-4-30 17:43
好资料,51黑有你更精彩
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1