蓝桥杯单片机第七届省赛模拟风扇系统
初来乍到,发表的第一次文章,自己耗时大半天完成,基础知识在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