用89C52单片机控制32个LED流水灯的C语言程序,

要求一开始全亮,然后只有第一灭,其他全亮,然后只有第二灭,其他全亮,如此类推到最后一个灭,其他全亮,最后全亮全灭交替闪烁5次,每个步骤延迟20ms,求这个程序!谢谢!!... 要求一开始全亮,然后只有第一灭,其他全亮,然后只有第二灭,其他全亮,如此类推到最后一个灭,其他全亮,最后全亮全灭交替闪烁5次,每个步骤延迟20ms,求这个程序!谢谢!! 展开
 我来答
烟火夜空
2013-05-20 · TA获得超过6623个赞
知道大有可为答主
回答量:1678
采纳率:93%
帮助的人:564万
展开全部
/***32灯流水——火柴天堂作品-20130520***/
/***52单片机,12MHz晶振,P0-P3 接32颗LED,低电平驱动***/
#include"REG52.h"//包含52头文件
#define TRUE 1//定义布尔量'1':真
#define FALSE 0//定义布尔量'0':假
#define uchar unsigned char//定义 无符号字符型数据 简称
#define uint unsigned int//定义 无符号整型数据 简称

#define th0 0xb1
#define tl0 0xe0//20ms at 12MHz Fosc in Model 1

#define LED_Port1 P0
#define LED_Port2 P1
#define LED_Port3 P2
#define LED_Port4 P3
#define LED_AllOff LED_Port1=LED_Port2=LED_Port3=LED_Port4=0xff
#define LED_AllOn LED_Port1=LED_Port2=LED_Port3=LED_Port4=0
#define LED_Status 43//1步全亮+32步单亮+10步闪烁
#define LED_Marquee 32

bit T20msFlag=0;
void Timer0() interrupt 1
{
TL0=tl0;
TH0=th0;
T20msFlag=TRUE;
}
void TimerInit()
{
TMOD=0x01;
TH0=th0;
TL0=tl0;
TR0=1;
ET0=1;
EA=1;
}
void LED_Out()
{
static uchar led_status=0;
if(T20msFlag)
{
T20msFlag=FALSE;
led_status=++led_status%LED_Status;
}
if(led_status && led_status<=LED_Marquee)
{
LED_AllOn;
switch((led_status-1)>>3)
{
case 0:LED_Port1=1<<((led_status-1)%8);break;
case 1:LED_Port2=1<<((led_status-1)%8);break;
case 2:LED_Port3=1<<((led_status-1)%8);break;
case 3:LED_Port4=1<<((led_status-1)%8);break;
default:led_status=0;break;
}
}
else
{
if(!led_status && led_status%2) LED_AllOn;
else LED_AllOff;
}
}
void main()
{
TimerInit();
while(1)
{
LED_Out();
}
}
更多追问追答
追问
请问单灯亮的间隔时间是多少,怎么修改?
追答
由于 应LZ 要求,定时器已经设置为20ms,所以该程序不具备移植功能,如果需要移植,进行时间修改,那么需要做以下修改:
① 把全文的 T20msFlag 替换成 LED_DisplayFlag
② 增加一个宏定义:#define LED_InteTimeAt20ms 50 // LED间隔时间 50×20ms=1s
③ T0中断函数需修改为:
void Timer0() interrupt 1
{
static uchar t20ms=0;

TL0=tl0;

TH0=th0;

t20ms=++t20ms%LED_InteTimeAt20ms;

if(!t20ms) LED_DisplayFlag=TRUE;

}
注:间隔时间为②点所述,时间单位是定时器的定时时间(20ms),宏定义50,则间隔时间T=20ms×50=1s;
如果定时器定时时间有变更,计算也随之而变。
zhxiufan
2013-05-20 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38385
国家科技进步奖

向TA提问 私信TA
展开全部
#include<reg51.h>

#define uchar unsigned char
uchar led1,led2,led3,led4;
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
uchar num;
unsigned long int led;
while(1)
{
led=0x00000001;
num=0;
while(num<32)
{
led1=(led<<num)>>24;
led2=(led<<num)>>16;
led3=(led<<num)>>8;
led4=led<<num;
P0=led1;
P1=led2;
P2=led3;
P3=led4;
delay(20);
num++;
}
for(num=0;num<5;num++)
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
delay(20);
P0=0xff;
P0=0xff;
P0=0xff;
P0=0xff;
delay(20);
}

}
}
追问
大神,能不能改一下,要求一开始全亮,然后只有第一灭,其他全亮,然后只有第二灭,其他全亮,如此类推到最后一个灭,其他全亮,最后全亮全灭交替闪烁5次,每一个单灯灭的步骤用一个代码控制,以方便随时更改哪个灯灭,每个步骤延迟200ms,求这个程序!谢谢!!
追答
#include

#define uchar unsigned char
uchar led1,led2,led3,led4;
void delay(uchar a)
{
uchar i,j;
for(i=0;i>24;
led2=(led>16;
led3=(led>8;
led4=led<<num;
P0=led1;
P1=led2;
P2=led3;
P3=led4;
delay(20);
num++;
}
for(num=0;num<5;num++)
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
delay(20);
P0=0xff;
P0=0xff;
P0=0xff;
P0=0xff;
delay(20);
}

}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
DoramiHe
2018-03-19 · 知道合伙人互联网行家
DoramiHe
知道合伙人互联网行家
采纳数:25332 获赞数:59541
2011年中山职业技术学院毕业,现担任毅衣公司京东小二

向TA提问 私信TA
展开全部
#include<reg51.h>

#define uchar unsigned char
uchar led1,led2,led3,led4;
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
uchar num;
unsigned long int led;
while(1)
{
led=0x00000001;
num=0;
while(num<32)
{
led1=(led<<num)>>24;
led2=(led<<num)>>16;
led3=(led<<num)>>8;
led4=led<<num;
P0=led1;
P1=led2;
P2=led3;
P3=led4;
delay(20);
num++;
}
for(num=0;num<5;num++)
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
delay(20);
P0=0xff;
P0=0xff;
P0=0xff;
P0=0xff;
delay(20);
}

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
音池台
2013-05-20 · 超过24用户采纳过TA的回答
知道答主
回答量:118
采纳率:0%
帮助的人:49.6万
展开全部
I/O口连接方式呢?
更多追问追答
追问
用下拉电阻
追答
有没有原理图啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式