急求一个用AT89C52控制,2个4位数码管(用74HC595驱动)显示的简易时分秒的电子钟。需要c语言程序。附图

作者&投稿:卞苑 (若有异议请与网页底部的电邮联系)
【急】请问下,如何用一个AT89C52和两个74H595做出一个单片机定时器的电子时钟,利用这个图写出程序~

你好!显示时分秒,然后通过按键调节时间?

主要看你的数码管是共阴还是共阳的,如果是共阳那就好办,595的8个输出连数码管的7段和小数点,然后两个位选直接用8550驱动就行了,程序的思路就是先选通位,然后给595段码,然后延时再选通另外一位再给595段码延时,一直重复这个就行了。

/************************************************/
/*******************数字电子钟*******************/
/************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit qingling=P1^0;     //清零
sbit tiaofen=P1^1;      //调分
sbit tiaoshi=P1^2;      //调时
sbit sounder=P1^7;      //naozhong
sbit ds = P3^5;         // 595
sbit st_cp = P3^7;
sbit sh_cp = P3^4;
uint a,b;
uchar hour,minu,sec,    //时钟
      hour0,minu0,sec0, //秒表
      hour1,minu1,sec1;
      h1,h2,m1,m2,s1,s2,//显示位
      k,s;  //状态转换标志
uchar j,datah,datal;       
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*****************函数声明***********************/
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
void disp595();
/*****************主函数*************************/       
void main()
{
    init();
    while(1)
    {             
    while(TR1)
    {
     
    keyscan();    //扫描函数
    while(s==1)   //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间 
    {             //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响
    keyscan();                    //s状态切换(0-》1-》2-》0)通过外部中断1实现。
    display(hour1,minu1,sec1); //闹钟时刻显示
     }
    display(hour0,minu0,sec0);//时钟表显示           
           
     while(k)      /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。*/
     {
     display(hour,minu,sec);      //秒表显示           
      }
         
    }
  }

}

/*****************初始化函数***********************/
void init()
{
      a=0;
      b=0;
      k=0;
      s=0;
      hour0=0;
      minu0=0;
      sec0=0;
      hour=0;
      minu=0;
      sec=0;
      hour1=0;
      minu1=0;
      sec1=0;

      TMOD=0x11;              //定时器0,1工作于方式1;赋初值
      TH0=(65536-5000)/256;
      TL0=(65536-5000)%256;
      TH1=(65536-50000)/256;
      TL1=(65536-50000)%256;
     
      EA=1;
      EX0=1;       //秒表中断
      EX1=1;       //闹钟设定中断
      ET0=1;
      ET1=1;
      IT0=1;        //边沿触发方式
      IT1=1;

      PX0=1;
      PX1=1;
     
      TR0=0;              //初始,秒表不工作
      TR1=1;        //时钟一开始工作     
}

/*****************定时器0中断*************/
void timer0_int() interrupt 1      //秒表
{
      TH0=(65536-5000)/256;
      TL0=(65536-5000)%256;
      a++;
      if(a==2)
      {
      a=0;
      sec++;
      if(sec==100)
            {
            sec=0;      //毫秒级
            minu++;
            if(minu==60)
            {
                  minu=0;            //秒
                  hour++;
                  if(hour==60)        //分
                  {
                  hour=0;
                  }
            }
            }
      }
     
}

/*************外部中断0中断函数************/
void ex0_int() interrupt 0
{     
      k++;
      if(k==3)
      k=0;
      if(k==1)
      {
      TR0=~TR0;
      if(TR0==1)
      {             
         hour=0;
         minu=0;
         sec=0;     
      }
      }
      if(k==2)
      {
      TR0=~TR0;
      }       
}

/*************外部中断1中断函数************/
void ex1_int() interrupt 2
{
      s++;
      if(s==3)
      s=0;
}

