在清翔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
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是清翔51单片机按键控制毫秒表显示在数码管上的示例代码: ```c #include <reg51.h> sbit LED = P1^0; //定义LED灯连接的IO口 sbit KEY = P3^4; //定义按键连接的IO口 sbit D1 = P2^0; //定义第1个数码管连接的IO口 sbit D2 = P2^1; //定义第2个数码管连接的IO口 sbit D3 = P2^2; //定义第3个数码管连接的IO口 sbit D4 = P2^3; //定义第4个数码管连接的IO口 unsigned int Timer0H, Timer0L; //定时器0初值 unsigned int Count; //计数器 unsigned int Second, Minute, Hour, Millisecond; //时间变量 void Timer0Init() //定时器0初始化函数 { TMOD &= 0xF0; //清空低四位 TMOD |= 0x01; //设置为模式1,16位定时器模式 TH0 = Timer0H; //设置高8位初值 TL0 = Timer0L; //设置低8位初值 ET0 = 1; //允许定时器0中断 TR0 = 1; //启动定时器0 } void Display(unsigned int num) //数码管显示函数 { D1 = num % 10; //个位 num /= 10; D2 = num % 10; //十位 num /= 10; D3 = num % 10; //百位 num /= 10; D4 = num % 10; //千位 } void main() { LED = 0; //初始化LED灯状态 KEY = 1; //初始化按键状态 Timer0H = 0xFF; //设置计时初值 Timer0L = 0xFF; Count = 0; //初始化计数器 Second = 0; //初始化时间变量 Minute = 0; Hour = 0; Millisecond = 0; Timer0Init(); //定时器0初始化 EA = 1; //开启总中断 while(1) //主程序循环 { if(KEY == 0) //如果按键被按下 { Delay(10); //延时去抖动 if(KEY == 0) //如果按键仍然被按下 { Second = 0; //时间清零 Minute = 0; Hour = 0; Millisecond = 0; Display(0); //数码管清零 } while(!KEY); //等待按键松开 } Display(Millisecond); //数码管显示毫秒 } } void Timer0() interrupt 1 //定时器0中断函数 { TH0 = Timer0H; //重新设置高8位初值 TL0 = Timer0L; //重新设置低8位初值 Count++; //计数器加1 if(Count >= 10) //如果计数器达到10 { Count = 0; //计数器清零 Millisecond++; //毫秒加1 if(Millisecond >= 1000) //如果毫秒达到1000 { Millisecond = 0; //毫秒清零 Second++; //秒加1 if(Second >= 60) //如果秒达到60 { Second = 0; //秒清零 Minute++; //分加1 if(Minute >= 60) //如果分达到60 { Minute = 0; //分清零 Hour++; //时加1 if(Hour >= 24) //如果时达到24 { Hour = 0; //时清零 } } } } } } ``` 该代码在基础的毫秒表代码基础上,增加了数码管的显示功能。在主程序中,我们通过按键来清零时间变量和数码管显示,同时在数码管中显示毫秒。在定时器0中断函数中,我们每计数到10次(即100毫秒)就更新一次时间变量,并通过Display()函数在数码管中显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值