0
收藏
微博
微信
复制链接

STC12C2052AD单片机控制的数码管时钟程序及电路图

提问于
2024-03-31 16:13

     STC12C2052AD单片机控制的数码管时钟,数码管是共阳4位时钟数码管,由于使用单片机真驱,电路比较简单,且使用的材料和工具也很简单,用数码管显示,单片机控制,两个按键调时,蜂鸣器整点报时。所需要的元件如下:

       材料有以下这些:
        STC12C2052AD单片机一片
        黄色共阳4位时钟数码管一块
        6mm×6mm按键两个
        杜邦线插针2p两个
        无源蜂鸣器一个
        20脚+14脚芯片座各一个
        洞洞板一块(截取一小部分)
        100欧电阻4个



     源程序如下:
  1. #include   //声明头文件

  2.   

  3. sbit key1=P3^4;  //按键接口定义

  4. sbit key2=P3^5;  //按键接口定义

  5. sbit speaker=P3^7;  //蜂鸣器接口定义

  6. /************************************************************************************/

  7. unsigned char code LED[10]={0x20,0xA7,0x90,0x82,0x07,0x42,0x40,0xA6,0x00,0x02};//数码管段位码定义

  8. unsigned int time; //全局秒基准定义

  9. /*-------------------------------------延时函数-------------------------------------*/

  10. void delayms (unsigned int a){

  11. unsigned int i;

  12. while( --a != 0){

  13. for(i = 0; i < 600; i++);

  14. }

  15. }

  16. /*----------------------------------蜂鸣器驱动函数----------------------------------*/

  17. void beep (void)

  18. {   

  19. unsigned char i=30;

  20. while(i--)

  21. {

  22. speaker=~speaker;

  23. delayms(3);

  24.     }

  25. }

  26. /*----------------------------------数码管驱动函数----------------------------------*/

  27. void display (unsigned char hour,min)

  28. {

  29. unsigned char H1,H2,M1,M2;

  30. P3=0xf8; //数码管位选

  31. P1 = LED[H1];     //数码管段选

  32. delayms (2); //扫描延时

  33. P3=0xf4; //数码管位选

  34. P1 = LED[H2];     //数码管段选

  35. delayms (2); //扫描延时

  36. P3=0xf2; //数码管位选

  37. P1 = LED[M1];     //数码管段选

  38. delayms (2); //扫描延时

  39. P3=0xf1; //数码管位选

  40. P1 = LED[M2];     //数码管段选

  41. delayms (2); //扫描延时

  42. /*--------------------------------------分定义--------------------------------------*/

  43. M1=min/10;//取分十位

  44. min=min%10;//取余  

  45. M2=min;//取分个位

  46. /*--------------------------------------时定义--------------------------------------*/

  47. H1=hour/10;//取时十位

  48. hour=hour%10;//取余  

  49. H2=hour;//取时个位

  50. }

  51. /*-----------------------------------按键去抖函数-----------------------------------*/

  52. void qudou (unsigned char hour,min)

  53. {

  54. unsigned char i;

  55. for(i=0;i<25;i++){//循环显示,等于键盘去抖的功能

  56. display (hour,min);

  57. }

  58. }

  59. /*--------------------------------------主函数--------------------------------------*/

  60. void main(void)

  61. {

  62. ////定时器初始设置

  63. TMOD=0x01;//定时器工作方式1

  64. TH0=0x3C;//定时器初始产生50ms时基信号

  65. TL0=0xB0;//定时器初始产生50ms时基信号

  66. ET0=1;//开定时器中断

  67. EA=1;//开总中断

  68. TR0=1;//启动定时器

  69. /*************************************************************************************/

  70. while(1)

  71. {

  72. unsigned char hour,min;//定义时分


  73. display (hour,min);//调用显示函数


  74. if (time>59)//60秒向分进1

  75. {

  76. time=0;

  77. min++;

  78.    }

  79. if (min>59)//60分向时进1

  80. {

  81. min=0;

  82. hour++;

  83. beep ();

  84.     }

  85. if (hour>23)//24时时分秒清零

  86. {

  87. hour=0;

  88. min=0;

  89. time=0;

  90. }

  91. /*-----------------------------------按键判断程序-----------------------------------*/

  92. if(key1==0)

  93. qudou (hour,min);

  94. if (key1==0) {hour++;}


  95. if(key2==0)

  96. qudou (hour,min);

  97. if (key2==0) {min++;}

  98. }

  99. }

  100. /*-----------------------------------中断服务程序-----------------------------------*/

  101. void Timer0_Routine(void) interrupt 1

  102. {

  103. unsigned char a;

  104. TH0=0x3C;//定时器初始产生50ms时基信号

  105. TL0=0xB0;//定时器初始产生50ms时基信号

  106.     a++;//定时器循环计数20次为一秒

  107. if (a==20){//定时器循环计数20次为一秒

  108. a=0;//次数清零,从新循环计数

  109. time++;//秒加一

  110. }

  111. }

收藏 67 0 0