打印
[51单片机]

从业将近十年!手把手教你单片机程序框架(连载)

[复制链接]
楼主: jianhong_wu
手机看帖
扫描二维码
随时随地手机跟帖
281
jianhong_wu|  楼主 | 2014-5-12 12:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
第四十六节:利用AT24C02进行掉电后的数据保存。

开场白:
一个AT24C02可以存储256个字节,地址范围是(0至255)。利用AT24C02存储数据时,要教会大家六个知识点:
第一个:单片机操作AT24C02的通讯过程也就是IIC的通讯过程, IIC通讯过程是一个要求一气呵成的通讯过程,中间不能被其它中断影响时序出错,因此在整个通讯过程中应该先关闭总中断,完成之后再开中断。
第二个:在写入或者读取完一个字节之后,一定要加上一段延时时间。在11.0592M晶振的系统中,写入数据时经验值用delay_short(2000),读取数据时经验值用delay_short(800)。否则在连续写入或者读取一串数据时容易丢失数据。如果一旦发现丢失数据,应该适当继续把这个时间延长,尤其是在写入数据时。
第三个:如何初始化EEPROM数据的方法。系统第一次上电时,我们从EEPROM读取出来的数据有可能超出了范围,可能是ff。这个时候我们应该给它填入一个初始化的数据,这一步千万别漏了。
第四个:在时序中,发送ACK确认信号时,要记得把数据线eeprom_sda_dr_s设置为输入的状态。对于51单片机来说,只要把eeprom_sda_dr_s=1就可以。而对于PIC或者AVR单片机来说,它们都是带方向寄存器的,就不能直接eeprom_sda_dr_s=1,而要直接修改方向寄存器,把它设置为输入状态。在本驱动程序中,我没有对ACK信号进行出错判断,因为我这么多年一直都是这样用也没出现过什么问题。
第五个: 提醒各位读者在硬件上应该注意的问题,单片机跟AT24C02通讯的2根IO口都要加上一个4.7K左右的上拉电阻。凡是在IIC通讯场合,都要加上拉电阻。AT24C02的WP引脚一定要接地,否则存不进数据。
第六个:旧版的朱兆祺51学习板在硬件上有一个bug,AT24C02的第8个引脚VCC悬空了!!!,读者记得把它飞线连接到5V电源处。新版的朱兆祺51学习板已经改过来了。

具体内容,请看源代码讲解。

(1)硬件平台:
    基于朱兆祺51单片机学习板。

(2)实现功能:
    4个被更改后的参数断电后不丢失,数据可以保存,断电再上电后还是上一次最新被修改的数据。
    显示和独立按键部分根据第29节的程序来改编,用朱兆祺51单片机学习板中的S1,S5,S9作为独立按键。
      一共有4个窗口。每个窗口显示一个参数。
     第8,7,6,5位数码管显示当前窗口,P-1代表第1个窗口,P-2代表第2个窗口,P-3代表第3个窗口,P-4代表第1个窗口。
     第4,3,2,1位数码管显示当前窗口被设置的参数。范围是从0到9999。S1是加按键,按下此按键会依次增加当前窗口的参数。S5是减按键,按下此按键会依次减少当前窗口的参数。S9是切换窗口按键,按下此按键会依次循环切换不同的窗口。


(3)源代码讲解如下:
第四十六节源代码讲解.rar (6.02 KB)
总结陈词:
   IIC通讯过程是一个要求一气呵成的通讯过程,中间不能被其它中断影响时序出错,因此,在整个通讯过程中应该先关闭总中断,完成之后再开中断。但是,这样就会引起另外一个新问题,如果关闭总中断的时间太长,会导致动态数码管不能及时均匀的扫描,在按键更改参数,内部操作EEPROM时,数码管就会出现短暂明显的闪烁现象,解决这个问题最好的办法就是在做项目中尽量不要用动态扫描数码管的方案,应该用静态显示的方案。那么在程序上还有没有改善这种现象的方法?当然有。欲知详情,请听下回分解-----操作AT24C02时,利用“一气呵成的定时器方式”改善数码管的闪烁现象。
  
(未完待续,下节更精彩,不要走开哦)

使用特权

评论回复
282
hfy1992926| | 2014-5-12 19:04 | 只看该作者
看完以后收益匪浅,感觉在学校学的有一头雾水,看了hong哥的贴子后豁然开朗的感觉,hong哥能否发个关于12864液晶的框架介绍。邮箱1049497182@qq.com

使用特权

评论回复
283
cjseng| | 2014-5-12 21:44 | 只看该作者
jianhong_wu 发表于 2014-5-12 12:52
第四十六节:利用AT24C02进行掉电后的数据保存。

开场白:

1.假如有上位机不定时通过串口给单片机发数据,把中断关闭就要丢数据了;
2.延时的大小可以查看Datasheet,而且建议不要用Delay,可以用其它方法解决(比如定时器);
3.第一次上电需要初始化,这是对的,但以后每次上电也要检查数据是否超出范围;
4.没出过问题不代表永远不会出问题,还是按照规则来比较好,当芯片焊接不良或芯片出问题时程序能捕获到故障并进行适当的处理;
5.如果单片机IO不是OC,可以不加上拉;WP引脚不接地保持悬空即可以读写数据。

