底层练习~~~~~

一些注意事项啊~~


代码参考:<我的GitHub>底层练习


1. 数码管:{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
底层练习~~~~~_第1张图片
2. E2PROM: 24C02的寻址器件地址(0x50<<1)(表示后续操作为写:0是写,1是读);
3. E2Read:读数据:*buf++ = I2CReadACK(); 注意!!!最后一个字节读是:*buf = I2CReadNAK();
4. E2PROM每一个字节最多8位(u8类型!!!!);
5. E2Write(页写入):注意加入了1个大循环,判断页(while(len>0)),还有判断是否到达页边界的操作:if((addr & 0x70) == 0) ;
6.不管是读还是写,判断完器件之后就要写入地址(I2CWrite(addr)),然后再执行读写操作;
6. PCF8591:寻址器件(0x48<<1),控制字节(0x40),注意一下和E2PROM的不同之处,显示温度或者电压时最好把不用的数码管关掉,要得到变化的电压值,需要不断刷新电压值(每200ms获取一次电压值)
底层练习~~~~~_第2张图片
I2C协议(注意!!!读写数据时从高位到低位(mask = 0x80)
7. DS18B20:时序要求严格(读写数据要记得关闭中断!!!!),记住几个操作指令:0xCC(跳过ROM检测)0x44(启动温度转换)0xBE(读暂存寄存器);还有就是 !!!使用的是1-Wire协议(读写数据时从低位到高位(mask = 0x01))
8. I2C读和18B20读有相似之处,那就是必须在单片机释放总线的情况下,才能读取数据;
9. 18B20读写数据的时候,必须先产生一个2us的低电平脉冲
10. 底层练习~~~~~_第3张图片
11. 底层练习~~~~~_第4张图片
底层练习~~~~~_第5张图片
12. DS1302 :DS1302ByteWrite()函数写入数据之前要先把IO引脚拉高!!! DS1302SingleRead()和DS1302BurstRead()最后要把IO口拉低!!!!!
13. DS1302与SPI时序类似,读写数据时从低位向高位读写!!!(mask=0x01)
14. 只有向DS1302内部寄存器上读写数据时才需要使能CE(所以Byte读写都不需要使能!!!!!
15. 得到实时时间(先把DS1302内部的数据读出来,然后再给结构体赋值),设置时间(先把结构体的值存到数组里,再把数组的数据写入DS1302)这两个函数都与寄存器有关,记住!!:寄存器0-6对应(秒,分,时,日,月,周,年)
16. 初始化1302的代码:

void InitDS1302()
{
	struct sTime InitTime[] = {0x00, 0x00, 0x00, 0x10, 0x20, 0x30, 0x02};
	DS1302_CE = 0;//初始化状态,时序图可见
	DS1302_CK = 0;//初始化状态,时序图可见
	DS1302SingleWrite(7, 0x00);//撤销写保护,第7个寄存器的功能相关
	SetRealTime(&InitTime);
}

17. 结构体定义放.h文件比较好,不用加extern!!!

  • NOTICE!!! Byte读写一位数据完毕后都要先拉高再拉低时钟,完成1个位的操作!!!!
    底层练习~~~~~_第6张图片
    emmm,这是第一遍。。。。
    !!!!!按键部分有一个被忽视的问题:
    底层练习~~~~~_第7张图片

第三遍底层遇到的问题。。。。。
还是DS18B20和DS1302不太熟。。。。
温度显示(不显示小数)错误找两点:

  • MSB清除符号位没有写(MSB &= 0x0F)
  • temp清除小数部分没有写(temp >>= 4)
  • 记住三个操作指令!!!!!
    • 跳过ROM(0xCC)
    • 开始温度转化(0x44)
    • 读取转换温度(0xBE)

DS1302的错误:

  • 突发读写要判断!!!!
    • 突发读(0xBF)
    • 突发写(0xBE)
  • 两条指令要记牢!!!
    • 寻址写(reg << 1 | 0x80)
    • 寻址读(reg << 1 | 0x81)

你可能感兴趣的:(蓝桥备赛)