找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1067|回复: 0
打印 上一主题 下一主题
收起左侧

独立式键盘调时的数码时钟实验

[复制链接]
跳转到指定楼层
楼主
独立式键盘调时的数码时钟实验仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //实例75:独立式键盘调时的数码时钟实验
  2. #include<reg51.h>    //  包含51单片机寄存器定义的头文件
  3. unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //数字0~9的段码
  4. unsigned char int_time ; //中断次数计数变量
  5. unsigned char second;    //秒计数变量
  6. unsigned char minute;    //分钟计数变量
  7. unsigned char hour;     //小时计数变量

  8. sbit S1=P1^4;          //将S1位定义为P1.4
  9. sbit S2=P1^5;          //将S2位定义为P1.5
  10. sbit S3=P1^6;          //将S3位定义为P1.6
  11. sbit S4=P1^7;          //将S4位定义为P1.7

  12. /******************************************************************
  13. 函数功能:数码管扫描延时
  14. ********************************************************************/
  15. void delay(void)     
  16. {
  17.    unsigned char j;
  18.         for(j=0;j<200;j++)
  19.          ;
  20.   }
  21. /******************************************************************
  22. 函数功能:键盘扫描延时
  23. ********************************************************************/
  24.   void delay60ms(void)
  25.   {
  26.     unsigned char i,j;
  27.          for(i=0;i<200;i++)
  28.          for(j=0;j<100;j++)
  29.            ;
  30.   }

  31. /******************************************************************
  32. 函数功能:显示秒
  33. 入口参数:s
  34. ********************************************************************/
  35. void DisplaySecond(unsigned char s)
  36. {
  37.    P2=0xbf;        //P2.6引脚输出低电平, DS6点亮
  38.    P0=Tab[s/10];          //显示十位
  39.    delay();

  40.    P2=0x7f;       //P2.7引脚输出低电平, DS7点亮
  41.    P0=Tab[s%10];         //显示个位
  42.         delay();
  43.         P2=0xff;     //关闭所有数码管
  44.    
  45. }

  46. /******************************************************************
  47. 函数功能:显示分钟
  48. 入口参数:m
  49. ********************************************************************/
  50. void DisplayMinute(unsigned char m)
  51. {
  52.      P2=0xf7;   // P2.3引脚输出低电平, DS3点亮
  53.      P0=Tab[m/10];//显示个位
  54.           delay();
  55.           P2=0xef;   // P2.4引脚输出低电平, DS4点亮
  56.           P0=Tab[m%10];
  57.           delay();
  58.           P2=0xdf;   //P2.5引脚输出低电平, DS5点亮
  59.           P0=0xbf;   //分隔符“-”的段码
  60.           delay();
  61.           P2=0xff;   //关闭所有数码管
  62. }
  63. /******************************************************************
  64. 函数功能:显示小时的子程序
  65. 入口参数:h
  66. ********************************************************************/
  67. void DisplayHour(unsigned char h)
  68. {
  69.    
  70.    P2=0xfe;        //P2.0引脚输出低电平, DS0点亮
  71.    P0=Tab[h/10];          //显示十位
  72.    delay();

  73.    P2=0xfd;       //P2.1引脚输出低电平, DS1点亮
  74.    P0=Tab[h%10];    //显示个位
  75.         delay();   
  76.         P2=0xfb;     //P2.2引脚输出低电平, DS2点亮
  77.         P0=0xbf;     //分隔符“-”的段码
  78.         delay();
  79.    P2=0xff;     //关闭所有数码管
  80.    
  81. }
  82. /******************************************************************
  83. 函数功能:键盘扫描
  84. ********************************************************************/
  85. void key_scan(void)
  86. {
  87.      P1=0xf0;   //将P1口高4位置高电平“1”
  88.           if((P1&0xf0)!=0xf0)         //有键按下
  89.            {
  90.                      delay60ms();         //延时60ms再检测
  91.                              if((P1&0xf0)!=0xf0)         //确实有键按下
  92.                              {
  93.                                   if(S1==0)      //如果是S1键按下
  94.                                      second++;   //秒加1
  95.                                            if(S2==0)      //如果是S2键按下
  96.                                    minute++;    //分钟加1
  97.                                                  if(S3==0)     //如果是S3键按下
  98.                                    hour++;      //小时加1
  99.                                                  if(S4==0)     //如果是S4键按下
  100.                                    {
  101.                                                     second=0;   //秒清0
  102.                                                     minute=0;   //分钟清0
  103.                                                     hour=0;     //小时清0
  104.                                                   }
  105.               }
  106.            }
  107. }

  108. /******************************************************************
  109. 函数功能:主函数
  110. ********************************************************************/

  111. void main(void)
  112.    {
  113.                    
  114.                         TMOD=0x01;             //使用定时器T0               
  115.                         EA=1;                  //开中断总允许
  116.                         ET0=1;                 //允许T0中断
  117.                         TH0=(65536-46083)/256;  //定时器高八位赋初值
  118.                         TL0=(65536-46083)%256;  //定时器低八位赋初值
  119.                         TR0=1;                 //启动定时器T0
  120.                         int_time=0;    //中断计数变量初始化
  121.                         second=0;      //秒计数变量初始化
  122.                         minute=0;     //分钟计数变量初始化
  123.                         hour=0;       //小时计数变量初始化
  124.         
  125.          while(1)
  126.                         {             
  127.                                           DisplaySecond(second);    //调用秒显示子程序
  128.                                     DisplayMinute(minute);   //调用分钟显示子程序
  129.                                          DisplayHour(hour);       //调用小时显示子程序
  130.                                                                                               
  131.                    }
  132.   }

  133. /******************************************************************
  134. 函数功能:定时器T0的中断服务子程序
  135. ********************************************************************/
  136.   void interserve(void ) interrupt 1 using 1  //using Time0
  137.   {
  138.      TR0=0;                 //关闭定时器T0
  139.      int_time++;           //中断次数加1
  140.                  if(int_time==20)    //如果中断次数满20
  141.                    {
  142.               int_time=0;    //中断计数变量清0
  143.                         second++;      //秒计数变量加1
  144.                         }
  145.                  if(second==60)      //如果秒计满60
  146.                     {
  147.                                  second=0;    //如果秒计满60,将秒计数变量清0
  148.                                  minute++;    //分钟计数变量加1
  149.                          }
  150.                  if(minute==60)    //如果分钟计满60
  151.                    {
  152.                            minute=0;    //如果分钟计满60,将分钟计数变量清0
  153.                            hour++;      //小时计数变量加1
  154.                    }
  155.                  if(hour==24)     //如果小时计满24
  156.                    {
  157.                         hour=0;              //如果小时计满24,将小时计数变量清0
  158.                }
  159.       key_scan();               //执行键盘扫描
  160.       TH0=(65536-46083)/256;    //定时器T0高四位赋值
  161.                 TL0=(65536-46083)%256;    //定时器T0低四位赋值
  162.       TR0=1;                   //启动定时器T0
  163.                
  164.   }  
复制代码

所有资料51hei提供下载:
独立式键盘调时的数码时钟实验.zip (34.09 KB, 下载次数: 10)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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