使用特权

评论回复
284
jianhong_wu|  楼主 | 2014-5-13 00:09 | 只看该作者
cjseng 发表于 2014-5-12 21:44
1.假如有上位机不定时通过串口给单片机发数据,把中断关闭就要丢数据了;
2.延时的大小可以查看Datasheet ...

感谢你的建议,感觉你功力也挺深厚的。以下一一回复你的问题。

1.假如有上位机不定时通过串口给单片机发数据,把中断关闭就要丢数据了;
回复:你说的也对,但是也不全对,要看什么项目。大部分的系统,它操作EEPROM肯定不会频繁周期性的。
所以撞在一起的可能性很小,即使恰好撞在一起了,只要你上位机跟单片机的通信协议是遵循一发一应答协议的,那么上位机肯定能察觉到发送失败,上位机可以重发或者提醒用户。
2.延时的大小可以查看Datasheet,而且建议不要用Delay,可以用其它方法解决(比如定时器);
回复:Delay和定时器各有各的特点,Delay延时函数的特点是编程简单,时间细分高,我认为大部分操作EEPROM的项目都可以直接用Delay。
3.第一次上电需要初始化,这是对的,但以后每次上电也要检查数据是否超出范围;
回复:我现在的源代码已经是这么做了。
4.没出过问题不代表永远不会出问题,还是按照规则来比较好,当芯片焊接不良或芯片出问题时程序能捕获到故障并进行适当的处理;
回复:如果想检测芯片焊接是否不良,还有一种更加实用的方法,就是读取固定的一个地址内容,如果发现这个地址的内容不是特定的内容,则认为焊接虚焊或者短路,或者芯片有问题。下一节我会把这个技巧教给大家。
5.如果单片机IO不是OC,可以不加上拉;WP引脚不接地保持悬空即可以读写数据。
回复:你说的也许有道理。但是加了上拉电阻无论对什么单片机都不会有负面影响,这个是双保险,我们又何乐而不为呢?

使用特权

评论回复
285
jianhong_wu|  楼主 | 2014-5-13 00:12 | 只看该作者
本帖最后由 jianhong_wu 于 2014-5-13 00:14 编辑
hfy1992926 发表于 2014-5-12 19:04
看完以后收益匪浅,感觉在学校学的有一头雾水,看了hong哥的贴子后豁然开朗的感觉,hong哥能否发个关于1286 ...

感谢你的夸奖。请继续关注我的连载技术贴。现在还没写到12864液晶屏的内容,估计还要一段时间。如果不急的话,请耐心等待。如果急的话,你先自己想想其它办法。我目前还做不到送货上门,主动给网友发邮件的服务,请谅解。

使用特权

评论回复
286
zhjyuanji| | 2014-5-13 08:28 | 只看该作者
wm8510   CAN USB 文件读取 希望能提及

使用特权

评论回复
287
jianhong_wu|  楼主 | 2014-5-13 09:50 | 只看该作者
zhjyuanji 发表于 2014-5-13 08:28
wm8510   CAN USB 文件读取 希望能提及

我没做过这方面的项目。只做过U盘读取。

使用特权

评论回复
288
xjjspace| | 2014-5-13 10:07 | 只看该作者
之前在其他论坛看过一次,最近又看,发现东西真是常学常新啊

使用特权

评论回复
289
cjseng| | 2014-5-13 10:31 | 只看该作者
另外,IIC的WP是写保护,一概接地,小心不要被冲了数据。

使用特权

评论回复
290
jianhong_wu|  楼主 | 2014-5-13 11:36 | 只看该作者
cjseng 发表于 2014-5-13 10:31
另外,IIC的WP是写保护,一概接地,小心不要被冲了数据。


当然啦。如果IO口足够多,WP引脚专门接一个IO口,并且加一个上拉电阻,需要更改EEPROM存储数据时置低,其他任何一个时刻都置高,这样是最佳效果。

使用特权

评论回复
291
zhjyuanji| | 2014-5-14 10:18 | 只看该作者
串口发送9位数据用于地址识别没讲

使用特权

评论回复
292
jianhong_wu|  楼主 | 2014-5-14 11:42 | 只看该作者
zhjyuanji 发表于 2014-5-14 10:18
串口发送9位数据用于地址识别没讲

地址识别是属于串口协议的问题,具体哪个字节代表地址,读者可以根据不同的项目自己制定不同的串口协议,我就不单独讲这个问题了,因为不是所有的项目都需要地址识别。

使用特权

评论回复
293
cjseng| | 2014-5-14 12:04 | 只看该作者
jianhong_wu 发表于 2014-5-14 11:42
地址识别是属于串口协议的问题,具体哪个字节代表地址,读者可以根据不同的项目自己制定不同的串口协议, ...

