i 数字时钟(数码管显示/键盘可调)-嵌入式MCU技术-电子人社区 -

电子人社区

 找回密码
 立即注册
今日 : 0|主题 : 4177|排名 : 314 
打印 上一主题 下一主题

数字时钟(数码管显示/键盘可调)

发表于 2019-1-13 12:30:47 | 94090 只看该作者 回帖奖励 |倒序浏览 |阅读模式

[复制链接]
发表于 2019-1-13 12:30:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电子人社区网讯:   有关的硬件原理图:
  本文引用地址: http://www.21ic.com/app/mcu/201812/783509.htm


  c程序:
  //温馨提示:
  /*程序还没有调试完成,实际电路板调节时间时时-分-秒都会有闪烁现象,其实我是不知道的,why,也求解释
  #include     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  #include   //与_nop_有关
  sbit duan=P2^2;     //定义锁存使能端口 段锁存
  sbit wei=P2^3;     //  位锁存
  sbit key1 = P1^1;
  sbit key2 = P1^2;
  sbit key3 = P1^3;
  sbit key4 = P1^4;
  unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   // 显示段码值0~9
  unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};         //分别对应相应的数码管点亮,即位码
  unsigned char temp[8];                                //存储显示值的全局变量
  char hour; minute; second, num, t, i;
  //函数声明
  void delay(unsigned int t);
  void initial();
  void delay20ms();
  void keyscan();
  void caifen();
  void display();
  /*------------------------------------------------
  主函数
  ------------------------------------------------*/
  void main()
  {
  initial();              //调用初始化程序
  while(1)
  {
  keyscan();              //调用键盘扫描
  caifen();              //调用拆分以时-分-秒的形式
  display();             //调用时间的显示程序
  }
  }
  //初始化程序
  void initial()
  {
  TMOD = 0x01;                //设置T1工作于定时方式1(有16位计数)
  TH0 = (65536 - 2000)/256;         //定时器1赋初值,是TH1而不是TH0噢(若要设置是定时器0的话,把1改为0,下同);计数了2000次,即为2ms
  TL0 = (65536 - 2000)%256;
  EA = 1;                  //开中断
  TR0 = 1;                 //开定时器0
  ET0 = 1;                 //开启定时器中断0
  hour = 23;                //赋初值
  minute = 59;               //赋初值
  second = 57;               //赋初值
  }
  //中断服务程序
  void time0(void) interrupt 1
  {
  TH0 = (65536 - 2000)/256;       //重新赋值
  TL0 = (65536 - 2000)%256;
  num ++;                //中断500次后 即2ms X 500 = 1000MS = 1S,(一般可计数久点如50000ms,中断20次,这样误差就不会太大)
  if (num == 500)
  {
  num = 0;
  second ++;
  if (second == 60)        //秒为60则miao置0,minute加一
  {
  second = 0;
  minute ++;
  if (minute == 60)      //分为60则minute置0,hour加一
  {
  minute = 0;
  hour ++;
  if (hour == 24)   //小时为24则hour置0
  {
  hour = 0;
  }
  }
  }
  }
  }
  //键盘扫描程序,可执行时分的加减
  void keyscan()
  {
  if(key1 == 0)
  {
  delay20ms();          //延时20ms,去抖动
  while(key1 == 0);       //等待(上升沿则执行下一行,TRO = 0)
  TR0 = 0;         //关定时器0
  t ++;          //t++与调节时分秒有关
  }
  switch(t)           //选择调节时分秒有关,与上面的t相关联
  {
  case 1:
  if(key2 == 0)
  {
  delay20ms();
  if(key2 == 0)
  {
  while(key2 == 0);
  hour ++;
  if(hour == 24)
  {
  hour = 0;
  }
  }
  }
  if(key3 == 0)
  {
  delay20ms();
  if(key3 == 0)
  {
  while(key3 == 0);
  hour --;
  if(hour == -1)    //因为hour是char型,所以可以有负数,若是unsigned char则不允许,下面的minute同理
  {
  hour =23;
  }
  }
  }
  break;
  case 2:
  if(key2 == 0)
  {
  delay20ms();
  if(key2 == 0)
  {
  while(key2 == 0);
  minute ++;
  if(minute == 60)
  {
  minute = 0;
  }
  }
  }
  if(key3 == 0)
  {
  delay20ms();

来源:网络转载

 

                                                   转载请注明:电子人社区

0条回复
跳转到指定楼层

发表回复

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

本版积分规则

QQ|电子人物联网  

Copyright 2013 最新最精彩-社区论坛 版权所有 All Rights Reserved.

QQ|电子人物联网  

GMT+8, 2024-5-1 21:22 , Processed in 0.107898 second(s), 33 queries.

快速回复 返回顶部 返回列表