蓝桥杯单片机第七届省赛模拟风扇系统

蓝桥杯单片机第七届省赛模拟风扇系统

初来乍到,发表的第一次文章,自己耗时大半天完成,基础知识在B站小蜜蜂老师那里学的,CSDN也有小蜜蜂老师的笔记,可以自己搜索学习,基础知识讲的还是很到位的。希望我的作品能给看的人带来帮助。不懂的地方可以私信我,最近在线比较频繁。全是为了12届蓝桥杯比赛!


main.c:

#include "reg52.h"
#include "onewire.h"
#include "absacc.h"
#define uchar unsigned char
sfr AUXR=0x8e;
sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
sbit s7=P3^0;
unsigned char code smgduanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f}; 
uchar code smgdot[10]={0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};//有小数点,显示温度时用
uchar time=0;
uchar temp=0;
uchar us=0;
uchar ms=0;
uchar pwm=0;
uchar s4_state=1;
uchar s7_state=1;
void delay(uchar t)
{
	while(t--);
}
void display_onesmg(uchar value,uchar pos)
{
	XBYTE[0xe000]=0xff;
	XBYTE[0xc000]=0x01 << pos;
	XBYTE[0xe000]=value;
}
void close_allsmg(uchar value)
{
	XBYTE[0xc000]=0xff;
	XBYTE[0xe000]=value;
}
void display_time()
{
	display_onesmg(smgduanma[16],0);
	delay(100);
	display_onesmg(smgduanma[s4_state],1);
	delay(100);
	display_onesmg(smgduanma[16],2);
	delay(100);
	display_onesmg(0xff,3);
	delay(100);
	display_onesmg(smgduanma[0],4);
	delay(100);
	display_onesmg(smgduanma[time/100],5);
	delay(100);
	    display_onesmg(smgduanma[(time%100)/10],6);
	delay(100);
	display_onesmg(smgduanma[time%10],7);
	delay(100);
	close_allsmg(0xff);
}
void display_temp()
{
	display_onesmg(smgduanma[16],0);
	delay(100);
	display_onesmg(smgduanma[4],1);
	delay(100);
	display_onesmg(smgduanma[16],2);
	delay(100);
	display_onesmg(0xff,3);
	delay(100);
	display_onesmg(smgduanma[temp/100],4);
	delay(100);
	display_onesmg(smgdot[(temp%100)/10],5);
	delay(100);
	display_onesmg(smgduanma[temp%10],6);
	delay(100);
	display_onesmg(smgduanma[12],7);
	delay(100);
	close_allsmg(0xff);
}
 void scanner_s4()
 {
	 if(s4 == 0)
	 {
		 delay(100);
		 if(s4 == 0)
		 {
			 if(s4_state == 1)
			 {
				 s4_state=2;
				 while(s4 == 0);
				 {
					 XBYTE[0x8000]=0xfd;
				 }
			 }
			 else if(s4_state == 2)
			 {
				 s4_state=3;
				 while(s4 == 0)
				 {
					 XBYTE[0x8000]=0xfb;
				 }
			 }
			 else if(s4_state == 3)
			 {
				 s4_state=1;
				 while(s4 == 0)
				 {
					 XBYTE[0x8000]=0xfe;
				 }
			 }
		 }
	 }
 }
 void scanner_s5()
 {
	 if(s5 == 0)
	 {
		 delay(100);
		 if(s5 == 0)
		 {
			 while(s5 == 0);
			 time=time+60;
			 if((time>=60) && (time<120))   time=60;
			 if((time>=120) && (time<180))  time=120;
			 if(time>=180)                   time=0;
		 }
	 }
 }
 void scanner_s6()
 {
	 if(s6 == 0)
	 {
		 delay(100);
		 if(s6 == 0)
		 {
			 while(s6 == 0);
			 time=0;
		 }
	 }
 }
 void scanner_s7()
 {
	 if(s7 == 0)
	 {
		 delay(100);
		 if(s7 == 0)
		 {
			 while(s7 == 0);
			 if(s7_state == 1)
			 {
				 s7_state=0;
			 }
			 else if(s7_state == 0)
			 {
				 s7_state=1;
			 }
		 }
	 }
 }
 void initT0()      //定时100微秒,定时器1,方式0
 {
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA=1;
	ET0=1;
 }
 void serviceT0() interrupt 1
 {
	 TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	 us++;
	 if(us == 10)  us=0;//pwn脉冲调制1毫秒一个周期,分成10份,每份100微秒
	 if(s4_state == 1)
	 {
		 if(us<=2)  pwm=1;
		 else       pwm=0;
	 }
	 if(s4_state == 2)
	 {
		 if(us<=3)  pwm=1;
		 else       pwm=0;
	 }
	 if(s4_state == 3)
	 {
		 if(us<=7)  pwm=1;
		 else       pwm=0;
	 }
 }
 void initT1()     //定时器1,方式二,定时50毫秒
 {
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;		//设置定时器模式
	TL1 = 0xB0;		//设置定时初值
	TH1 = 0x3C;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	EA=1;
	ET1=1;
 }
 void serviceT1() interrupt 3
 {
	TL1 = 0xB0;		//设置定时初值
	TH1 = 0x3C;		//设置定时初值
	ms++;
	 if(ms == 20)     //定时1秒
	 {
		 ms=0;
		 temp=read_Temp();//每一秒钟获取一次温度
		 if(time > 0)
		 {
			 time--;
		 }
	 }
 }
main()
{
	XBYTE[0x8000]=0xff;
	XBYTE[0xa000]=0x00;
	initT1();
	initT0();
	while(1)
	{
		scanner_s4();
		scanner_s5();
		scanner_s6();
		scanner_s7();
		if(s7_state == 1)
		{
			display_time();
		}
		else if(s7_state == 0)
		{
			display_temp();
			XBYTE[0x8000]=0xff;
		}
	}
}
///

onewire.c:

#include "reg52.h"
sbit DQ = P1^4;  //单总线接口
//单总线延时函数
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;
}

unsigned char read_Temp()
{
	unsigned char low=0,higt=0;
	unsigned char Temp=0;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	low=Read_DS18B20();
	higt=Read_DS18B20();
	
	Temp=(higt << 8) | low;
	if((Temp & 0xf800) == 0x0000)
	{
		Temp >>= 4;
		Temp=Temp*10;
		Temp=Temp + (low & 0x0f) * 0.625;
	}
	return Temp;
	
}
///

onewire.h:

#ifndef __ONEWIRE_H
#define __ONEWIRE_H
unsigned char rd_temperature(void);
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
void delay_ds18b20(unsigned char t);
unsigned char read_Temp();

#endif
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值