求大神编一道51单片机实现多种倒计时功能

比如按下p1.0口,可以令LED灯一亮一灭5秒。按下p1.1口,可以令LED全亮10秒。等等.这些不同的LED灯花色在实现功能时会有数码管去显示程序剩余时间。这程序该怎么... 比如按下p1.0口,可以令LED灯一亮一灭5秒。

按下p1.1口,可以令LED全亮10秒。等等.

这些不同的LED灯花色在实现功能时会有数码管去显示程序剩余时间。

这程序该怎么编?
展开
 我来答
帐号已注销
推荐于2016-06-07 · TA获得超过2062个赞
知道小有建树答主
回答量:342
采纳率:0%
帮助的人:339万
展开全部

这个不算太难,只要利用标识符进行判断即可


标识符就是一个变量,常使用字符型变量作为标识符,占用空间小


每一种状态都用标识符表示出来,例如状态0,状态1,状态2 ..................状态254


字符型变量的值范围是 0 ~ 254 共255个值,够你用的了


给你一个类似的程序,我自己写的,你作为参考吧


程序的组成是:两个按键,一组四位数码管,两个LED发光二极管


程序的功能是:按下按键A,两个LED同时点亮,并延时10秒(时间随意修改)

                        按下按键B,两个LED同时熄灭,并延时10秒(时间随意修改)

                        无按键按下时,两个LED交替点亮,达到闪烁的效果


程序如下,并加了注释,若满意请采纳!


#include <reg51.h> //51单片机通用头文件

unsigned  int i,t,h; char fe;

sbit a=P3^7; sbit b=P3^6; sbit led=P2^7; sbit lad=P2^6;//按键及LED端口定义

char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码

/***************************************************************************/

void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延时函数

/***************************************************************************/

void XS(int xs) //数码管显示

{

     char d1,d2,d3,d4;

     d1=(xs/1)%10;  d2=(xs/10)%10;  d3=(xs/100)%10;  d4=(xs/1000)%10;

     P0=table[d1]; P1=0xf7; YS(10); P1=0xff;//个位显示

     P0=table[d2]; P1=0xfb; YS(10); P1=0xff;//十位显示

     P0=table[d3]; P1=0xfd; YS(10); P1=0xff;//百位显示

     P0=table[d4]; P1=0xfe; YS(10); P1=0xff;//千位显示

}

/***************************************************************************/

void main()

{

     TH0=(65536-50000)/256;

     TL0=(65536-50000)%256;

     TMOD=0x01; TR0=1; ET0=1; EA=1;

     led=0;lad=1;

     while(1)

     {

         XS(h);//调用数码管显示函数

         if(a==0){h=10;fe=0;}//按键 A,  LED 亮10秒

         if(b==0){h=10;fe=1;}//按键 B,  LED 灭10秒

     }

}

/***************************************************************************/

void  t0()interrupt 1//定时器 0 中断

{

     TH0=(65536-50000)/256;

     TL0=(65536-50000)%256;

     i++; t++;

     if(h>0){t=0;}//如果按键按下,屏蔽 t 计数,

     if(t>=5){t=0;led=~led; lad=~lad;}//t计数,用于两个LED闪烁

     if(i>=20)//还是原来的时间判断

     {

         i=0;

         if(h>0&&fe==0){h--;led=0;lad=0;}//如果是状态 0 同时点亮两个LED

         if(h>0&&fe==1){h--;led=1;lad=1;}//如果是状态 1 同时关闭两个LED

     }

     if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句防止数码管倒计时后两个LED继续同时点亮

}

/***************************************************************************/

查晓筠0i5
2015-01-23 · TA获得超过2752个赞
知道大有可为答主
回答量:2.1万
采纳率:1%
帮助的人:4958万
展开全部
需要给你写一分吗
我做单片机设计的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式