找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机定时器可调时钟

[复制链接]
跳转到指定楼层
楼主
ID:312846 发表于 2018-4-30 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;                   //对数据类型进行声明定义




unsigned int k,s,m,h;//对时分秒进行定义
sbit LSA=P2^2; //定义位锁存引脚
sbit LSB=P2^3; //定义位锁存引脚
sbit LSC=P2^4;  //定义位锁存引脚
sbit k1=P3^1; //定义开关k1控制,默认状态下为高电位,1
sbit k2=P3^0; //定义开关k2控制,默认状态下为高电位,1
sbit k3=P3^2; //定义开关k3控制,默认状态下为高电位,1
sbit beep=P1^5;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//显示0~F的值        ,还有时钟的-

u8 mb[8];//调用段码数组
void  yanshi ();//消隐延时
void delay();//延时消抖
u8 KeyScan(u8 mode);  //调用函数按键控制开关K
void datapros();   //调用函数按键控制时分秒增加
void  delay()//延时消抖
{
unsigned int j        ;
for(j=1;j<1000;j++);
}
void yanshi(u16 i)        //延时10us
{
        while(i--);        
}

u8 KeyScan(u8 mode)//按键按下时位低电平,而默认时为高电平
{
        static u8 keyen=1;
        if(mode==1)
        {
                keyen=1;
        }
        if(keyen==1&&(k1==0||k2==0||k3==0))
        {
                delay();  //消抖处理
                keyen=0;
                if(k1==0)return 1; //按键选择时
                else if(k2==0)return 2; //按键选择 分
                else if(k3==0)return 3;         //按键选择清零秒

        }
        else if(k1==1&&k2==1&&k3==1)
        {
                keyen=1;
        }
        return 0;        
}
void datapros()
{
        u8 key=KeyScan(0);
        switch(key)
        {
                case 1:  h++;if(h==24)h=0; break;//        控制时加
                case 2:  m++;if(m==60)m=0; break; // 控制分加
                case 3:  s=0; break;//秒清零

        }
                }

void Timer0Init()
{
        TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
        TH0=0X3C;        //给定时器赋初值,定时50ms
        TL0=0XB0;
                ET0=1;
                EA=1;        
        TR0=1;//打开定时器                        
}



void DigDisplay()
{
    u8 i;

        for(i=0;i<8;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位       
                }
               
                P0=smgduan[mb[i]];//发送段码
                yanshi(1); //间隔一段时间扫描       
                P0=0x00;//消隐
        }
}
void main()
   {
        Timer0Init();
        while(1)
        {
                datapros();

                if(TF0==1)
                {
                        TF0=0;
                        TH0=0X3C;        //给定时器赋初值,定时50ms
                        TL0=0XB0;
                        k++;
                }
                if(k==20)                 //到达1s时间
                {        
                        k=0;
                        s++;
                 }      
                                 if(s==60)                //到达一分钟
                                   {
                                   s=0 ;
                                        m++        ;
                                   }
                          if(m==60)                                         //到达一小时
                      {m=0;
                          h++;
                      }
                        if(h==24)h=0;
                       
                                       

        mb[0]=s%10;  //秒表个位
        mb[1]=s/10;         //秒表十位
                mb[2]=16;           //-
            mb[3]=m%10;           //分表个位
            mb[4]=m/10;           //分表十位       
            mb[5]=16;           //-
            mb[6]=h%10;           //时表个位
            mb[7]=h/10;           //时表十位
                DigDisplay();//输送段码
                                

        }

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

使用道具 举报

沙发
ID:322150 发表于 2018-5-4 16:09 | 只看该作者
请问有电路图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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