蓝桥杯单片机组的个人笔记

一.NE555

纯硬件电路

使用前将P34和NAL短接

定义两个时钟分别工作于T1计时和T0计数,计数的设置去翻手册,TMOD |= 0x05;或者TMOD |=0x04;都可以。(都要进行手动重载!)下面给一个T0的定义,可以参考

void Timer0Init(void)		
{
	TMOD |= 0x04;		
	TL0 = 0x00;		
	TH0 = 0x00;		
	TR0 = 1;		
}

本质就是NE555输出脉冲到NAL引脚,NAL传到P34,P34又是T0的计数器引脚,进去一次T0计数一次,保存到TL0和TH0中,T1计时间,时间到后停止T0(即TR0 = 0),然后读TL0和TH0即可。

输出最大为六位数

二.DS1302时钟芯片

蓝桥杯底层驱动直接调用

说明书第九页有具体写入读出地址

注意先把写保护位置0关闭写保护

之后直接调用写入读出即可

芯片内数据采用BCD码储存

三.DS18B20温度芯片

使用onewire底层驱动 里面包含了DS18B20初始化函数

14届时序正确 不需要改动

1.调用初始化函数

2.DS18B20写入0xcc (跳过rom)

3.再写入0x44 (启动温度检测)

(此处可以稍加延时 可能900ms左右 但是本人用的时候没加延时 功能正常)

4.再次调用初始化函数

5.写入0xcc(跳过rom)

6.写入0xbe(进行读暂存器)

7.接收数据 先后分别接收低八位和高八位 总共十六位

其中 高八位中的高5位为符号位,前五位全为1则为负温度

低四位为小数位 最低位为2的-4次方 即最低位0.0625

负温度时计算温度需要取反再加1

四.AT24C02存储器

使用iic进行通讯,直接使用蓝桥杯的底层驱动

一.写入的模板

1.iic启动函数

2.iic发送0xa0(AT24C02的写地址)

3.等待应答

4.iic发送 (想要存储的地址数据)

5.等待应答

6.iic发送 (想要在上述地址里面写入的内容)

7.等待应答

8.iic停止函数

9.延时5ms(此处为写入所用时,个人用了5ms没问题)

二.读出的模板

1.iic启动函数

2.iic发送0xa0

3.等待应答

4.iic发送(想要读取的地址)

5.等待应答

(以上是用于进行一次伪写操作)

6.iic启动函数

7.iic发送0xa1(AT24C02的读地址)

8.等待应答

9.接收数据 例如 uc_dat = I2CReceiveByte();

10.发送 非应答 I2CSendAck(1); (之前学习的时候,有遇见过资料代码此处发送0进行应答,自己使用的时候出现了很奇怪的问题,后来才发现是这里搞错了)

11.iic停止函数

五.PCF8591

使用iic进行通讯,直接调用底层驱动

蓝桥杯的板子上,光敏接到了AIN1 即通道一 即控制寄存器应该写入:0x01

电位器接到了AIN3 即通道三 即控制寄存器应该写入:0x03

ADC的模板:

1.iic启动函数

2.iic发送0x90(PCF8591的写设备地址)

3.等待应答

4.iic发送控制字节(测啥发啥 比如光敏0x01 电位器0x03

5.等待应答

6.iic停止函数

(此处也许需要延时,等待电压转换完成,但本人没有使用,一切正常,大家可以酌情加入延时)

7.iic启动函数

8.iic发送0x91(PCF8591的读设备地址)

9.等待应答

10.接收数据 例如ui_tep = I2CReceiveByte();(传出值0-255)

11.发送 非应答 I2CSendAck(1); (之前学习的时候,有遇见过资料代码此处发送0进行应答,自己使用的时候出现了很奇怪的问题,后来才发现是这里搞错了)

12.iic停止函数

DAC的模板:

1.iic启动函数

2.iic发送0x90(PCF8591的写设备地址)

3.等待应答

4.iic发送0x43(此处选用电位器来调节输出的电压)

5.等待应答

6.iic发送(电压占比)(以蓝桥杯的板子为例 可发送0-255(即电压在0-5v之间变化) 当发送255时 输出占比最高,输出5v(实际测的大概在4.7v左右))

7.等待应答

8.iic停止函数

DAC写完烧录后,可以用电压表测测它输出是否一切正常,具体看你的板子中原理图中PCF8591的out位,我的板子中是连到了J3的最后两个引脚,即19 20脚。用电压表看看输出是否和预想的一致,就可以判断写的对不对了。

注意,若要ADC和DAC同时使用时,请把ADC中的第4条 控制字节中的DA转换打开,例如 用电位器控制输出电压 同时还要把电位器的电压读出来 则上面的ADC中第4条设置为 0x43。否则实际测得的电压会偏差比较大。比如输入电压占比为255(最大值)的时候,电压实测为4.1V。如果ADC改成了0x43,则电压实测为4.7v。本人是在两个函数同时放在main中反复刷新读取的结果,所以猜测是AD DA开关位反复开关使得电压变小,持续保持开则会稍微大一点,接近理论值。

六.超声波模块

很简单的一个模块 设置一个定时器计时 定义一下TX脚和RX脚

在蓝桥杯的板子上 TX = P1^0; RX = P1^1;

做个发送超声波的函数

例如

unsigned char uc_i;
    for(uc_i = 0;uc_i<=7;uc_i++)
    {
        TX = 1;
        Delay14us();
        TX = 0;
        Delay14us();
    }

40khz的波 差不多25us发送一个周期 两段延时在这附近就行了

之后计时就行了 TH 和 TL 都设置为0计时 超出了就算失败 毕竟也测不了那么远

注意计时器的开关 发波后开 收到后关

之后判断(RX == 1) && (TF1 == 0)  (接收到时RX自动置0,或者溢出时TF会置1)

再判断有没有溢出就行了 没溢出就正常算 

distence = 时间x340÷2

七.MM模式

加入absacc.h头文件 通过XBYTE[ ]进行操作

注意板子上的模式脚短接

使用该模式会占用P3^6引脚

XBYTE[0x8000] 等效于越过138译码器直接操作P0 对LED进行操作 

XBYTE[0xa000] 同理蜂鸣器继电器

XBYTE[0xc000] 同理数码管(位选)

XBYTE[0xe000] 同理数码管(段码)

你可能感兴趣的:(单片机,蓝桥杯)