51单片机 ,设计一个跑马灯程序,用软件延时,p0输出,怎么设计c语言,用p1口的开关控制灯循环的速率

51单片机 ,设计一个跑马灯程序,用软件延时,p0输出,怎么设计c语言,用p1口的开关控制灯循环的速率,第1张

51单片机是单片机接触最早的,下边这个程序希望能帮到你。(只有主函数,就不进行硬件什么定义以及头文件包含什么的了)

void delay(int times){//延时函数,times控制延时时间

int i, j;

for(i = 0; i < times; i++)

for(j = 0; j < 210; j++)

;

}

int main(void){

unsigned char data, i;

while(1){

data = P1;//把开关值读回来

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

P0 = ~(0x01 << i); //某位为高电平某位对应的灯亮

delay(data);//把读取的开关值用来控制延时

}

}

}

org 0000h

jmp start

org 0030h

start:

mov p0,#11111110b  ;  此时第一个灯亮

call t10s

mov p0,#11111101b  ;此时第二个灯亮

call t10s

mov p0,#11111011b

call t10s

mov p0,#11110111b

call t10s

mov p0,#11101111b

call t10s

mov p0,#11011111b

call t10s

jmp start        ;此处跳到开始 即 循环

;延时子程序10秒=250usX2X200X100

t10s:mov r5,#100

lpr5:mov r6,#200

lpr6:mov r7,#250

djnz r7,$

djnz r6,lpr6

djnz r5,lpr5

ret

end

把灯的正极接电源正极 即vcc 负极分别接p00-p05

此时  给p0  送0灯就亮 1灯就不亮

程序已经过调试 可用

仿真如下:

跑马灯程序用汇编是很好实现的,只要用好循环移位指令就可以,以下是程序。

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV A,#0FEH

LOOP:

MOV P1,A ;将控制字送端口

RL A ;控制字循环左移

LCALL DELAY ;延时

SJMP LOOP

DELAY: ;延时大概1秒

MOV R2,#10

DLY1:

MOV R3,#200

DLY2:

MOV R4,#250

DJNZ R4,$

DJNZ R3,DLY2

DJNZ R2,DLY1

RET

END

#include <reg52h>

void time(unsigned int ucMs);//函数声明

void main(void)

{

unsigned char ucTimes;

#define DELAY_TIME 450

while(1)

{

P1=0xff;

P0=0xff;

for(ucTimes=0;ucTimes<8;ucTimes++){

P0 = P0 - (0x01<<ucTimes);time(DELAY_TIME);}

for(ucTimes=0;ucTimes<8;ucTimes++){

P1 = P1 - (0x01<<ucTimes);time(DELAY_TIME);}

P1=0xff;

P0=0xff;

for(ucTimes=0;ucTimes<8;ucTimes++){

P1 = P1 - (0x80>>ucTimes);time(DELAY_TIME);}

for(ucTimes=0;ucTimes<8;ucTimes++){

P0 = P0 - (0x80>>ucTimes);time(DELAY_TIME);}

}}

void time(unsigned int ucMs)

{

#define DELAYTIMES 239

unsigned char ucCounter;

while(ucMs!=0) {

for(ucCounter=0; ucCounter<DELAYTIMES; ucCounter++) { }

ucMs--;

}

}

//P1外接8

LED

低电平发光

//

列程序

PROTEUS

仿真

#include<reg52h>

//-----------------------------

void

delay_ms(unsigned

int

s)

{

unsigned

int

x;

for(s;

s

>

0;

s--)

{

x

=

98;

while(x--);

}

}

//-----------------------------

void

main()

{

char

i,

j;

while(1)

{

for(j

=

0;

j

<

8;

j++)

{

P1

=

255;

//全灭,

P1外接LED,

低电平发光

delay_ms(500);

//稍等片刻

for(i

=

0;

i

<

8;

i++)

{

P1

<<=

1;

delay_ms(900

-

100

j);

//延

渐短

}

}

}

}

//-----------------------------

ORG 0000H

SJMP START

ORG 0030H

START: MOV A, #0FEH ; 先让第一个发光二极管点亮

LOOP: MOV P1, A ; 从P1口输出到发光二极管

MOV R1, #100 ; 延时05秒

DEL1: MOV R2, #200

DEL2: MOV R3, #7

DEL3: DJNZ R3, DEL3

DJNZ R2, DEL2

DJNZ R1, DEL1

RL A ; 左移一位,点亮下一个发光二极管

LJMP LOOP

END

这个是我写的跑马灯程序,没有左右振荡,自己参考参考加上去吧

1、LED是高电平亮还是低电平亮,取决于你的电路设置,如果LED负极接地(或者串电阻再接地),则高电平时亮。

2、P1=P1<<1;你的理解是对的。

3、P1=P1>>1;就是右移,比如现在是0x80,接P1的第7位对应灯亮,下次右移就变成0x40,接P1的第6位对应灯亮

4、两个for循环,第一个是从P1的第0位至第7位轮流显示,第二个for则反过来。

以上就是关于51单片机 ,设计一个跑马灯程序,用软件延时,p0输出,怎么设计c语言,用p1口的开关控制灯循环的速率全部的内容,包括:51单片机 ,设计一个跑马灯程序,用软件延时,p0输出,怎么设计c语言,用p1口的开关控制灯循环的速率、51单片机 跑马灯程序、用汇编语言编写跑马灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9435274.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存