版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ytlxl/article/details/79772969
明天就是蓝桥杯的比赛了,这一年准备其他比赛去了,另外专业课也比较多,所以这一年没有什么进步,有点担心明天的比赛,为了结果不是那么难看,此时还是好好的复习一下。
1、DS18B20
一个温度传感器,需要在程序中导入onewire.h头文件,以下是关键代码
//ds18b20
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe);
要点:0xcc是为了跳过rom检测,44为启动温度检测,be是开始读出温度数据
2、DS1302
一个时钟芯片,在程序中导入ds1302.h头文件,以下是关键代码
初始化:
//ds1302
ds1302_single_byte_write(0x8e,0x00);
ds1302_single_byte_write(0x80,s);
ds1302_single_byte_write(0x82,m);
ds1302_single_byte_write(0x84,h);
ds1302_single_byte_write(0x8e,0x80);
要点:0x8e是写保护寄存器,因此第一行是为了打开写保护位,最后一行关闭写保护位
读取时间:
s=Ds1302_Single_Byte_Read(0x81);
Ds1302_Single_Byte_Write(0x00,0x00);
m=Ds1302_Single_Byte_Read(0x83);
Ds1302_Single_Byte_Write(0x00,0x00);
h=Ds1302_Single_Byte_Read(0x85);
Ds1302_Single_Byte_Write(0x00,0x00);
要点:读时间时将地址字节的最后一位置为1,之前读时间老是不对,网上说加上这句
Ds1302_Single_Byte_Write(0x00,0x00);
加上之后读取十分稳定
3、矩阵键盘
P3=0xf0;P42=1;P44=1;
if(P34!=1||P35!=1||P42!=1||P44!=1)
{
Delay20ms();
if(P34!=1||P35!=1||P42!=1||P44!=1)
{
if(P34==0)value=1;
if(P35==0)value=2;
if(P42==0)value=3;
if(P44==0)value=4;
P3=0x0f;P42=0;P44=0;
if(P33==0)value=value*4;
if(P32==0)value=value*4+1;
if(P31==0)value=value*4+2;
if(P30==0)value=value*4+3;
while((P3&0x0f)!=0x0f);
}
}
要点:首先读取列,再读取行,iap15f2k61s2使用P42、P44分别代替P36、P37
4、pcf8591
pcf8591是一个ad模块,用来读取电压,其中通道3是rb2电位器调节的电压输入,通道1是光敏电阻调节的电压输入,关键代码
扫描二维码关注公众号,回复:
5064696 查看本文章
u你signed char V;
iic_start();
iic_sendbyte(0x90);
iic_waitack();
iic_sendbyte(way);
iic_waitack();
iic_start();
iic_sendbyte(0x91);
iic_waitack();
V=iic_recbyte();
iic_stop();
return V;
要点:way为通道号,返回的V要在主函数里乘以大约19才是电压值(mv)
5、at24c02
at24c02是一个eeprom模块,也就是一个存储器,相当于我们电脑里的硬盘,以下是关键代码
从地址address读取,返回dat:
//at24c02 read
iic_start();
iic_sendbyte(0xa0);
iic_waitack();
iic_sendbyte(address);
iic_waitack();
iic_start();
iic_sendbyte(0xa1);
iic_waitack();
dat=iic_recbyte();
iic_ack(1);
iic_stop();
return dat;
要点:0xa0为at24c02在单片机上的地址,adress是要读取的eeprom地址,0xa1是因为最后一位是读写位
将dat存到eeprom的address地址里:
//at24c02 write
iic_start();
iic_sendbyte(0xa0);
iic_waitack();
iic_sendbyte(address);
iic_waitack();
iic_sendbyte(dat);
iic_waitack();
iic_stop();
5、其他
led:
//IO方式:
P2=(P2&0x1f)|0x80;
P0=leddisplayvalue;
P2&=0x1f;
//MM方式:
XBYTE[0x8000]=leddisplayvalue;
数码管:
//IO方式:
P2=(P2&0x1f)|0xe0;
P0=tab[display[wei]];
P2&=0x1f;
P2=(P2&0x1f)|0xc0;
P0=1<<wei;
P2&=0x1f;
MM方式:
XBYTE[0xe000]=tab[display[wei]];
XBYTE[0xc000]=1<<wei;
定时器0的中断码:1
定时器1的中断码:3
定时器2的中断码:12
stc15.h的源程序在stc-isp软件里
数码管显示0-9,熄灭,c:c0,f9,a4,b0,99,92,82,f8,80,90,c6
typedef声明数据类型的别名