/*************定时器1中断****************/
void timer1_int() interrupt 3       //控制时钟工作
{
      TH1=(65536-50000)/256;
      TL1=(65536-50000)%256;
      if(s==2)
      {
      if(hour1==hour0 && minu0==minu1)
      sounde();
      }
      b++;
      if(b==20)
      {
      b=0;
      sec0++;
         if(sec0==60)
           { 
              sec0=0;
                minu0++;
              if(minu0==60)
               {
                   minu0=0;
                   hour0++;
                   if(hour0==24)
                         hour0=0;
               }
           }
      }
}
/*************键盘扫描****************/
void keyscan()
{
      if(s==1)
      {
      if(qingling==0)
      {
            delay(10);
            if(qingling==0)
            {
            sec1=0;
            minu1=0;
            hour1=0;
            }
      }
      if(tiaofen==0)
      {
            delay(10);
            if(tiaofen==0)
            {
            minu1++;
            if(minu1==60)
            {
                  minu1=0;
            }
            while(!tiaofen);
            }
      }
      if(tiaoshi==0)
      {
            hour1++;
            if(hour1==24)
            {
            hour1=0;
            }
            while(!tiaoshi);
      }
      }
      else              //调整时钟时间
      {
       if(qingling==0)
      {
            delay(10);
            if(qingling==0)
            {
            sec0=0;
            minu0=0;
            hour0=0;
            }
      }
      if(tiaofen==0)
      {
            delay(10);
            if(tiaofen==0)
            {
            minu0++;
            if(minu0==60)
            {
                  minu0=0;
            }
            while(!tiaofen);
           
            }
      }
      if(tiaoshi==0)
      {
            hour0++;
            if(hour0==24)
            {
            hour0=0;
            }
            while(!tiaoshi);
      }
      }     
}
/*************显示函数****************/
void display(uchar hour,uchar minu,uchar sec)
{
      h1=hour/10;
      h2=hour%10;
      m1=minu/10;
      m2=minu%10;
      s1=sec/10;
      s2=sec%10;

      datah=table[h1];
      datal=select[7];
   disp595();
      delay(5);

      datah=table[h2];
      datal=select[6];
   disp595();
      delay(5);

      datah=0x40;
      datal=select[5];
   disp595();
      delay(5);

      datah=table[m1];
      datal=select[4];
   disp595();
      delay(5);

      datah=table[m2];
      datal=select[3];
   disp595();
      delay(5);

      datah=0x40;
      datal=select[2];
   disp595();
      delay(5);

      datah=table[s1];
      datal=select[1];
   disp595();
      delay(5);

      datah=table[s2];
      datal=select[0];
   disp595();
      delay(5);
}
/*************disp595()函数****************/
void disp595()
{
 for(j=0;j<8;j++)
 {
  sh_cp=0;
  datal<<=1;
  ds=CY;
  sh_cp=1;//sh_cp上升沿 移位
 }
 for(j=0;j<8;j++)
 {
  sh_cp=0;
  datah<<=1;
  ds=CY;
  sh_cp=1;//sh_cp上升沿 移位
 }
 st_cp=0;
    st_cp=1;//st_cp上升沿 存储 
}
/*************闹钟函数****************/
void sounde()
{
      sounder=~sounder;     
}
/*************延时函数****************/
void delay(uchar z)
{
      int x,y;
      for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}



貌似可以做定时砸蛋滴哦


AT89c81 用1个按键控制8盏灯,进行花样显示
include "REG52.H"sbit Key = P1^0;void Delay_1ms(unsigned int Cnt){ unsigned int x, y;for(x = Cnt; x > 0; x--) for(y = 110; y > 0; y--);} bit KeyRead(void){ if(!Key) { Delay_1ms(5);if(!Key) { while(!Key);return 0;} } return 1;} void ...

at89 c52单片机各引脚功能
1、XTAL1、XTAL2引脚。这类引脚属于外接时钟引脚。前者为片内震荡电路的输入,后者为片内震荡电路的输出。2、RST引脚。这类引脚属于复位引脚,连续输入两个机器周期以上高电平就可以触发机制,完成单片机的复位初始化的工作,单片机就可以从头开始执行程序了。3、PSEN引脚。这类引脚的全称是程序存储器允许...

at89c58rd技术指标是什么
at89c58rd技术指标是什么  我来答 分享 微信扫一扫 网络繁忙请稍后重试 新浪微博 QQ空间 举报 浏览1 次 可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。 技术指标 at89c58rd 搜索资料 本地图片 图片链接 提交回答 匿名 回答自动保存中 你的回答被采纳后将获得: ...