第九位数据不是指哪一个字节,这是用于主从多机通讯,跟协议无关。

使用特权

评论回复
294
逸2014| | 2014-5-14 14:10 | 只看该作者
虽然看不懂但感觉好牛b的样子

使用特权

评论回复
295
jianhong_wu|  楼主 | 2014-5-14 20:45 | 只看该作者
cjseng 发表于 2014-5-14 12:04
第九位数据不是指哪一个字节,这是用于主从多机通讯,跟协议无关。

貌似有点印象,但是我从来没用过。串口通讯我只用8个数据位。平时做多机通讯的项目,我都是用485通讯,这种广播呼叫模式恰恰跟协议有关。

使用特权

评论回复
296
cjseng| | 2014-5-14 22:34 | 只看该作者
jianhong_wu 发表于 2014-5-14 20:45
貌似有点印象,但是我从来没用过。串口通讯我只用8个数据位。平时做多机通讯的项目,我都是用485通讯,这 ...

为什么多机通讯就要485?我一块板子上经常有好几个单片机,直接TTL串口通讯,第九位就很有用了。

使用特权

评论回复
297
jianhong_wu|  楼主 | 2014-5-15 10:45 | 只看该作者
cjseng 发表于 2014-5-14 22:34
为什么多机通讯就要485?我一块板子上经常有好几个单片机,直接TTL串口通讯,第九位就很有用了。 ...

因为我做的项目要求通讯距离比较远,所以不得不用485。感谢你的提醒,如果以后有遇到在一块板子上进行多机通讯的项目,我就知道第九位的用途了。

使用特权

评论回复
298
zhjyuanji| | 2014-5-15 11:46 | 只看该作者
cjseng 发表于 2014-5-14 22:34
为什么多机通讯就要485?我一块板子上经常有好几个单片机,直接TTL串口通讯,第九位就很有用了。 ...

有没有例程

使用特权

评论回复
299
cjseng| | 2014-5-15 12:38 | 只看该作者
zhjyuanji 发表于 2014-5-15 11:46
有没有例程

找个单片机教科书,上面的例程写得很清晰。
就是接收时,判断一下RB_8,如果是1,就表示接收到的是地址,与该地址匹配的单片机继续接收接下来的数据,不匹配的就不用理会。
现在有的厂家的单片机把这个功能做到硬件上了,如果地址匹配,则会引起中断,不匹配,根本不会产生中断,这样用起来就更方便了。

使用特权

评论回复
300
jianhong_wu|  楼主 | 2014-5-15 12:38 | 只看该作者
第四十七节:操作AT24C02时,利用“一气呵成的定时器延时”改善数码管的闪烁现象。

开场白:
上一节在按键更改参数时,会出现短暂明显的数码管闪烁现象。这节通过教大家使用新型延时函数可以有效的改善闪烁现象。要教会大家三个知识点:
第一个:如何编写一气呵成的定时器延时函数。
第二个:如何编写检查EEPROM芯片是否存在短路,虚焊或者芯片坏了的监控程序。
第三个:经过网友“cjseng”的提醒,我建议大家以后在用EEPROM芯片时,如果单片机IO口足够多,WP引脚应该专门接一个IO口,并且加一个上拉电阻,需要更改EEPROM存储数据时置低,其他任何一个时刻都置高,这样可以更加有效地保护EEPROM内部数据不会被意外更改。

具体内容,请看源代码讲解。

(1)硬件平台:
    基于朱兆祺51单片机学习板。旧版的朱兆祺51学习板在硬件上有一个bug,AT24C02的第8个引脚VCC悬空了!!!,读者记得把它飞线连接到5V电源处。新版的朱兆祺51学习板已经改过来了。


(2)实现功能:
    4个被更改后的参数断电后不丢失,数据可以保存,断电再上电后还是上一次最新被修改的数据。如果AT24C02短路,虚焊,或者坏了,系统可以检查出来,并且蜂鸣器会间歇性鸣叫报警。按更改参数按键时,数码管比上一节大大降低了闪烁现象。
    显示和独立按键部分根据第29节的程序来改编,用朱兆祺51单片机学习板中的S1,S5,S9作为独立按键。
      一共有4个窗口。每个窗口显示一个参数。
     第8,7,6,5位数码管显示当前窗口,P-1代表第1个窗口,P-2代表第2个窗口,P-3代表第3个窗口,P-4代表第1个窗口。
     第4,3,2,1位数码管显示当前窗口被设置的参数。范围是从0到9999。S1是加按键,按下此按键会依次增加当前窗口的参数。S5是减按键,按下此按键会依次减少当前窗口的参数。S9是切换窗口按键,按下此按键会依次循环切换不同的窗口。


(3)源代码讲解如下:
第四十七节源代码讲解.rar (5.86 KB)
总结陈词:
    下一节开始讲关于单片机驱动实时时钟芯片的内容,欲知详情,请听下回分解-----利用DS1302做一个实时时钟  。
(未完待续,下节更精彩,不要走开哦)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则