纯硬件电路
使用前将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即可。
输出最大为六位数
蓝桥杯底层驱动直接调用
说明书第九页有具体写入读出地址
注意先把写保护位置0关闭写保护
之后直接调用写入读出即可
芯片内数据采用BCD码储存
14届时序正确 不需要改动
1.调用初始化函数
2.DS18B20写入0xcc (跳过rom)
3.再写入0x44 (启动温度检测)
(此处可以稍加延时 可能900ms左右 但是本人用的时候没加延时 功能正常)
4.再次调用初始化函数
5.写入0xcc(跳过rom)
6.写入0xbe(进行读暂存器)
7.接收数据 先后分别接收低八位和高八位 总共十六位
其中 高八位中的高5位为符号位,前五位全为1则为负温度
低四位为小数位 最低位为2的-4次方 即最低位0.0625
负温度时计算温度需要取反再加1
一.写入的模板
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停止函数
蓝桥杯的板子上,光敏接到了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
加入absacc.h头文件 通过XBYTE[ ]进行操作
注意板子上的模式脚短接
使用该模式会占用P3^6引脚
XBYTE[0x8000] 等效于越过138译码器直接操作P0 对LED进行操作
XBYTE[0xa000] 同理蜂鸣器继电器
XBYTE[0xc000] 同理数码管(位选)
XBYTE[0xe000] 同理数码管(段码)