求一个单片机程序,要C语言的,

制作一个两位的LED数码显示的计时表,最小计时单位“秒”,显示时间的范围为00~99s,每秒自动加1,另设置一个“开始”键和一个“复位”键。如“开始”按键放下,时钟开始走时,LED数码管显示两位的秒时间;如“复位”按键按下,LED数码管清零显示“00”‘通过对键盘的扫描计时表的走时/停止进行控制,采用定时器T0作为计时器,每10ms发生一次中断,每一百次中断为1s。在此期间,如“开始”按键按下,程序方将TR0置为1,从而开启中断,时钟开始走时;如“复位”按键按下,程序将TR0置为0,同时将存储时间的变量清零,从而中断停止,并实现复位。

//-----------------------------------------------------------------

//  

//               

//-----------------------------------------------------------------

#include <reg51.h>

#include <absacc.h>

#define INT8U unsigned char

#define INT16U  unsigned int


INT8U temp,aa,shi,ge;

INT8U   dsp[]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //不带小数点的0-9的数码管显示


sbit  din=P3^0;

sbit  clk=P3^2;

sbit   cs=P3^1;

sbit key1=P1^0;

sbit key3=P1^1;




void init();


//-----------------------------------------------------------------

// 延时子程序  

//-----------------------------------------------------------------

void delay_ms(INT16U ms) 

{

 INT8U t;

while(ms--)  for(t = 0; t < 120; t++);

}


void write(char addr,char dat)

{

char i,j;

cs=0;

clk=0;

for(i=0;i<8;i++)  //写地址

{

//temp=addr;

if(addr&0x80)  din=1;

else din=0;

clk=1;

for(j=0;j<5;j++);

clk=0;

       addr<<=1;

}

for(i=0;i<8;i++)//写数据

{

//temp=dat;

if(dat&0x80)  din=1;

else din=0;

clk=1;

for(j=0;j<5;j++);

clk=0;

        dat<<=1;

}

cs=1;

}


//-----------------------------------------------------------------

// 主程序  

//-----------------------------------------------------------------

void main()

{

 

    init();

cs=1;

clk=1;

din=1;

    write(0x09,0x00);//译码选择,非BCD码

write(0x0a,0x07);//亮度调节

write(0x0b,0x07);//显示位数

    write(0x0c,0x01);//正常工作状态

while(1)

{

    if(key1==0)

     {

      delay_ms(5);

      if(key1==0)

        {

         while(!key1);

     TR0=1;

    }

          }

        if(key3==0)

         {

      delay_ms(5);

      if(key3==0)

        {

         while(!key3);

     temp=0;

 shi=0;

     ge=0;

     TR0=0;

    }

     }

 

write(0x06,dsp[ge]);

write(0x05,dsp[shi]);

}

}

void init()

{

  temp=0;

  TMOD=0x01;

  TH0=(65536-10000)/256;

  TL0=(65536-10000)%256;

  EA=1;

  ET0=1;

}

void timer0() interrupt 1

{

  TH0=(65536-10000)/256;

  TL0=(65536-10000)%256; 

  aa++;

     if(aa==100)

      {

      aa=0;

      temp++;

 if(temp==100)

     {

       temp=0;

     }

 shi=temp%100/10;

 ge=temp%10;

 }

}


追问

我的是两位数码管,程序应该哪里改一下吧?

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-06-08
可以不用U3吧 没有按键部分仅供参考段选接P2口 位选接P3.0和P3.1
#include<reg51.h>
#define uchar unsigned char
uchar code Tab[16]={0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/};
uchar Second=0,Counter=0;Second_1=0,Second_0=0;
void Display(void);
void Delay(void);
main(){
TMOD=0x01;
TL0=0x3c;
TH0=0xb0;
ET0=1;
EA=1;
TR0=1;
while(1){
Display();
}
}
void Display(void){
P2=Tab[Second_1];
P3=0x01;
Delay();
P3=0x00;
P2=Tab[Second_0];
P3=0x02;
Delay();
P3=0x00;
}
void Timer0() interrupt 1{
ET0=0;
TH0=0x3c;
TL0=0xb0;
Counter++;
if(Counter==20){
Counter=0;
Second++;
if(Second==60){ Second=0;}
Second_1=Second/10;
Second_0=Second%10;
}
ET0=1;
}

void Delay(void){
uchar data i;
for(i=500;i>0;i--);
}
相似回答