用51单片机P1口驱动8个LED做循环点亮控制,每个LED占空比50%,周期两秒

急需,谢谢
求程序

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar Counter = 0;
uchar P1LEDBUF = 0x01;//P1口的灯如果亮了7个,就改成0xFE;

main()
{
P1=0x00; //如果灯全亮了,则全部改为0xFF
TMOD = 0x01; //T0工作在定时方式1
TH0 = 0x3C; //T0初值50ms
TL0 = 0xB0;
ET0 = 1; //开启定时器0中断
EA = 1; //开总中断
TR0 = 1; //启动定时器0
while(1);
}

/********************************************/
/* 定时器0中断服务程序 */
/********************************************/
void T0_Serve() interrupt 1
{
TH0 = 0x3c; //每次定时50ms
TL0 = 0xb0;
Counter++;
if(Counter == 20) //中断20次后进入函数,时间刚好1秒(误差可以忽略)
{
Counter = 0; //计数清0
P1 = P1LEDBUF ;
P1LEDBUF =_crol_(P1LEDBUF,1); //位移P1口LED,准备下一轮
//如果灯亮和灭的刚好反了(熄了一个灯,亮了7个)就把初值改了
}
if(Counter == 40)
{
Counter = 0;//计数清0,周期2秒
P1 = 0x00 ;//如果灯全亮了,则改为P1=0xFF;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-17
ORG 0000H
MOV A, #7FH
LOOP:
MOV P1, A
CALL DL1S
MOV P1, #255
CALL DL1S
RR A
SJMP LOOP

DL1S:
MOV R5, #10
D2:
MOV R7, #200
D1:
MOV R6, #250
DJNZ R6, $
DJNZ R7, D1
DJNZ R5, D2
RET ;返回主程序
第2个回答  2009-12-17
首先给P1口送#0FEH 延时 左移 再次送P1口
第3个回答  2019-08-19
我可以帮你写啊,你要的是哪种单片机的型号呢,如果是stc的就比较容易
第4个回答  2009-12-17
程序要看你的硬件电路来写啊
相似回答