分享

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

 快乐读书法 2016-09-03
  • #include <STC12C2052AD.h>  //声明头文件

  •   

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

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

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

  • /************************************************************************************/

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

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

  • /*-------------------------------------延时函数-------------------------------------*/

  • void delayms (unsigned int a){

  • unsigned int i;

  • while( --a != 0){

  • for(i = 0; i < 600; i++);

  • }

  • }

  • /*----------------------------------蜂鸣器驱动函数----------------------------------*/

  • void beep (void)

  • {   

  • unsigned char i=30;

  • while(i--)

  • {

  • speaker=~speaker;

  • delayms(3);

  •     }

  • }

  • /*----------------------------------数码管驱动函数----------------------------------*/

  • void display (unsigned char hour,min)

  • {

  • unsigned char H1,H2,M1,M2;

  • P3=0xf8; //数码管位选

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

  • delayms (2); //扫描延时

  • P3=0xf4; //数码管位选

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

  • delayms (2); //扫描延时

  • P3=0xf2; //数码管位选

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

  • delayms (2); //扫描延时

  • P3=0xf1; //数码管位选

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

  • delayms (2); //扫描延时

  • /*--------------------------------------分定义--------------------------------------*/

  • M1=min/10;//取分十位

  • min=min%10;//取余  

  • M2=min;//取分个位

  • /*--------------------------------------时定义--------------------------------------*/

  • H1=hour/10;//取时十位

  • hour=hour%10;//取余  

  • H2=hour;//取时个位

  • }

  • /*-----------------------------------按键去抖函数-----------------------------------*/

  • void qudou (unsigned char hour,min)

  • {

  • unsigned char i;

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

  • display (hour,min);

  • }

  • }

  • /*--------------------------------------主函数--------------------------------------*/

  • void main(void)

  • {

  • ////定时器初始设置

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

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

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

  • ET0=1;//开定时器中断

  • EA=1;//开总中断

  • TR0=1;//启动定时器

  • /*************************************************************************************/

  • while(1)

  • {

  • unsigned char hour,min;//定义时分


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


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

  • {

  • time=0;

  • min++;

  •    }

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

  • {

  • min=0;

  • hour++;

  • beep ();

  •     }

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

  • {

  • hour=0;

  • min=0;

  • time=0;

  • }

  • /*-----------------------------------按键判断程序-----------------------------------*/

  • if(key1==0)

  • qudou (hour,min);

  • if (key1==0) {hour++;}


  • if(key2==0)

  • qudou (hour,min);

  • if (key2==0) {min++;}

  • }

  • }

  • /*-----------------------------------中断服务程序-----------------------------------*/

  • void Timer0_Routine(void) interrupt 1

  • {

  • unsigned char a;

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

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

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

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

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

  • time++;//秒加一

  • }

  • }
    • 本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多