
P1=0xfe
0xfe是十六进制表示的数,二进制就是1111 1110,通过你的程序和相关注释可以看出,硬件上你有8个led灯连接P1口,且这些led是低电平亮。P1=0xfe(1111 1110)也就是表示七个灯灭,一个灯亮。接下来的代码就是让P1数据0xfe左移且低位补1,移一次就是1111 1101,、两次就是1111 1011,三次是1111 0111。。。以此类推,可以看出它是0由最低位到最高位依次移过去的,而刚说了0表示led亮,这也就是led从一边到另一边依次点亮的效果。
后面的代码按我上面说的自己理解,完全对你解释太麻烦,对你也没多大好处,只有你自己理解了才能学好单片机
设一个标志位flag, 以标志位的5种状态对应发光二极管的5种工作状态,如当flag=1发光二极管工作在1,当flag=2发光二极管工作在2,......!然后根据定时器定时功能,5秒到,刷新flag的值,程序如下/*程序功能:定时5S到切换LED显示状态.
作者:w418781840.2008.5.29 */
FLAG BIT 30H 定义标志位
ORG 0
LJMP MAIN
ORG 0BH
LJMP AGA
主程序
ORG 0030H
MAIN: MOV FLAG,#01H 标志位清0
MOV TMOD,#01H 赋值50MS
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R0,#100 中断100*50=5S
SETB EA
SETB ET0
SETB TR0
SJMP $
中断服务程序
AGA: MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R0,LOOP 5S到否?否,返回
INC FLAG 到,标志加1
MOV A,FLAG
CJNE A,#05,L1 扫描5种状态了否?
MOV FLAG,#01H 是,归0,重新开始
切换程序
L1: CJNE A,#01H,L2 判断是否是状态1?否,转判断2
LCALL LED1 是,调有状态1
SJMP LOOP 返回
L2: CJNE A,#02H,L3 以下跟上面判断相同
LCALL LED2
SJMP LOOP
L3: CJNE A,#03H,L4
LCALL LED3
SJMP LOOP
L4: CJNE A,#04H,L5
LCALL LED4
SJMP LOOP
L5: CJNE A,#05H,LOOP
LCALL LED5
LOOP: RETI
LED子程序区
LED1: RET
LED2: RET
LED3: RET
LED4: RET
LED5: RET
/////////////////
///////////////////////////////
/*程序功能:定时5S到切换LED显示状态.
作者:w418781840.2008.5.29 */
//========声明区===========
#include <reg51.h>
unsigned char count=0
unsigned char flag=1
void led1(void)
void led2(void)
void led3(void)
void led4(void)
void led5(void)
//=========函数=========
main()
{ TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
EA=1
ET0=1
TR0=1
while(1)
{ switch(flag)
{ case 1:led1()break
case 2:led1()break
case 3:led1()break
case 4:led1()break
case 5:led1()break
}
}
}
//==========中断服务============
void timer0(void) interrupt 1
{ TH0=(65536-50000)/256
TL0=(65536-50000)%256
if(++count==100)
{ count=0
flag++
if(flag==5)
flag=1
}
}
//========5种状态函数区=========
单片机学的就是程序,根据硬件电路写程序的你的两排灯应该是P0和P1的吧
如果你想学我可以教你,手上也没有花样程序,也懒得写了,花样也是一个一个的闪烁程序堆积起来,就是用~(P0<<j),然后再用些P0=0xfe,什么什么的,再加for循环,加延迟,最好有水滴下落的效果,用pwm占空比在去控制灯的亮度
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)