微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第37节:数码管作为仪表盘显示跑马灯的方向,速度和状态

第37节:数码管作为仪表盘显示跑马灯的方向,速度和状态

时间:11-22 来源:互联网 点击:
开场白:

我在第24节中讲过按键控制跑马灯的方向,速度和运行状态的项目程序,只可惜那个程序不能直观地显示运行中的三种状态,这节我决定在24节的基础上,增加一个数码管显示作为类似汽车仪表盘的界面,实时显示跑马灯的方向,速度,和运行状态。

这一节要教会大家一个知识点:继续加深理解运动,按键与数码管三者之间的关联程序框架。

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

(1)硬件平台:

基于朱兆祺51单片机学习板。用S1键作为控制跑马灯的方向按键,S5键作为控制跑马灯方向的加速度按键,S9键作为控制跑马灯方向的减速度按键,S13键作为控制跑马灯方向的启动或者暂停按键。记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。

(2)实现功能:

跑马灯运行:第1个至第8个LED灯一直不亮。在第9个至第16个LED灯,依次逐个亮灯并且每次只能亮一个灯。每按一次独立按键S13键,原来运行的跑马灯会暂停,原来暂停的跑马灯会运行。用S1来改变方向。用S5和S9来改变速度,每按一次按键的递增或者递减以10为单位。

数码管显示:本程序只有1个窗口,这个窗口分成3个局部显示。8,7,6位数码管显示运行状态,启动时显示“on”,停止时显示“oFF”。5位数码管显示数码管方向,正向显示“n”,反向显示“U”。4,3,2,1位数码管显示速度。数值越大速度越慢,最慢的速度是550,最快的速度是50。

(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_key_time420 //按键去抖动延时的时间
  7. void initial_myself();
  8. void initial_peripheral();
  9. void delay_short(unsigned int uiDelayShort);
  10. void delay_long(unsigned int uiDelaylong);
  11. //驱动数码管的74HC595
  12. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
  13. void display_drive(); //显示数码管字模的驱动函数
  14. void display_service(); //显示的窗口菜单服务程序
  15. //驱动LED的74HC595
  16. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
  17. void led_flicker_09_16(); //第9个至第16个LED的跑马灯程序,逐个亮并且每次只能亮一个.
  18. void led_update();//LED更新函数
  19. void T0_time();//定时中断函数
  20. void key_service(); //按键服务的应用程序
  21. void key_scan();//按键扫描函数 放在定时中断里
  22. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  23. sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
  24. sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
  25. sbit key_sr3=P0^2; //对应朱兆祺学习板的S9键
  26. sbit key_sr4=P0^3; //对应朱兆祺学习板的S13键
  27. sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平
  28. sbit led_dr=P3^5;
  29. sbit dig_hc595_sh_dr=P2^0; //数码管的74HC595程序
  30. sbit dig_hc595_st_dr=P2^1;
  31. sbit dig_hc595_ds_dr=P2^2;
  32. sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序
  33. sbit hc595_st_dr=P2^4;
  34. sbit hc595_ds_dr=P2^5;
  35. unsigned char ucKeySec=0; //被触发的按键编号
  36. unsigned intuiKeyTimeCnt1=0; //按键去抖动延时计数器
  37. unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
  38. unsigned intuiKeyTimeCnt2=0; //按键去抖动延时计数器
  39. unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志
  40. unsigned intuiKeyTimeCnt3=0; //按键去抖动延时计数器
  41. unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志
  42. unsigned intuiKeyTimeCnt4=0; //按键去抖动延时计数器
  43. unsigned char ucKeyLock4=0; //按键触发后自锁的变量标志
  44. unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
  45. unsigned char ucLed_dr1=0; //代表16个灯的亮灭状态,0代表灭,1代表亮
  46. unsigned char ucLed_dr2=0;
  47. unsigned char ucLed_dr3=0;
  48. unsigned char ucLed_dr4=0;
  49. unsigned char ucLed_dr5=0;
  50. unsigned char ucLed_dr6=0;
  51. unsigned char ucLed_dr7=0;
  52. unsigned char ucLed_dr8=0;
  53. unsigned char ucLed_dr9=0;
  54. unsigned char ucLed_dr10=0;
  55. unsigned char ucLed_dr11=0;
  56. unsigned char ucLed_dr12=0;
  57. unsigned char ucLed_dr13=0;
  58. unsigned char ucLed_dr14=0;
  59. unsigned char ucLed_dr15=0;
  60. unsigned char ucLed_dr16=0;
  61. unsigned char ucLed_update=0;//刷

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

网站地图

Top