
先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序
ORG000H\x0d\LJMPMAIN\x0d\ORG000BH;定时器0中断入口\x0d\LJMPLOOP1\x0d\ORG0100H\x0d\MAIN:\x0d\MOVTMOD,#01H;设置定时器工作模式\x0d\MOVTL0,#0EFH;设置定时器初值\x0d\MOVTH0,#0D8H\x0d\SETBEA;打开总中断\x0d\SETBET0;打开定时器0中断\x0d\SETBTR0;启动定时器0\x0d\MOVP0,#0FFH\x0d\MOVR0,#200;延时参数\x0d\LOOP:\x0d\CJNER0,#0,LOOP;延时\x0d\MOVA,#0EFH\x0d\NEXT:\x0d\MOVP0,A;送值\x0d\MOVR0,#50;延时参数\x0d\EXIT:\x0d\CJNER0,#00H,EXIT;延时一会儿\x0d\RLA;A循环左移根据程序分许,该程序完成流水灯功能\x0d\LJMPNEXT\x0d\\x0d\LOOP1:;定时器0中断函数\x0d\MOVTL0,#0EFH;定时器初值\x0d\MOVTH0,#0D8H;定时器初值\x0d\DECR0;\x0d\RETI;中断返回\x0d\END\x0d\有疑问可以追问。
方法:将定时器中断时间设置为一秒一次。声明一个全局的变量temp 在初始化的时候赋初值,在中断服务函数中,添加 temp=_cror_(temp,1); 在主程序while(1){ P0 = temp;}
假设灯接P0口,低电平点亮
主程序
void main()
{
unsigned char a=0, i=0;
TMOD=0X01;
TH0=(65536-50000)/256;/定时50ms
TL0=(65536-50000)%256;
EA=1;ET0=1;
TR0=1;
P0=0XFF ;
while(1);
}
中断程序
void timer0 (void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)//1秒时间到
{a=0;i++;P0=0XEF>>(i-1);}
if{i==8)i=0;
}
你这个根本
就没有用到定时器函数。。你要想不精确延时的话
搞个比较大的数
++
或--
来延时
要用定时器
就得用定时器中断。。
至于全亮的原因
是因为
delay1s
没有起到延时1s的作用
二十极其短的延时
导致流水灯太快
给人感觉是全亮的。。
你可以改成
long
a
;
while(a<500000)
(值大小自己调试)
以上就是关于51单片机用定时器,怎么编程流水灯一秒闪烁一次,全部的内容,包括:51单片机用定时器,怎么编程流水灯一秒闪烁一次,、单片机流水灯汇编程序是怎样的、求AT89C52设计的流水灯程序。P0口控制8个led,间隔一秒,循环点亮,用到定时器的方法做 急求!在线等!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)