简单做的基于51单片机的数码管时钟
2019-12-11 来源:51hei
看看抽屉的材料,就想做做东西玩玩。本来想做99码表的,结果按键开关不够,就改成了时钟。话不多说,直接上图。
最小系统
显示模块
最后效果
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
/*********************************************************************************
*实验名 :数码管动态显示
*实验效果 :8位数码管显示数字12345678
*注意 : 每位数码管显示之间延迟时间小于3ms可看见8位数码管同时点亮
*
*********************************************************************************/
#include #define uchar unsigned char #define uint unsigned int uint k=0; uint second=0;//秒 uint min =0;//分 uint hour=1;//时 sbit we1=P3^3; //位选 sbit we2=P3^1; sbit we3=P3^2; sbit we4=P3^0; sbit L0=P2^0; uchar code sz[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00}; //0-9&A-F&“不显示” 字型码 void delay(uint xms) //xms等于几就延迟几毫秒 { uint i,j; for(i=xms;i>0;i--) for(j=112;j>0;j--); } void Init_timer0(void) { TMOD |= 0X01; //工作方式1 内部寄存器控制的定时功能 TH0=0X3c; //高八位的初值 TL0=0Xb0; //第八位初值 EA=1; //开启整体中断允许 ET0=1; //开启定时器0中断允许 TR0=1; //开始计数 } void Timer0_isr(void)interrupt 1 { TH0=0x3c; TL0=0xb0; k++; } void main() { Init_timer0(); while(1) { if(k==20) //20次1秒 { second++; k=0; if(second==60) { second =0; min++; if(min==60) { min=0; hour++; if(hour==13) { hour=1; } } } } P1=sz[min%10]; //分显示 we4 =0; delay(5); we4=1; P1=sz[min/10]; we3=0; delay(5); we3=1; P1=sz[hour%10]; //时显示 we2=0; delay(5); we2=1; P1=sz[hour/10]; we1=0; delay(5); we1=1; /*P1=sz[0]; //显示0 we1=0; delay(10); we1=1; P1=sz[1]; //显示1 we2=0; delay(10); we2=1; P1=sz[2]; //显示2 we3=0; delay(10); we3=1; P1=sz[3]; //显示3 we4=0; delay(10); we4=1;*/ } } …………………