1. 首页 > 科技

用AT89C51单片机写一个C语言程序实现2个led秒计数器,用1个按键控制开始计时、暂停计时、计时时间和清零?

用AT89C51单片机写一个C语言程序实现2个led秒计数器,用1个按键控制开始计时、暂停计时、计时时间和清零?

用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6为的,有三个按键接在P0上。

按照你的要求写的程序如下,你拿去测试吧!

 

#include "REG52.H"

sbit SHUG_01 = P2^0;    //数码管1

sbit SHUG_02 = P2^1;    //数码管2

sbit SHUG_03 = P2^2;    //数码管3

sbit SHUG_04 = P2^3;    //数码管4

sbit SHUG_05 = P2^4;    //数码管5

sbit SHUG_06 = P2^5;    //数码管6

 

sbit    KEY0_01 = P0^0;    //按键  启动或停止

sbit    KEY0_02 = P0^1;    //按键  加

sbit    KEY0_03 = P0^2;    //按键减

 

#define     LED_DATA        P1      //P1数据端口

unsigned char value_temp = 0;

unsigned char value_shio = 23;

unsigned char value_feno = 59;

unsigned char value_miao = 59;

 

unsigned char code   value_tab0[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //共阳极

unsigned char code   value_tab1[]={0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //共阳极 

 

/*

 * 延时1ms延时子函数

**/

void Delay_1ms(unsigned int Time)

{

 unsigned int x, y;

 for(x = Time; x > 0; x--)

  for(y = 120; y > 0; y--);

}

 

/*

 * 按键开关【启动和停止】子函数

**/

void Scan_keyoutCmd(void)

{

 if(KEY0_01 == 0)           

 {

  Delay_1ms(10);         

  if(KEY0_01 == 0)           

  {

   TR0 = ~ TR0;   

  }

  while(KEY0_01 == 0);         

 } 

 

 if(KEY0_02 == 0)           

 {

  Delay_1ms(10);           

  if(KEY0_02 == 0)           

  {

   value_miao--;   

   if(value_miao == -1)

   {

    value_feno--;

    value_miao = 59;

    if(value_feno == 0)

    {

     value_shio--;

     value_feno = 59;

     if(value_shio == 0)

     {

      value_shio = 23;

     }

    } 

   }

   while(KEY0_02 == 0);       

  }

 } 

 

 if(KEY0_03 == 0)           

 {

  Delay_1ms(10);         

  if(KEY0_03 == 0)         

  {

   value_miao++;   

   if(value_miao == 60)

   {

    value_miao = 0;

    value_feno++;

    if(value_feno == 60)

    {

     value_feno = 0;

     value_shio++; 

     if(value_shio == 24)

     {

      value_shio = 0;

     }

    } 

   }

    while(KEY0_03 == 0);          //检测松手

  }

 } 

}

 

/*

 * 程序运行【启动和停止】子函数

**/

void Disp_layledketCmd(void)

{

 /***小时***/

 SHUG_01 = 1;   

 LED_DATA = value_tab0[value_shio / 10];   /*******小时的十位数显示***************/

 Delay_1ms(5);

 SHUG_01 = 0;

 SHUG_02 = 1;

 LED_DATA = value_tab1[value_shio % 10];   /*******小时的个位数显示***************/

 Delay_1ms(5);

 SHUG_02 = 0;

 

 /***分钟***/

    SHUG_03 = 1;   

 LED_DATA = value_tab0[value_feno / 10];   /*******分钟的十位数显示***************/

 Delay_1ms(5);

 SHUG_03 = 0;

 SHUG_04 = 1;

 LED_DATA = value_tab1[value_feno % 10];   /*******分钟的个位数显示***************/

 Delay_1ms(5);

 SHUG_04 = 0;

 

 /***秒钟***/

    SHUG_05 = 1;   

 LED_DATA = value_tab0[value_miao / 10];   /*******秒钟的十位数显示***************/

 Delay_1ms(5);

 SHUG_05 = 0;

 SHUG_06 = 1;

 LED_DATA = value_tab0[value_miao % 10];   /*******秒钟的个位数显示***************/

 Delay_1ms(5);

 SHUG_06 = 0;

}

 

void Tero_Init(void)

{

 TMOD = 0x01;

 TH0 = (65536 - 50000) / 256;

 TL0 = (65536 - 50000) % 256;

 ET0 = 1;

 TR0 = 1;

 EA = 1;

}

 

/*

 * 函数主体

**/

int main(void)

{

 P1 = P2 = P3 = 0x00;

 Tero_Init();

 

 while(1)

 {

  Scan_keyoutCmd();

  Disp_layledketCmd();  //执行应运程序 

 } 

}

 

/*

 * 定时器中断服务程序

**/

void Tmero()interrupt 1

{

 TH0 = (65536 - 50000) / 256;

 TL0 = (65536 - 50000) % 256;

 value_temp++;

 if(value_temp == 20)

 {

  value_temp = 0;

  value_miao--;

  if(value_miao == 0)

  {

   value_feno--;

   value_miao = 59;

   if(value_feno == 0)

   {

    value_shio--;

    value_feno = 59;

    if(value_shio == 0)

    {

     value_shio = 23;

    }

   }

 

  }

 } 

}

用C语言编写AT89C51单片机程序,设计一个智能数字钟。

基本要求:1.C语言程序要求是模块化设计。2.该闹钟基于AT89C51单片机及相关外围电路进行设计。3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒)。4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能。S2是设定键,即该键按下,将分别选中需要设定的选项。S3键是加键,即按下去表示相应选项加1。S4键是减键,即按下去表示相应的选项减1。5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s。发挥要求:1.定时时间可被打断,即打断后恢复时继续计时。2.设置闹钟报警功能;3.能切换显示年月日等信息。

用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键分别控制暂停、加一秒、减一秒和继续

#include<reg51.h>

#define uchar unsigned char;

uchar LED1,LED2;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar num=0;sec,key;

void delay(unsigned int a)

{

unsigned int i,j;

for(i=0;i<a;i++)

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

}

void display()

{

LED1=sec/10;

LED2=sec%10;

P2=0x01;

P0=distab[LED1];

delay(3);

P2=0x02;

P0=distab[LED2];

delay(3);

}

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

num++;

if(num>=20)

{

num=0;

sec++;

}

}

main()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

LED1=0;

LED2=0;

while(1)

{

key=P1;

if((key&0x0f)!=0x0f)

{

delay(10);

key=P1&0x0f;

if(key!=0x0f)

{

switch(key)

{

case 0x0e:TR0=0;break;

case 0x0d:sec++;break;

case 0x0b:sec--;break;

case 0x07:TR0=1;break;

default:break;

}

}

}

)

display();

}

}

AT89C51单片机如何实现一个按钮控制两个LED同步闪烁?

。。。。。。。。。。。。简单到离谱了,一楼还有脸说代做。。。

细节你没说明,以下是按下开关不放时,两个灯一起闪,1秒亮1秒暗。开关松开就停止闪烁。

#include

sbit d1=P0^0;

sbit d2=P0^1;

sbit k1=P3^0;

void delay(int x)

{

char y;

while(x--)

for(y=0;y<120;y++);

}

void main()

{

while(1)

if(k1==0)

{

d1=~d1;

d2=~d2;

delay(1000);

}

}

因为我偷懒的关系,程序有个小漏洞,延时函数的x和y应该定义成无符号数更合理