主要记录实际使用中的一些注意点。
1.LCD1602
电路图:
看手册:电源和背光可以使用5v或者3.3v,数据和控制引脚直接和单片机引脚连接即可。
单片机型号:stm32c031c6t6 可以直接使用推完输出连接D0--D7,RS,EN,RW引脚,3.3v就可以驱动(我使用的是这种方式);或者使用开漏输出,外面加上拉电阻5v驱动(没有用,不知道效果)。
两个间隔时间:
1.控制时序的延时:这个用的多,时间太短会显示不正常,或者不显示。
2.发给lcm指令之间的延时:一般初始化的时候回用一下
/*液晶初始化*/
void Lcm1602A_Init(void)
{ Lcm1602A_Wr_Command(0x38);Lcm1602A_Wr_Command(0x38); //2次显示模式设置Lcm1602A_Wr_Command(0x0c); //显示及光标设置Lcm1602A_Wr_Command(0x01); //显示清屏HAL_Delay(2);Lcm1602A_Wr_Command(0x06); //显示光标移动设置Lcm1602A_Display_String();
}
/*发送指令给lcd*/
void Lcm1602A_Wr_Command(uint8_t wrcommand)
{RS_1602A(0);//控制引脚RW_1602A(0);//控制引脚Lcm_Delay(LCM_DELAY_TIME);//这个延时很重要Lcm1602A_Data_Write(wrcommand);//写入数据(指令)Lcm_Delay(LCM_DELAY_TIME);E_1602A(1);//使能引脚Lcm_Delay(LCM_DELAY_TIME);E_1602A(0);
}
遇到的问题:减少Lcm_Delay(LCM_DELAY_TIME)时间;导致初始化失败,可是看手册的话,接受一个指令1us就够了,可是实际使用却需要几十us或者更长时间才够,不知道哪里的问题。先不管了。
Lcm_Delay(LCM_DELAY_TIME)不同时间下:
初始化效果:
正常如下
间隔100us如下
间隔50us:
间隔10us如下
间隔2us如下
其他状况:
本来应该是第一行显示0--9 符号 第二行显示字母的,
不知道是程序被动过了,还是编译环境,还是什么有变化,初始化完成就变成了这样。
同样的时间下,连续两行显示全部显示不成功,但是一次显示几个字符却可以正常显示,当时调试的时候,就是这原因没注意到初始化没成功。
处理方式:增长延时的时间,lcd显示不需要很实时。
原因:同样的Lcm_Delay(LCM_DELAY_TIME) (大概延时10us),
(外部晶振用的是25mhz)定时器tim3的Prescaler = 47; Period = 1;可以正常初始化
改成Prescaler = 24; Period = 999; 初始化会出错。
2.rs485、rs232、rs422
rs485使用:
max3485:3.3v左右驱动
max485:5v左右驱动,不过有时候3.3v驱动也可以使用,具体有什么问题或者通过电路规避问题还没有了解过。
rs485和rs422有相同的地方,485满足422的规范,反过来不行,要注意。
MAX481/MAX483/MAX485/ MAX487:用于rs485
MAX488/MAX490/MAX491:用于rs422
MAX232/MAX3232:用于 rs232
以上是常见型号,不同公司命名方式不同,
通讯芯片:rs485芯片使用电路图
此电路图是简单版本,没有偏置电路(上下拉),防冲击器件,可以使用的,只是少了安全等旁电路。
资料:
RS485使用注意事项(上下拉电阻)
https://www.cnblogs.com/CodeWorkerLiMing/p/14259593.html
rs485调试遇过的问题:
单片机引脚TX和RX搞反了,测试max487之前的串口是有数据的,电脑串口助手能够接受到,经过接收不到了。 找原因以为是ab相少了上下拉电阻;电压什么不对,后来确定原因是引脚反了,虽然反了,但是中间偶尔也能收到几个正确的字符,所以开始主要以为是程序有问题。
如果max输入端没问题,输出端差分引脚ab接反了,电脑串口助手也能收到字符,就像波特率不对,也能收到字符,不过解析出来的是乱码。