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灯就不亮

程序已经过调试 可用

仿真如下:

很简单,你把数字 3 转换成 32位的 二进制表示方式:

3 = 0000 0000 0000 0000 0000 0000 0000 0011

二进制,通常我们这么称呼,最右边的位是最低位,称为bit0,即第0位,对于32位,最左边的是最高位,我们称为bit31,即第31位。

通过上面的转换,想必你看清楚了,3的第1位和第0位为11,那么,向左移了10次后,那两个 1 被移动到了第11位和第10位上,所以就是你看到的结果了。

ORG

0000H

;开机上电主程序入口

AJMP

START

;系统一进来就转到主程序

ORG

0030H

;主程序地址

START:

MOV

A,

#0FFH

;主程序开始,A中初始化成全1

CLR

C

;c清零

MOV

R2,

#08H

;R2左转循环计数器

LOOP:

RLC

A

<<C+A+C<<带进位循环左移,A中的内容在8此循环中从0位到7位依次变0

MOV

P2,

A

;送到P2,使P2从0位到7位依次点亮LED

CALL

DELAY

;单片机运行很快,为了能看到灯的变化,必须延迟,把速度降下来

DJNZ

R2,

LOOP

;R2每次减1后判断是否=0,8次后=0程序才会下行,否则会跳回LOOP

MOV

R2,#07H

;R2右转循环计数器

LOOP1:

RRC

A

>>C+A+C>>带进位循环右移,A中的内容在8此循环中从7位到0位依次变0

MOV

P2,

A

;送到P2,使P2从7位到0位依次点亮LED

CALL

DELAY

;和上个循环一样,延时

DJNZ

R2,

LOOP1

;R2每次减1后判断是否=0,7次后=0程序才会下行,否则会跳回LOOP1

JMP

START

;跳回程序起始位置重复下一个循环

DELAY:

MOV

R3,

#20;延时子程序,这个应该不用解释了吧

D1:

MOV

R4,

#200

D2:

MOV

R5,

#248

DJNZ

R5,

$

DJNZ

R4,

D2

RET

END

循环点亮你只要用位移指令就行啦!假如是p1口,你只要先给他赋予一个初值00000001,假如是高电平点亮,那这是就只有一盏灯亮,循环左移就行啦!每次循环一次,都调用一下延时这就可以按自己要求设置延时的时间啦!其实思路都挺简单的!不过你要是对单片机一点都不了解,那只好叫别人写好给你算了!你直接复制下就行!

我们要用到2X5的独立键盘控制的,可是我是新手不懂 能给我一个程序不??

呵呵,下面就是程序,你试试看就知道了。

;--------------------------

你的程序,有三种流水灯的模式,就是按键功能,检测不出来。

电路图,不清楚,看个大概。

现在是:K1、K2分别按下,各显示一种模式,

两个键盘都不按,显示第三种模式。

你原来只是在起动的时候,按键才管用,要想更换模式,必须重新起动。

现在增加了三行:“LJMP START ;本行可删除”,就可以在运行期间,更换模式。

ORG 0000H

START:

MOV P1, #255

CLR P16

MOV P2, #0

SETB P21

SETB P23

JNB P10, LOOPB

JNB P11, LOOPC

MOV A,#01H

LOOPA:MOV R0,#7

LOOPAL:

MOV P0, A

RL A

LCALL DELAY

DJNZ R0, LOOPAL

MOV R0,#7

LOOPAR:

MOV P0, A

RR A

LCALL DELAY

DJNZ R0, LOOPAR

LJMP START ;本行可删除

LJMP LOOPA

LOOPB:MOV A,#03H

LOOPBL:

MOV P0,A

RL A

LCALL DELAY

JNB ACC7, LOOPBL

LOOPBR:

MOV P0, A

RR A

LCALL DELAY

JNB ACC0,LOOPBR

LJMP START ;本行可删除

LJMP LOOPB

LOOPC:MOV R0,#3

MOV A,#01H

LOOPCL:

MOV P0, A

RL A

RL A

LCALL DELAY

DJNZ R0,LOOPCL

MOV R0, #3

RL A

LOOPCR:

MOV P0, A

RR A

RR A

LCALL DELAY

DJNZ R0, LOOPCR

LJMP START ;本行可删除

LJMP LOOPC

DELAY:MOV R4,#2

L3:MOV R2,#250

L1:MOV R3,#250

L2:DJNZ R3,L2

DJNZ R2,L1

DJNZ R4,L3

RET

END

本程序在PROTEUS中仿真调试通过。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存