标题:
求教!如何把倒计时60s的程序改成“00:00”用4位led显示的2分钟程序
[打印本页]
作者:
运载最棒
时间:
2015-1-26 10:07
标题:
求教!如何把倒计时60s的程序改成“00:00”用4位led显示的2分钟程序
下面是倒计时60s的程序
求大神改写
#include<reg51.h>
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned char j,k,a1,a0,s=60;
unsigned int m;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(unsigned char sh_c,unsigned char g_c)
{
dula=0;
P0=table[sh_c];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[g_c];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
void main()
{
TMOD=0x01;
TR0=1;
TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;
while(1)
{
if(m==20)
{ m=0;
s--;
}
a0=s%10;
a1=s/10;
display(a1,a0);
if(s==0)
{
TR0=0;//时间到,定时器关闭
beep=0;//蜂鸣器响,报时。
}
}
}
void time0() interrupt 1
{TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
m++;
}
作者:
wind02072107
时间:
2015-1-26 11:33
楼主有点不明白你的意思的,至少使用5位的数码管才能显示出你要的这种形式啊,前两位是分钟,后两位代表秒,是这意思吗?这个程序显示的000:00,你可以自己把高位的0去掉,变成00:00
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit DULA = P2^6; //74H573控制位,控制数码管段码输出
sbit WELA = P2^7; //74H573控制位,控制数码管位码输出
uchar minute = 0;
uchar second = 0;
uchar T0RH = 0;
uchar T0RL = 0;
uint cnt = 0; //秒计数器
uchar LedBuff[6] = {0X00,0X00,0X00,0X00,0X00,0X00}; //数码管显示缓冲区
uchar code LedChar[] = { //数码管显示编码表
0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07, //0~7
0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X09 //8~15 :
};
void ConfigTimer0(uint ms); //定时器0初始化,确定定时时间
void LedShow(uchar minute,uchar second);
void main()
{
EA = 1;
ConfigTimer0(1); //初始化定时器0,定时时间1ms
while(1)
{
if(cnt>=1000)
{
cnt = 0;
second++;
if(second>=60)
{
second = 0;
minute++;
if(minute>=2)
{
minute = 0;
}
}
}
LedShow(minute,second);
}
}
void ConfigTimer0(uint ms)
{
unsigned long temp;
temp = 11059200/12;
temp = temp*ms/1000;
temp = 65536 - temp;
T0RH = (uchar)(temp>>8);
T0RL = (uchar)temp;
TMOD &= 0XF0;
TMOD |= 0X01;
TH0 = T0RH;
TL0 = T0RL;
TR0 = 1;
ET0 = 1;
}
void LedShow(uchar minute,uchar second)
{
uchar buff[6];
uchar i;
buff[0] = second%10;
buff[1] = second/10;
buff[2] = 16;
buff[3] = minute%10;
buff[4] = minute/10;
buff[5] = 0;
for(i=0;i<6;i++)
LedBuff[ i] = LedChar[buff[ i]];
}
void LedScanf()
{
static uchar i = 0;
P0 = 0X00;
DULA = 1;
P0 = LedBuff[ i];
DULA = 0;
P0 = 0XFF;
WELA = 1;
P0 = ~(0X20>>i);
WELA = 0;
i++;
if(i>5)
i = 0;
}
void interrupttimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
LedScanf();
cnt++;
}
作者:
admin
时间:
2015-1-28 15:37
wind02072107 发表于 2015-1-26 11:33
楼主有点不明白你的意思的,至少使用5位的数码管才能显示出你要的这种形式啊,前两位是分钟,后两位代表秒 ...
[ i ]导致了 斜体 现在已经修正了.
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1