STC15系列单片机学习笔记——扫描频率可改变的电子钟

科技 科技 1172 人阅读 | 0 人回复

<
1.单片机表面图
105215s9ds8q9t9nvtvw9i.jpg

2.相干道理图
105216o03m90zdck5vfmb3.jpg

3.案例目标
数字钟是经由过程计数模仿时钟,将计数值转换成工夫情势,以格局时-分-秒正在LED数码管长进止显现,并经由过程按键调节扫描频次,该尝试分8个等级,经由过程对应8个两极管从左至左唆使扫描频次愈来愈下的8中扫描频次。
4.源代码片断阐发
4.1 导进头文件和变量界说
  1. #include<STC15F2K60S2.H>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit led_sel=P2^3;//收光两极管的背极
  6. sbit key1= P3 ^2; //掌握数码管扫描频次
  7. /*---------变量界说---------*/
  8. //七段码(段选),0-9
  9. uchar duanxuan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,
  10.                     0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  11. uchar const line = 0x40; //横杠的七段码
  12.                                                                                
  13. int key1ActionFlag = 0;     //值为1时暗示按键操纵
  14. char timeAddOneFlag = 0;    //标识表记标帜为1,此时需求秒+1
  15. int ledActionFlag=0;        //led灯的标记
  16. uint ledOnFlag = 0;         //led灯明
  17. char tubeOnFlag = 0;        //数码管明
  18. int myDisplay[8] = {0};     //数码管显现的内乱容
  19. int ledValue = 1;           //led显现的数值
  20. uint currHour = 0;
  21. uint currMinute = 0;
  22. uint currSecond = 0;
  23. uint interCount = 0;
  24. uint keyDownTime = 0;
  25. uint scanTime = 1;  //扫描工夫
  26. uint currBit = 0;   //当前显现的位
复造代码
4.2 数码管代码片断
  1. /**
  2. * 数码管设置为显现指定的数值
  3. */
  4. void changeAll(long num) {
  5.     int i;
  6.     for (i = 7; i >= 0; --i) {
  7.         int foo = num % 10;
  8.         myDisplay[i] = duanxuan[foo];
  9.         num /= 10;
  10.     }
  11. }
  12. /**
  13. * 改动此中一名的内乱容
  14. */
  15. void change1Bit(int bitNum, int value) {
  16.     myDisplay[bitNum - 1] =duanxuan[value];
  17. }
  18. /**
  19. * 改动此中一名的内乱容为"-"(设置七段码)
  20. */
  21. void setline(int bitNum) {
  22.     myDisplay[bitNum - 1] =line;
  23. }
  24. /**
  25. * 显现数码管
  26. */
  27. void showTube() {
  28.     if (tubeOnFlag) {
  29.         switchToTube();
  30.         P0 = 0;
  31.         P2 = currBit; //选定位
  32.         P0 = myDisplay[currBit];//按照地位得出段选的数值
  33.         Delay5us();
  34.     }
  35. }
复造代码
4.3 LED灯代码片断
  1. /**
  2. * led明
  3. */
  4. void displayLed() {
  5.     if (ledOnFlag) {
  6.         switchToLed();
  7.         P0 = ledValue;
  8.     }
  9. }
复造代码
4.5 led灯取数码管的转换函数
  1. /**
  2. * 设置ledSel,转化led或数码管设置
  3. */
  4. void switchToLed() {
  5.     P0 = 0;
  6.     led_sel = 1;
  7. }
  8. void switchToTube(){
  9. led_sel =0;
  10. }
  11. void Delay5us()       //@11.0592MHz
  12. {
  13.     unsigned char i;
  14.     _nop_();
  15.     i = 11;
  16.     while (--i);
  17. }
复造代码
4.6 按键操纵
[code]/** * 按下key1要做的事 */void key1Action() {    if (key1ActionFlag) {        if (ledValue == 0x80)            ledValue = 0x01;        else            ledValue <span class="token operator">
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则