求89C51单片机与PC链接并运行的步骤。(从keil编写程序(C语言)到单片...
1、对于atmel公司的AT89C51需要用专门的编程器才能下载,AT89S51\/2可以自己做个下载线,只用一个74LS373锁存器既可,若需要,在给你说,相对麻烦些。再说AT89单片机几乎停产了吧 2、宏晶科技的STC单片机现在用的比较多,价格便宜,你可以到它官方网站看下,有些地方或许我说的不是很完整。STC89c单片机用...

编程:用AT8951C单片机的P2.0控制一个LED,要求使其闪烁,变化间隔时间...
sbit P2_0=P2^0;sbit b=0;char a=1;while(a) \/\/ 通过中断例程来改变 a 的值,从而可退出下面这个死循环 { P2_0=b;delay();b=!b;}

AT89C57单片微型计算机体积多大?
这里的单片的微型计算机的体积应该是35厘米左右。

at89c51和at89c52有什么区别啊?
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C52简介:AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 ...

求救!!AT89C32 性质
AT89C1051 1K Flash 64 RAM 1 AT89C2051 2K Flash 128 RAM 2 AT89C51 4K Flash 128 RAM 2 AT89C32 8K Flash 256 RAM 3 AT89C55 20K Flash 256 RAM 3 AT89S8252 8K Flash 256 RAM 2K EEPROM 3 AT89S53 12K Flash 256 RAM 3 由於AT89C51\/52\/55是一般较为通用的MCU,我们就把它与8051...

AT89C52单片机控制发光二极管的亮灭的C程序编程如何写?
这种最基本的程序随便拿本书或网上一搜都是啊 include <AT89X51.H> sbit K1=P3^0;sbit L1=P1^0;void main(void){ while(1){ if(K1==0) \/\/开关闭合 { L1=0;\/\/灯亮 ---p1.0输出低电平 ,L1有电势差。} else { L1=1;\/\/灯灭 } } } ...

银行一米线的c程序 芯片AT89C52,语音模块接单片机的P34,P35端口,激光...
\/\/如果先检测到外面的接口信号,延时一段时间后,检测到里面的接口信号,说明有人走进来,启动语音“某某银行竭诚为你服务”\/\/当有人还在里面的时候,后续的人进来,提示“请退到一米线外”include<AT89X52.H> \/\/端口定义--- sbit WELCOME =P3^4;sbit BYE =P3^5;sbit INSIDE =P2^4...

惠水县13648213256: 求一个at89c52单片机的程序,用两个按键控制数码管,先按一个,放开,再按一个,数码管加1 -
其净甘乐: 你好!也就是两个按键配合使用,第一个不按,第二个不起作用

惠水县13648213256: 如何使AT89C52单片机的两个定时器同时工作 -
其净甘乐: 统一设定TMOD寄存器,如TMOD=0X11,其余中断允许 启动 定时器初值都可以独立控制 如果两个都 用中断的话,注意让其中时间错开,或设定不同的优先级 如果两个定时器定时时间都 很短的话,很可能会冲突,但ms级定时一般没问题

惠水县13648213256: 求AT89C52设计的流水灯程序.P0口控制8个led,间隔一秒,循环点亮,用到定时器的方法做 急求!在线等! -
其净甘乐: 方法:将定时器中断时间设置为一秒一次.声明一个全局的变量temp 在初始化的时候赋初值,在中断服务函数中,添加 temp=_cror_(temp,1); 在主程序while(1){ P0 = temp;}

惠水县13648213256: AT89C52的中断 -
其净甘乐: AT89C52 共有6 个中断向量:两个外中断(INT0 和INT1),3 个定时器中断(定时器0、1、2)和串行口中断.所有 这些中断源如图9 所示. 这些中断源可通过分别设置专用寄存器IE 的置位或清0 来控制每一个中断的允许或禁止.IE 也有一个总...

惠水县13648213256: 用AT89C52 通过3个独立按键控制16路LED灯的轮流点亮、逐个点亮、间隔点亮的C语言程序 -
其净甘乐: 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用>5(假设字长为8位),则得到的是 11111101 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样...

惠水县13648213256: 求适合AT89C52的按键复位电路,最好能再解释一下为什么用这么大的电阻和电容,谢谢!! -
其净甘乐: 这个要看你用的晶振是多少的,一般22微法和1K的电阻组成的,需要持续输入两个机器周期以上的高电平后系统强制复位,属于最高级的复位

惠水县13648213256: 编写一个AT89C52单片机控制四相单四拍步进电机汇编程序,急用、谢谢了
其净甘乐: 最急的外理方式,上网去找一差不多步进机的程序的,你自己再改一下加上你那键盘所需的功能,,因这类网上多的是,不定你用的开发实验箱中就有配套的.因你这中的小功率是多大没说清,一般小的用2003驱动就行,现成成品多的是,后二个显示中速度没问题,这转角可要求没说清的,是单控制次还是全部.再用一热敏(哈,做实验最省事的拆一电饭锅上的,哈哈哈)器件,就OK呢.看你是学生吧?还是全自己动做一遍的好.

惠水县13648213256: 想用AT89C52单片机控制D/A输出、要求DA输出0—5V的电压、电压的变化梯度为每0.5V \2S谁能帮忙编一个程序 -
其净甘乐: 89C52没有DA输出,可以用PWM加电路实现电压平滑输出

惠水县13648213256: 毕设求助:求C语音大神给弄个程序,AT89C52单片机控制直流电动机正反转的调速系统, -
其净甘乐: 给你个程序参考一下/*******************************************************************/ /* 程序名:PWM直流电机调速 */ /* 晶振:11.00592 MHz CPU型号:AT89C51 */ /* 直流电机的PWM波控制,可以直接的调速从0到20级的调速 *//********************...

惠水县13648213256: 两个AT89C52相连,一个发送,一个接收,用LCD显示,怎么用C语言编程? -
其净甘乐: 图中,两根串口线,应该要交叉才行.几个模块程序,我的博客上都有,您可以去参考.看懂了,拼起来,就可以用了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网