51单片机流水灯程序

51单片机流水灯程序,第1张

程序如下,仿真见附件。有问题请追问。

#include <AT89X51h>

#define uchar unsigned char

#define uint unsigned int

bit flag_1s=0;

uchar code tab[8]={1,2,4,8,16,32,64,128};//[第1小题用这个表]

//uchar code tab[8]={0x05,0,0x50,0xa0,0xaa,0x55,0xff,0x00};//[第2小题用这个表]

void InitTimer1(void)

{

    TMOD = 0x10;

    TH1 = 0x3C;

    TL1 = 0x0B0;

    EA = 1;

    ET1 = 1;

    TR1 = 1;

}

void main(void)

{

    static uchar j;

    InitTimer1();

P0=0;

P1=0;

P2=0;

P3=0;

flag_1s=1;

while(1)

{

if(flag_1s==1)

{

flag_1s=0;

P2=tab[j];

j++;

if(j>=8) j=0;

}

}

}

void Timer1Interrupt(void) interrupt 3

{

    static uchar i;

    TH1 = 0x3C;

    TL1 = 0x0B0;

    //add your code here!

    i++;

    if(i>=20)//50ms20=1000ms

    {

    i=0;

    flag_1s=1;

    }

}

r7在赋了42H后就不能在延时程序里再用了。因为在延时程序里用的话,当从延时程序里跳出后,R7的值就不是42H了。

把这三句(DJNZ R7, LOOP; DELAY:MOV R7,#10H; DJNZ R7,DELAY0;)里的r7改成R4 试试。

LED的阳极接电源正,阴极接P1口,IO某位低电平时,就点亮相应位的LED。P1=0xff,灯全灭。P1=0xfe时点亮P10灯,延时500ms 。P1=0xfd,点亮P11灯。。。。

for(;;)

{} 这条就是程序在大括号里无限循环,就是灯从1~8点亮后再从1~8,一直反复循环,没必要 退出。

org 0000h

mov p1,#00h;P1口送00,全灭

clr a;累加器请0

l0:jnb p35,l1;P35为低转l1

k0:jb p35,l2;P35为高转l2

mov r4,#0fh;R4=0fH

l1:inc a;累加器加1

mov p1,a;P1=A

lcall dl;延时

djnz r4,l1;R4减1不为0转l1

ljmp k0;转k0

mov r2,#07h;R2=07H

mov a,#80h;累加器=80H

l4:mov p1,a;P1=A

dl:mov r7,#0c8h;R7=C8H延时外层循环

dl1:mov r6,#7dh;R6=7DH延时内存循环

dl2:djnz r6,dl2;内存循环

djnz r7,dl1;外层循环

ret

l2:mov r2,#07h;R2=07H

mov r5,#01h;R5=1

k1:mov a,#01h;A=1

l3:mov p1,a;P1=A

rl a;A循环左移

lcall dl;延时

djnz r2,l3;R2减1不为0转l3

rr a;A循环右移

lcall dl;延时

djnz r2,l4;R2减1不为0转l4

djnz r5,k1;R5减1不为0转k1

sjmp l0;转l0

end

P37 连接按键,P1 外接 LED。

没有使用中断。

8个led的点亮方式用数组保存。

--3种不同的点亮方式。

--点亮方式仅仅是一个数字(0、1、2)而已,还用数组保存?

--用变量 mode 保存即可。

#include<reg51h>

#include<intrinsh>

sbit key = P3^7;

unsigned char kc, kb, kz, mode = 2, aa = 0xff;

void delay10ms(void)

{

unsigned int i, j;

for (i = 0; i < 60; i++) for (j = 0; j < 20; j++);

kc = ~key;

kz = kc ^ kb;

kb = kc;

if (kz & kb) {

mode++;

mode %= 3;

if (mode == 0) aa = 0x7f; //3种方式

if (mode == 1) aa = 0x3f;

if (mode == 2) aa = 0x1f;

}

}

main()

{

char i;

while(1) {

for (i = 0; i < 50; i++) {

delay10ms();

if (kz & kb) break;

}

P1 = aa;

aa = _cror_(aa, 1);

}

}

本程序给出的三种方式,显得简陋了一些。

试试看吧。

以上就是关于51单片机流水灯程序全部的内容,包括:51单片机流水灯程序、51单片机的流水灯程序—、单片机中流水灯的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9743127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存