
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单片机 跑马灯程序、用汇编语言编写跑马灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)