数字时钟(8位数码管显示+时分校准)

目录

概要

一.设计框架流程

         二.具体操作

    1.仿真图绘制

    2.keil5软件编程

    3.导出HEX文件

    4.将HEX文件导入单片机中

    5.运行


概要

使用51单片机设计一个数字时钟,显示格式的如图所示:实验要求显示学号一段时间后然后再开始显示时钟,同时具备时分校准功能”

一.设计框架流程

1.先在proteus仿真软件把电路搭建好.

2.然后在KIEL5编程软件中编写时钟代码.

3.最后生成HEX文件将其导入proteus软件中的单片机中进行测试.

二.具体操作

    1.仿真图绘制

(器件名称参考:)

74HC573芯片在此作用是提高I/O口的的驱动能力,输入和输出都是一样的。

74LS138芯片是一款三八译码器,简单理解就是三个输入端控制8个输出端,在此电路中起到的作用是节省I/O口:

74LS138真值表:

    2.keil5软件编程

代码参考:

#include <reg52.h>//头文件
#define uchar unsigned char
#define uint unsigned int
uchar code seg[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x7c};//段选数据(0-9,熄灭,—,b)
uchar code dis[]={0,1,2,3,4,5,6,7};//位选(8位数码管)
char hour=0,min=0,second=0,con=0;//时,分,秒,中断计数
sbit key1=P3^0;//定义管脚
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;//定义管脚
void delayms(uint ms)//ms延时函数
{
  uchar i;
	while(ms--)
	for(i=0;i<123;i++);
}

void ID_stu()//显示学号410B000函数
{
	uchar i=200;
	while(i--)
  {
		  P0=seg[4];//数码管第一位显示“4”
			 P2=dis[0];
			 delayms(2);
			P0=seg[10];//消影
			
			P0=seg[1];//数码管第二位显示“1”
			 P2=dis[1];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[0];//数码管第三位显示“0”
			 P2=dis[2];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[12];//数码管第四位显示“b”
			 P2=dis[3];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[0];//数码管第五位显示“0”
			 P2=dis[4];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[0];//数码管第六位显示“0”
			 P2=dis[5];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[0];//数码管第七位显示“0”
			 P2=dis[6];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[0];//数码管第八位显示“0”
			 P2=dis[7];
			 delayms(2);
			P0=seg[10];
		}

}

void KEY_can()//按键处理函数
{
  if(key1==0||key2==0||key3==0||key4==0)
		 {
		   delayms(20);
			 if(key1==0||key2==0||key3==0||key4==0)
			 { 
				  
			    if(key1==0)//时+1
					{						
					   hour++;
						if(hour>23)
							hour=0;
						while(key1==0);					
					}
					else if(key2==0)	//时-1					
					{							
					   hour--;
						if(hour<0)
							hour=23;
						while(key2==0);					
					}					
					else if(key3==0)	//分+1					
					{
					   min++;
						if(min>59)
							min=0;
						while(key3==0);					
					}
					else if(key4==0)		//分-1				
					{							
					   min--;
						if(min<0)
							min=59;
					  while(key4==0);
					}
		 	
			 }		
	 
		 }

}
void Clock()//时钟显示函数
{
	   P0=seg[hour/10];//数码管第一位显示“时高位”
			 P2=dis[0];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[hour%10];//数码管第二位显示“时低位”
			 P2=dis[1];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[11];//数码管第三位显示“-”
			 P2=dis[2];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[min/10];//数码管第四位显示“分高位”
			 P2=dis[3];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[min%10];//数码管第五位显示“分低位”
			 P2=dis[4];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[11];//数码管第六位显示“-”
			 P2=dis[5];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[second/10];//数码管第七位显示“秒高位”
			 P2=dis[6];
			 delayms(2);
			P0=seg[10];
			
			P0=seg[second%10];//数码管第八位显示“秒高位”
			 P2=dis[7];
			 delayms(2);
			P0=seg[10];
			
}

void T0_init()//T0定时器初始化”
{
  TMOD=0x01;//设置定时器计数方式1
	TH0=(65536-50000)/256;//12Mhz晶振       机器周期=12*(1/foc)
	TL0=(65536-50000)%256;
	TR0=1;//开启定时器
	ET0=0;//中断允许位开启
	EA=1;//开启总中断允许位
}
void main ()
{
	uchar i;
	T0_init();
	ID_stu();
	delayms(2000);
	ET0=1;
	while(1)
	{ 
	 KEY_can();
	 Clock();			
	}
		
}

void T0_ET0()interrupt 1//T0定时器中断服务函数
{
  TH0=(65536-50000)/256;//赋初值
	TL0=(65536-50000)%256;
	
	if(++con==20)//1s
	{
		con=0;
		if(++second==60)//1min
		{
			  second=0;
				if(++min==60)//1hour
				{		min=0;
						if(++hour==24)//1day
							hour=0;
				}		
		}
		
	}
	
	

}




      3.导出HEX文件

      4.将HEX文件导入单片机中

     5.运行

  • 16
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是用51单片机连接共阴极8位数码管显示数字时钟的基本代码,仅供参考: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = { // 共阴极8位数码管显示0~9的码值 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; uchar hour = 0; // 小时数 uchar minute = 0; // 分钟数 uchar second = 0; // 秒数 void delay(uint t) { // 延时函数 uint i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } void display(uchar *p) { // 数码管显示函数 uchar i; for (i = 0; i < 8; i++) { // 8位数码管循环显示 P2 = 0xff; // 关闭数码管 P0 = p[i]; // 设置要显示的数字 P2 = ~(1 << i); // 打开对应的数码管 delay(1); // 延时1ms } } void main() { TMOD = 0x01; // 定时器0工作方式1,16位计数器模式 TH0 = 0x4c; // 定时器初值,1ms定时 TL0 = 0x00; EA = 1; // 开启总中断 ET0 = 1; // 开启定时器0中断 TR0 = 1; // 开启定时器0 while (1) { // 主循环 uchar p[8]; p[0] = table[hour / 10]; // 显示小时的十位数字 p[1] = table[hour % 10]; // 显示小时的个位数字 p[2] = 0x40; // 显示冒号 p[3] = table[minute / 10]; // 显示分钟的十位数字 p[4] = table[minute % 10]; // 显示分钟的个位数字 p[5] = 0x40; // 显示冒号 p[6] = table[second / 10]; // 显示秒的十位数字 p[7] = table[second % 10]; // 显示秒的个位数字 display(p); // 数码管显示 } } void timer0() interrupt 1 { // 定时器0中断服务函数 TH0 = 0x4c; TL0 = 0x00; second++; // 秒数加1 if (second == 60) { // 如果秒数达到60 second = 0; // 秒数清零 minute++; // 分钟数加1 if (minute == 60) { // 如果分钟数达到60 minute = 0; // 分钟数清零 hour++; // 小时数加1 if (hour == 24) // 如果小时数达到24 hour = 0; // 小时数清零 } } } ``` 注意:以上代码仅供参考,具体实现方式可能因人而异。同时,为了保证代码的正确性和可靠性,建议在写代码时仔细思考和测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郑TE_Lab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值