微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第47节:操作AT24C02利用定时器延时改善数码管的闪烁

第47节:操作AT24C02利用定时器延时改善数码管的闪烁

时间:11-22 来源:互联网 点击:
开场白:
上一节在按键更改参数时,会出现短暂明显的数码管闪烁现象。这节通过教大家使用新型延时函数可以有效的改善闪烁现象。要教会大家三个知识点:
第一个:如何编写一气呵成的定时器延时函数。
第二个:如何编写检查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)源代码讲解如下:

  1. #include "REG52.H"
  2. #define const_voice_short40 //蜂鸣器短叫的持续时间
  3. #define const_key_time120 //按键去抖动延时的时间
  4. #define const_key_time220 //按键去抖动延时的时间
  5. #define const_key_time320 //按键去抖动延时的时间
  6. #define const_eeprom_1s 400 //大概1秒的时间
  7. void initial_myself(void);
  8. void initial_peripheral(void);
  9. void delay_short(unsigned int uiDelayShort);
  10. void delay_long(unsigned int uiDelaylong);
  11. void delay_timer(unsigned int uiDelayTimerTemp); //一气呵成的定时器延时方式
  12. //驱动数码管的74HC595
  13. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
  14. void display_drive(void); //显示数码管字模的驱动函数
  15. void display_service(void); //显示的窗口菜单服务程序
  16. //驱动LED的74HC595
  17. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
  18. void start24(void);//开始位
  19. void ack24(void);//确认位
  20. void stop24(void);//停止位
  21. unsigned char read24(void);//读取一个字节的时序
  22. void write24(unsigned char dd); //发送一个字节的时序
  23. unsigned char read_eeprom(unsigned int address); //从一个地址读取出一个字节数据
  24. void write_eeprom(unsigned int address,unsigned char dd); //往一个地址存入一个字节数据
  25. unsigned int read_eeprom_int(unsigned int address); //从一个地址读取出一个int类型的数据
  26. void write_eeprom_int(unsigned int address,unsigned int uiWriteData); //往一个地址存入一个int类型的数据
  27. void T0_time(void);//定时中断函数
  28. void key_service(void); //按键服务的应用程序
  29. void key_scan(void);//按键扫描函数 放在定时中断里
  30. void eeprom_alarm_service(void); //EEPROM出错报警
  31. sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
  32. sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
  33. sbit key_sr3=P0^2; //对应朱兆祺学习板的S9键
  34. sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平
  35. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  36. sbit eeprom_scl_dr=P3^7; //时钟线
  37. sbit eeprom_sda_dr_sr=P3^6; //数据的输出线和输入线
  38. sbit dig_hc595_sh_dr=P2^0; //数码管的74HC595程序
  39. sbit dig_hc595_st_dr=P2^1;
  40. sbit dig_hc595_ds_dr=P2^2;
  41. sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序
  42. sbit hc595_st_dr=P2^4;
  43. sbit hc595_ds_dr=P2^5;
  44. unsigned char ucKeySec=0; //被触发的按键编号
  45. unsigned intuiKeyTimeCnt1=0; //按键去抖动延时计数器
  46. unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
  47. unsigned intuiKeyTimeCnt2=0;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top