本帖最后由 雷影少年 于 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,程序会不会变得更麻烦了? |