看看抽屉的材料,就想做做东西玩玩。本来想做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;*/
}
}
…………………
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』