赛前准备

版权声明:本文为博主原创文章,未经博主允许不得转载。 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是光敏电阻调节的电压输入,关键代码

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声明数据类型的别名


猜你喜欢

转载自blog.csdn.net/ytlxl/article/details/79772969