|
昨天写了一个0-9999的累加程序,受到不少网友的帮助,在此先说声谢谢,
今天写了一个用定时器实现分钟,秒钟的程序,
先上原理图
4位数码管的位控制和段接口如下,
uchar code table[]={}
这条语句内的16进制数转换成二进制就是下图这样的
1就表示二极管不亮,0就表示亮
8个二极管的亮与不亮就成了数字,
效果图
以下为代码,在昨天代码基础上修改来的
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit a = P1^0; //个位
sbit b = P1^1; //十位
sbit c = P1^2; //百位
sbit d = P1^3; //千位
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f}; //最后一个是小数点
uint time=0; // 秒
uint fen=0; // 分
uint xms;
uchar dingshi=0; //定时次数
void display(time);
void delay(xms);
void main ()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display(time);
}
}
void display(time)
{
P0=table[time%10];
a=0;
delay(5);
a=1;
P0=table[time/10%10];
b=0;
delay(5);
b=1;
P0=table[fen%10];
c=0;
delay(5);
c=1;
P0=table[fen/10%10];
d=0;
delay(5);
d=1;
P0=table[10]; //显示一个点,
d=0;
delay(5);
d=1;
}
void delay(xms)
{
uchar i;
while(xms--)
{
for(i=0;i<113;i++);
}
}
void jishu ()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
if(dingshi==20) //如果定时了20次,也就是1秒钟就执行括号内程序
{
dingshi=0;
time++; //秒加1
if(time==60)
{
time=0;
fen++; //秒加了60分加1
if(fen==60)
{
fen=0;
}
}
}
dingshi++;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|