栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【51单片机】通过定时器中断 在8位数码管显示时钟

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【51单片机】通过定时器中断 在8位数码管显示时钟

实验内容:

利用所学的单片机知识及电路知识编程实现显示时钟,选中 8 位数码管,编程实现 8 位数码管示时钟,显示格式为 XX(小时) —XX(分钟)—XX(秒)。

实验步骤:根据实验室二数码管的电路原理图编写 C 程序,调试并烧写入单片机;

数码管电路如下:

效果如下:

​​​​​​​​​​​​​​​​​​​​​

代码如下:

#include 
#include 
typedef unsigned char uchar;
//共阴段码(0-9)
uchar code leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F};
uchar hour=0,minute=0,second=0;//全局变量时分秒
uchar count=0;
//定时器初始化
void Timer0Init()		//50毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0xB0;		    //设置定时初值
	TH0 = 0x3C;		    //设置定时初值
	TF0 = 0;		    //清除TF0标志
	TR0 = 1;		    //定时器0开始计时
    ET0=1;              //打开小开关
	EA=1;               //打开总开关   
}
//延时函数
void delay(unsigned int ms){ 
	while(ms--){
		unsigned char i, j;

		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void display(uchar hour,uchar minute,uchar second){
    int i;
    for(i=1;i<=8;i++){
        switch(i){
           case 1: P2_4=0;P2_3=0;P2_2=0;P0=leddata[second%10];break;
           case 2: P2_4=0;P2_3=0;P2_2=1;P0=leddata[second/10];break;
           case 3: P2_4=0;P2_3=1;P2_2=0;P0=0x40;break;//显示  —
           case 4: P2_4=0;P2_3=1;P2_2=1;P0=leddata[minute%10];break;
           case 5: P2_4=1;P2_3=0;P2_2=0;P0=leddata[minute/10];break;
           case 6: P2_4=1;P2_3=0;P2_2=1;P0=0x40;break;//显示  —
           case 7: P2_4=1;P2_3=1;P2_2=0;P0=leddata[hour%10];break;
           case 8: P2_4=1;P2_3=1;P2_2=1;P0=leddata[hour/10];break;
        }
        delay(1);
        P0=0;        //消影
    }
}
//定时器中断函数
void interrupt_T0()interrupt 1
{
    TL0 = 0xB0;		//重新设置定时初值
	TH0 = 0x3C;		//重新设置定时初值
    count++;
    if(count==20){//一秒时间到了~
        count=0;     
        second++;
        if(second==60){
            second=0;
            minute++;
            if(minute==60){
                minute=0;
                hour++;
                if(hour==24)
                    hour=0;               
           }
        }
    }
}
void main(){
    Timer0Init();//定时器T0初始化
    while(1){
        display(hour,minute,second); //显示时间
    } 
}

时间的计数有些微小误差,计数的时间久了  就会有很大的误差
水平有限~~

​​​​​​​​​​​​​​

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923306.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号