蓝桥杯进阶(单片机)
博主通过了今年的蓝桥杯测试后,发现其实蓝桥杯不难,其主要在于你对它题目的理解,已给源文件的使用,以及相应模块部分的代码书写(如:DS18B20, DS1302, IIC协议)这些的模块要重点记忆,近几年的省赛题都涉及到它们中的部分。
记下来让我们进入更深的学习(博主这里只提供代码和运用思路,如果想对原理有了解的朋友可以参考“小蜜蜂老师”博客上的一些内容)
有了蓝桥杯的基础,我们就可以进行更高级的控制
PWM波
这是在定时器上进行的改动,在定时器前定义一个pwm_duty, pwm_duty的值来控制占空比
unsigned char count = 0;
unsigned char PWM_duty = 0;
void InitTimer0()
{
TMOD = 0x01;
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
ET0 = 1;
EA = 1; //缺少TR0,这是用来控制定时器开关的,可以写在开关中来控制pwm的占空比
}
void timer0() interrupt 1
{
TH0 = -100 / 256; //Hz
TL0 = -100 % 256;
count++;
if(count <= pwm_duty) //小于参数为低
{
L1 = 0;
}
else if(count < 100) //大于参数,小于100份为高
{
L1 = 1;
}
else if (count ==100) //等于100份时初始化
{
L1 = 0;
count = 0;
}
}
DS18B20
DS18B20主要就是通过函数来读取被芯片时时采集的数,使用onewire.c和onewire.h
下面的函数就是采集函数,T-dat采集出来的是3位数,在题目要求2位时可以用 /10 的操作来取掉最后的小数(这是一种取巧的方法,后面会更新正确的做法)
void Read_Temperature()
{
unsigned char LSB,MSB;
Init_DS18B20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Delay(1000);
Init_DS18B20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
Init_DS18B20();
T_dat = 0x0000;
T_dat = MSB;
T_dat <<= 8;
T_dat = T_dat | LSB;
if((T_dat & 0xf800) == 0x0000)
{
T_dat >>= 4;
T_dat = T_dat*10;
T_dat = T_dat + (LSB&0x0f)*0.625;
}
}
之后只需要把T-dat用dispiay_Bit函数(参考蓝桥杯基础)显示出来即可
注意的是如果显示出来的数不变化,或者显示8.5.3.就要去onewire.c中修改一下延时的倍数一般乘10