本帖最后由 雷影少年 于 2012-7-6 14:13 编辑
我又修改了下程序
源程序如下:- main.c文件
- /*数字时钟程序*/
- #include<reg51.h>
- #include"display.c" //显示子程序
- #include"time.c" //时钟更新子程序
- #define count 3686
- u8 flag_5ms=0;
- void main(void)
- {
- EA =1; //开中断
- ET0 =1;
- TMOD =0x01;
- TH0 =-(count/256);
- TL0 =-(count%256);
- TR0 =1;
- time();
- while (1)
- {
- static u8 flag_1s=0;
- if (flag_5ms)
- {
- flag_5ms=0;
- display(); //每4ms调用一次显示子程序
- if(++flag_1s==250) //每秒更新一次时间
- {
- flag_1s=0;
- time();
- }
- }
- }
- }
- void time50() interrupt 1 //每4ms中断一次
- {
- TH0=-(count/256);
- TL0=-(count%256);
- flag_4ms=1;
- }
- display.c文件
- /*时钟显示子模块*/
- typedef unsigned char u8 ;
- /*初始化数组 时间显示
- 选择数码管位(从左至右)
- 数码管显示缓冲*/
- u8 code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
- u8 code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- u8 seg1[]={0,1,2,3,4,5,6,7};
- /*将当前时间放入缓冲区*/
- void get_clock(u8 sec,min,hour)
- {
- seg1[7] =sec%10;
- seg1[6] =sec/10;
- seg1[5]=10;
- seg1[4] =min%10;
- seg1[3] =min/10;
- seg1[2]=10;
- seg1[1] =hour%10;
- seg1[0] =hour/10;
- }
- /*显示子程序*/
- void display() // 动态显示
- {
- static u8 i=0;
- P0 =0xff;
- P2 =wei;
- P0 =seg[seg1];
- i=(i+1)&0x07;
- // delay(10);
- }
- time.c文件
- /*时间更新模块*/
- static u8 sec =50; //装载时钟秒初始值
- static u8 min =59; //装载分初始值
- static u8 hour =23; //装载时初始值
- void time(void)
- {
- if ( ++sec>=60) //秒更新
- {
- sec=0;
- if (++min>=60) //分更新
- {
- min =0;
- if (++hour>=23) //时更新
- hour =0;
- }
- }
- get_clock(sec,min,hour); //更新缓冲区数据
- }
因为是8位数码管,5ms的中断延时闪烁的很厉害,改成了4ms虽然还是有点闪,但是还能用
关于get_clock函数我没有更改,因为如果调用sprintf函数的话要加头文件stdio.h,程序会不会变得更麻烦了?
|