看看抽屉的材料,就想做做东西玩玩。本来想做99码表的,结果按键开关不够,就改成了时钟。话不多说,直接上图。
最小系统
最小系统
显示模块
显示模块
最后效果
最后效果
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*********************************************************************************
- *实验名 :数码管动态显示
- *实验效果 :8位数码管显示数字12345678
- *注意 : 每位数码管显示之间延迟时间小于3ms可看见8位数码管同时点亮
- *
- *********************************************************************************/
- #include<reg52.h>
- #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;*/
- }
- }
- …………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
时钟.rar
(992.79 KB, 下载次数: 209)
|