以下学习内容来自小蜜蜂老师!!
1.选择锁存器函数
通过打通锁存器的方式来实现IO口控制对应功能,不写下面函数蓝桥杯15单片机是不能像51单片机一样正常运行功能的!!
void SelectHC573(unsigned channnel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f)|0x80; //选择LED
break;
case 5:
P2 = (P2 & 0x1f)|0xa0; //选择蜂鸣器和继电器
break;
case 6:
P2 = (P2 & 0x1f)|0xc0; //选择数码管位选
break;
case 7:
P2 = (P2 & 0x1f)|0xe0; //选择数码管段选
break;
case 0:
P2 = (P2 & 0x1f)|0x00; //不选择锁存器
break;
}
}
2.系统初始化
void init_system()
{
SelectHc573(5);
P0 = 0x00;
SelectHc573(4);
P0 = 0xff;
SelectHc573(0);
}
上面有注释哦!
3.显示数码管的值
巧妙地运用了位运算,在历年的真题中数码管显示都是重中之重的,请大家仔细学习!!
void Display_bitSMG(unsigned char pos,unsigned char dat)
{
Select_HC573(7);
P0 = 0xff;
SelectHc573(6);
P0 = 0x01<<pos;
SelectHc573(7);
P0 = dat;
Select_HC573(0);
}
4.DS18B20的读取温度
DS18B20是我们进阶要学习的一个外设,下面是温度转换和读取的流程,第二张是对于正温度和负温度做的处理,我给出的示例代码是只读取温度的整数部分,小数部分直接舍去,比赛很少有读取小数的情况,所以第二张图大家了解就可以。
unsigned int temp = 0;
void Read_DS18B20temp()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_ds18b20(500);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
temp = MSB;
temp = (temp<<8)|LSB;
temp = temp>>4;
}
5.ds1302的初始化
在开始和末尾要对0x8e地址写入0x00和0x80,第一次是关闭写保护,这样我们可以写入数据,最后关闭写保护,防止数据被篡改,中间循环是把初始化的时间写入对应的地址内.
以下是日历时钟寄存器的内部示意图以及相应字节的功能
常用的存储器地址和配置参数如下:
void Init_ds1302()
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i = 0;i<=3;i++)
{
Write_Ds1302_Byte(Write_addr[i],TIME[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
最后是实时更新时间的代码,把从地址读出的数据放回到存储数组中,就可以实时更新,在比赛中ds1302,ds18b20的驱动函数都会给出,大家不用担心还要自己写驱动的问题!
void Read_ds1302time()
{
char i;
for(i = 0;i<3;i++)
{
TIME[i] = Read_Ds1302_Byte(Read_addr[i]);
}
}
第一次发博客,吸纳大家的建议,如果反响好的话,接下来会更新我自己写出的第八届省赛的代码!谢谢大家!