第七届蓝桥杯初赛——————模拟风扇控制系统

本文详细介绍了第七届蓝桥杯初赛中设计的一个模拟风扇控制系统,使用单片机STC15F2K60S2,结合C语言编写代码,实现了温度显示和风扇控制功能。代码中利用了DS18B20温度传感器获取数据,并通过单总线接口进行通信。同时,文中提到了在处理PWM部分遇到的问题及解决方案,通过调整定时器设置成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码部分(实现题目要求的全部功能)
#include<stc15f2k60s2.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^4; //单总线接口
uchar tab[]={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xFF,0XBF,0xc6};
uchar yi,er,san,si,wu,liu,qi,ba;
uchar feng_set=1;
bit feng_flag=0;
uchar shijian=0;
uchar time_cishu=0;
uint num=0;
uint wendu=0;
bit xianshi=0;
uint num1=0,num2=0;num3=0;
uint t=0;
void allint();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void Delayms(uint ms);
void keyscan();
void Timer0Init(void);
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
uchar DS18B20_Get();

void main()
{
allint();
Timer0Init();
while(1)
{
keyscan();
if(feng_set1)
{
if(shijian)
{
P2=0X80;P0=0XFE;
// ET0=1;
}
else if(!shijian)
{
P2=0X80;P0=0XFF;
// ET0=0;
}
}
else if(feng_set
2)
{
if(shijian)
{
P2=0X80;P0=0XFD;
// ET0=1;
}
else if(!shijian)
{
P2=0X80;P0=0XFF;
// ET0=0;
}
}
else if(feng_set3)
{
if(shijian)
{
P2=0X80;P0=0XFB;
// ET0=1;
}
else if(!shijian)
{
P2=0X80;P0=0XFF;
// ET0=0;
}
}
// if(shijian
0)
// {
// EA=0;ET0=0;
// }
if(xianshi0)
{
yi=11;er=feng_set;san=11;si=10;wu=shijian/1000;liu=shijian%1000/100;qi=shijian%100/10;ba=shijian%10;
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
else if(xianshi
1)
{
wendu=DS18B20_Get();
yi=11;er=4;san=11;si=10;wu=10;liu=wendu/10;qi=wendu%10;ba=12;
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}

}
void allint()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}
void display1(uchar yi,uchar er)
{
P2=0XC0;P0=0X01;P2=0XE0;P0=tab[yi];Delayms(1);
P2=0XC0;P0=0X02;P2=0XE0;P0=tab[er];Delayms(1);
}
void display2(uchar san,uchar si)
{
P2=0XC0;P0=0X04;P2=0XE0;P0=tab[san];Delayms(1);
P2=0XC0;P0=0X08;P2=0XE0;P0=tab[si];Delayms(1);
}
void display3(uchar wu,uchar liu)
{
P2=0XC0;P0=0X10;P2=0XE0;P0=tab[wu];Delayms(1);
P2=0XC0;P0=0X20;P2=0XE0;P0=tab[liu];Delayms(1);
}
void display4(uchar qi,uchar ba)
{
P2=0XC0;P0=0X40;P2=0XE0;P0=tab[qi];Delayms(1);
P2=0XC0;P0=0X80;P2=0XE0;P0=tab[ba];Delayms(1);
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}
void Delayms(uint ms) //@11.0592MHz
{
unsigned char i, j;
uint n;
for(n=0;n<ms;n++)
{
nop();
nop();
nop();
i = 11;
j = 190;
do
{
while (–j);
} while (–i);
}
}
void keyscan()
{
if(P300)
{
Delayms(5);
if(P30
0)
{
if(xianshi0)
{
xianshi=1;
}
else if(xianshi
1)
{
xianshi=0;
}
}
while(!P30);
}
if(P310)
{
Delayms(5);
if(P31
0)
{
shijian=0;
}
while(!P31);
}
if(P320)
{
Delayms(5);
if(P32
0)
{
time_cishu++;
if(time_cishu3)
{
time_cishu=0;
}
shijian=time_cishu*60;
}
while(!P32);
}
if(P33
0)
{
Delayms(5);
if(P330)
{
feng_flag=1;
if((feng_set
1)&&(feng_flag1))
{
feng_flag=0;
feng_set=2;
}
else if((feng_set
2)&&(feng_flag1))
{
feng_flag=0;
feng_set=3;
}
else if((feng_set
3)&&(feng_flag==1))
{
feng_flag=0;
feng_set=1;
}
}
while(!P33);
}
}

void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xAE; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;ET0=1;
}

void Timer0() interrupt 1
{
num++;
t++;
if(num10000)
{
num=0;
}
if(shijian!=0)
{
if(num
9999)
{
num=0;
shijian–;
}
}

if(feng_set==1)
{
	if(t==2)
	{
		P34=0;
	}
	else if(t==10)
	{
		t=0;
		P34=1;
	}
}
else if(feng_set==2)
{
	if(t==3)
	{
		P34=0;
	}
	else if(t==10)
	{
		t=0;
		P34=1;
	}
}
else if(feng_set==3)
{
	if(t==7)
	{
		P34=0;
	}
	else if(t==10)
	{
		t=0;
		P34=1;
	}
}

}
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
while(t–);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;

for(i=0;i<8;i++)
{
	DQ = 0;
	dat >>= 1;
	DQ = 1;
	if(DQ)
	{
		dat |= 0x80;
	}	    
	Delay_OneWire(50);
}
return dat;

}

//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;

DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100); 
initflag = DQ;     
Delay_OneWire(50);

return initflag;

}

uchar DS18B20_Get()
{
uchar low,high,temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);

init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
low=low>>4;
high=high<<4;
temp=low|high;
return temp;

}
小结:写这个题目的时候可谓一波三折,前边写的非常顺利,在处理pwm部分我采用了两个定时器来解决,但就是这个方法使我困在这道题目里两天,原因可能是我采用的定时器1定时长度太短造成的,后来我将两个部分整合到一个定时器就解决了这些问题。
注:黄色部分依旧是发布时页面省略了等号,复制时注意即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值