在清翔51单片机上实现闹钟以及24h显示程序

在清翔51单片机上实现闹钟以及24h显示程序

此程序过长时间运作可能会造成一定的误差

#include<reg52.h>

#define uchar unsigned char
/*sbit*/
sbit dula = P2^6;
sbit wela = P2^7;
sbit beep = P2^3;
/*声明变量*/
uchar count1,Second=40,Minute=2,Hour=21;
uchar code SMGwei[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code SMGduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*声明函数*/
void time0init();        //定时器0 50ms
void time1init();       //定时器1  1ms
void display(uchar,uchar,uchar);    //数码管显示
void naozhong(uchar,uchar,uchar);

void main()
{
    time0init();/*time0和time1初始化*/
    time1init();
    while(1);   //等待中断
}
void time0init()//50ms        //定时器0初始化,开启中断
{
    TR0 = 1;
    TMOD |= 0x01;
    TH0 = 0x4c;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
}
void time1init()//1ms        //定时器1初始化,开启中断
{
    TR1 = 1;
    TMOD |= 0X10;
    TH1 = 0x0FC;
    TL1 = 0x66;           
    EA = 1;
    ET1 = 1;
}
void display(uchar num,uchar Minute,uchar Hour)
{
    static uchar wei;			//局部静态变量
    P0 = 0xff;
    wela = 1;
    P0 = SMGwei[wei];
    wela = 0;
    switch(wei)
    {
        case 0: dula = 1; P0 = SMGduan[Hour/10];    dula =0; break;     /*小时*/
        case 1: dula = 1; P0 = SMGduan[Hour%10];    dula =0; break;
        case 2: dula = 1; P0 = 0x40;                dula =0; break;
        case 3: dula = 1; P0 = SMGduan[Minute/10];  dula =0; break;
        case 4: dula = 1; P0 = SMGduan[Minute%10];  dula =0; break;     /*分钟*/
        case 5: dula = 1; P0 = 0x40;                dula =0; break;
        case 6: dula = 1; P0 = SMGduan[num/10];     dula =0; break;     /*秒*/
        case 7: dula = 1; P0 = SMGduan[num%10];     dula =0; break;
    }
    wei++;
    if(wei ==8)
    {
        wei = 0;
    }
}
void time1() interrupt 3
{
	TF1 = 0;
	TH1 = 0x0FC;
    TL1 = 0x66;
    display(Second,Minute,Hour);
    naozhong(Second,Minute,Hour);
}
void time0() interrupt 1
{
    TF0 = 0;
    TH0 = 0x4c;
    TL0 = 0x00;
    count1++;
    if(count1 == 20)
    {
        count1 = 0;
        Second++;
            P1 = ~P1;
            if(Second == 60)
            {
                Second = 0;
                Minute++;
                if(Minute == 60)
                {
                    Minute = 0;
                    Hour++;
                    if(Hour == 24)
                    {
                        Hour = 0;
                    }
                }
            }
    }
}
void naozhong(uchar Second,uchar Minute,uchar Hour)//可以在此设置闹钟
{
    if(Hour == 21 &&(Minute<=4 && Minute>=3))
    {
        beep = 0;				//闹钟开启
    }
}
  1. 为什么定时器1设定的中断时间是1ms?

一开始设置的是5ms扫描数码管显示以及闹钟,但发现5ms会导致8个数码管显示时会导致数码管显示问题,实际上1ms也会导致一点拖影,但人眼基本分辨不出

码主为一个初学者,刚学习到C语言的迭代就开始搞单片机,代码可能写的有点拖沓,见谅!

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值