提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
一、该题目如下
分析题目,具体框架是矩阵键盘伴随着数值的输出,当数值满足条件时,去加加,然后执行对应的函数即可完成题目。具体的一些模块代码如下供参考。
二、使用步骤
1.矩阵键盘实现
矩阵键盘必须要求J5中的端口插在BIN上,且当555分频器在用时矩阵键盘P3^4引脚被占用,本人就上一个实验做得频率检测导致这个bug卡了好几次
代码如下(示例):
void Scaner_key_value()
{
R1=R2=R3=R4=1;L1=L2=L3=L4=0;
if((P3&0x0f)!=0x0f)
{
if(R1==0) key_value=7;
else if(R2==0) key_value=6;
else if(R3==0) key_value=5;
else if(R4==0) key_value=4;
R1=R2=R3=R4=0;L1=L2=L3=L4=1;
if(L1==0) {key_value=key_value+0;while(L1==0);}
else if(L2==0) {key_value=key_value+4;while(L2==0);}
else if(L3==0) {key_value=key_value+8;while(L3==0);}
else if(L4==0) {key_value=key_value+12;while(L4==0);}
}
if(key_value==12)
{
cnt++;
key_value=0;
mnt=0;
dis_t_c=0;
if(cnt==3) cnt=0;
}
if(key_value==13)
{
mnt++;
key_value=0;
if(mnt==2) mnt=0;
}
}
开始保证的左引脚置1,右引脚置0,然后检测行,然后再进行按键判断再给列数赋值。随后给予右引脚置1,左引脚置0,判断列,给予行对应的加数判断即可,此方法代码量少,但是逻辑有点复杂且防抖功能不好添加。
另外一种矩阵键盘如下,一个一个的检测代码如下:
L1=0;
L2=L3=L4=1;
R1=R2=R3=R4=1;
if(R1==0)
{
while(R1==0)
{
key=7;
}
}
if(R2==0)
{
while(R2==0)
{
key=6;
}
}
if(R3==0)
{
while(R3==0)
{
key=5;
}
}
if(R4==0)
{
while(R4==0)
{
key=4;
}
}
L2=0;
L1=L3=L4=1;
R1=R2=R3=R4=1;
if(R1==0)
{
while(R1==0)
{
key=11;
}
}
if(R2==0)
{
while(R2==0)
{
key=10;
}
}
if(R3==0)
{
while(R3==0)
{
key=9;
}
}
if(R4==0)
{
while(R4==0)
{
key=8;
}
}
L3=0;
L2=L1=L4=1;
R1=R2=R3=R4=1;
if(R1==0)
{
while(R1==0)
{
key=15;
}
}
if(R2==0)
{
while(R2==0)
{
key=14;
}
}
if(R3==0)
{
while(R3==0)
{
key=13;
}
}
if(R4==0)
{
while(R4==0)
{
key=12;
}
}
L4=0;
L2=L3=L1=1;
R1=R2=R3=R4=1;
if(R1==0)
{
while(R1==0)
{
key=19;
}
}
if(R2==0)
{
while(R2==0)
{
key=18;
}
}
if(R3==0)
{
while(R3==0)
{
key=17;
}
}
if(R4==0)
{
while(R4==0)
{
key=16;
}
}
}
2.温度传感器ds18b20的实现
一下这些牢记
/*温度传感器要点
1.注意temp赋值前要进行初始化为0x0000。
2.注意给温度传感器Ds18b20给予初始化时,一个0xcc跳过ROM(就是跳过存储设备),一个0x44转化数据
中间给予一个延时,最好把数码管刷新放进去,然后再次初始化Ds18b20继续一个0xcc跳过存储设备,0xbc代表
着读取ds18b20中的数据。
3.最关键的一步ds18b20中的头文件onewire.h必须要将延时扩大10倍。
4.ds18b20芯片得到的数据是两个字节,从地位字节开始再到高字节介绍,且数据和位的关系如下,按下表进行转换即可
*/
分析次表的到后四位是小数部分且为0.0625的整倍数,高四位代表的正负,所以想到得到对应的温度,必须将第四位合理的去除,数字合理的放大,保留一位小数放大十倍即可。
onewire.c中的代码将delay延长10倍
代码如下(示例):
void Dis_DS18B20()
{
unsigned char Hse=0,Lse=0;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Tm_delay(80);//这个延时必须加
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
Lse=Read_DS18B20();
Hse=Read_DS18B20();
/* temp=0x0000;
temp=Hse;
temp=(temp<<8)|Lse;
temp=temp>>4;
temp=10*temp;
temp=temp+(Lse&0x0f)*0.625;*/
temp=0x0000;//一定要初始化不然报错
temp=(Lse>>4)*10+Hse*160+(Lse&0x0f)*0.625;
/*temp=Hse;
temp=(temp<<8)|Lse;
temp=temp>>4;
temp=10*temp;
temp=temp+(Lse&0x0f)*0.625;*/
}
拿到温度即可去在数码管上进行显示
3.时间传感器ds1302的实现
该芯片的意思是,初始化是需要将读保护位打开
然后将写入地址
写入即可,伴随着时间的数据
保存其中即可,以下是代码和数据图。
注意时间传感器采用的是bcw码
就是用十六进制去表示是进制,比如需要写入数据16时只要写入0x16即可,读到的数据也需要去进行对应的处理,整除16为十位,16的余数为个位,
void Init_ds1302()
{
Write_Ds1302_Byte(0x8e,0x00); //打开写保护位
Write_Ds1302_Byte(0x80,0x40); //秒的初始化
Write_Ds1302_Byte(0x82,0x59); //分的初始化
Write_Ds1302_Byte(0x84,0x23); //时的初始化
Write_Ds1302_Byte(0x8e,0x80); //打开读保护位
}
void Dis_Ds1302()
{
buf[0]=Read_Ds1302_Byte(0x81);//读取秒的时间
buf[1]=Read_Ds1302_Byte(0x83);//读取分的时间
buf[2]=Read_Ds1302_Byte(0x85);//读取时的时间
}
总结
以上就是本人的总结,直接缩减就是,ds18b20温度流程就是
1. 初始化函数
2. 写入跳过ROM地址0xcc,转化数据地址044
3. 再来初始化,写入跳过ROM地址0xcc,读取数据地址为0xbc,再从读取函数中获取数据第一次是第八位第二次是高八,然后转化数据即可。
ds1302总结
1.地址分为读取和写入
2.数据为bcm码十六进制表示十进制