想求一个AT89C51单片机6位LED的数字秒表程序,有四个按键,一个启动 暂停 清楚 。急求

如题所述

第1个回答  2017-04-11
#include<reg51.h>
#include<INTRINS.h>
#define u16 unsigned int
#define u8 unsigned char

sbit k1=P1^4;
sbit k2=P1^5;
sbit k3=P1^6;
sbit k4=P1^7;

u8 ds[6]; //数码管显示缓存
#define YY 1

#if YY==0
//共阳
code u8 w[]={0x04,0x08,0x10,0x20,0x40,0x80,}; //位码
code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00,
0x40,};//断码
void dispaly(){//显示函数
static u8 a;
if(++a>=6)a=0;
P3=0x00;
P2=d[ds[a]];
P3=w[a];
}
#else 
//共阴
code u8 w[]={~0x04,~0x08,~0x10,~0x20,~0x40,~0x80,}; //位码
code u8 d[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0x00,
~0x40,};//断码
void dispaly(){//显示函数
static u8 a;
if(++a>=6)a=0;
P3=0xff;
P2=d[ds[a]];
P3=w[a];
}
#endif



void init() //初始化函数
{   TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
    ET0=1;
}

u16 js_ms;//毫秒
u8 js[3];//秒,分,时
u8 zt;//状态,0运行,1暂停
u8 code js_max[]={60,60,24};//秒分时进1值
void key(){
static u8 a;
if((k1&k2&k3&k4)==0){//有按键按下
if(a<10)a++;
if(a==5){//消抖
if(!k1){//k1,启动
zt=0;
}
if(!k2){//暂停
zt=1;
}
if(!k3){//清零
js[0]=0;js[1]=0;js[2]=0;
}
if(!k4){

}
}
}else a=0;
}


void main()//主函数
{
init();
TR0=1;
while(1){
ds[0]=js[2]/10;
ds[1]=js[2]%10;
ds[2]=js[1]/10;
ds[3]=js[1]%10;
ds[4]=js[0]/10;
ds[5]=js[0]%10;
key();
}

}



void timer0() interrupt 1//1ms定时器
{   
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
dispaly();
if(zt==0)js_ms++;
if(js_ms>=1000){
js_ms=0;
if(++js[0]>=60){
js[0]=0;
if(++js[1]>=60){
js[1]=0;
if(++js[2]>=24){
js[2]=0;
}
}
}
}
}

第4个按键看不清是干嘛的

第2个回答  2017-04-11
#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,min=0,hour=12,scanled;
unsigned char key,mode,time;
unsigned char disdat[8];
sbit key1=P1^4;
sbit key2=P1^5;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P3=0x04;
P2=~ledtab[disdat[5]];
break;
case 1:
P3=0x08;
P2=~ledtab[disdat[4]]&0x7f;
break;
case 2:
P3=0x10;
P2=~ledtab[disdat[3]];
break;
case 3:
P3=0x20;
P2=~ledtab[disdat[2]]&0x7f;
break;
case 4:
P3=0x40;
P2=~ledtab[disdat[1]];
break;
case 5:
P3=0x80;
P2=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
if(key1==0)
{
while(key1==0);
TR0=1;
}
if(key2==0)
{
while(key2==0);
TR0=0;
}
}
}
第3个回答  2017-04-11

单片机LED的时钟秒表 仿真实例,可以参考一下,下载附件仿真试试。


本回答被网友采纳
相似回答