做一个流水灯的仿真过程
proteus吧
全部回复
仅看楼主
level 4
今天心血来潮做了一个led流水灯仿真的实例:
以下是硬件连接图
程序源码:
#include <reg51.h>
typedef unsigned int uint;
sbit led0=P0^0;
uint ms=50000;
void delay(uint i);
void main()
{
while(1)
{
P0=0xfe;
delay(ms);
P0=0xfd;
delay(ms);
P0=0xfb;
delay(ms);
P0=0xf7;
delay(ms);
P0=0xef;
delay(ms);
P0=0xdf;
delay(ms);
P0=0xbf;
delay(ms);
P0=0x7f;
delay(ms);
}
}
void delay(uint i)
{
while(i--);
}
实验现象:


视频来自:优酷
请大家有看看有什么地方需要修改的。
2017年11月01日 03点11分 1
level 4
优化了代码之后:
#include <reg51.h>
#include <intrins.h>
#define ms 50000
typedef unsigned int uint;
void delay(uint i)
{
while(i--);
}
void main()
{
P0=0xfe;
while(1)
{
delay(ms);
P0=_crol_(P0,1);
}
}
2017年11月01日 04点11分 2
level 4
刚刚又用汇编写了一点,可以点亮其中两个led灯,
LJMP MAIN
MAIN:
MOV P0,#0XEE
END
但是编译提示有错,我不明白,proteus仿真现象是对的
编译提示
显示现象
2017年11月01日 08点11分 3
level 4
刚刚心血来潮有用汇编写了一遍流水灯程序:
源码:
LJMP MAIN
MAIN:
MOV P0,#0XFE
CALL DELAY
MOV P0,#0XFD
CALL DELAY
MOV P0,#0XFB
CALL DELAY
MOV P0,#0XF7
CALL DELAY
MOV P0,#0XEF
CALL DELAY
MOV P0,#0XDF
CALL DELAY
MOV P0,#0XBF
CALL DELAY
MOV P0,#0X7F
CALL DELAY
DELAY:
MOV R1,#20
D1:MOV R2,#40
D2:MOV R3,#248
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET
END
硬件连接和上图一致:
大家看有什么需要修改的地方
2017年11月01日 10点11分 4
level 11
最小系统板都不带画晶振的么
2017年11月01日 11点11分 5
是啊 [啊] 不过为什么没有晶振程序也能执行?
2017年11月01日 11点11分
@瞪谁谁怀孕6102 不明觉厉
2017年11月01日 11点11分
回复 晴空◎ :我发现把开发板上的晶振拔了好像也能执行 不明白为什么[疑问]
2017年11月01日 12点11分
level 4
程序上传之后我发现执行的时候仅仅循环了3次
后来又优化了代码
JMP MAIN
MAIN:
MOV P0,#0XFE
CALL DELAY
MOV P0,#0XFD
CALL DELAY
MOV P0,#0XFB
CALL DELAY
MOV P0,#0XF7
CALL DELAY
MOV P0,#0XEF
CALL DELAY
MOV P0,#0XDF
CALL DELAY
MOV P0,#0XBF
CALL DELAY
MOV P0,#0X7F
CALL DELAY
AJMP MAIN
DELAY:
MOV R1,#20
D1:MOV R2,#40
D2:MOV R3,#250
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET
END
加了一行跳转指令
2017年11月01日 14点11分 6
level 1
做一个按键控制的
2017年11月02日 10点11分 7
level 4
后来我发现有一种4脚的数码管 还没有用过 所以就拿来试了一下 图省事就没有接电阻:


视频来自:优酷
源码:
ORG 0000H
MAIN:
MOV R3,#09H
D1:MOV P1,R3
CALL DELAY
DJNZ R3,D1
MOV P1,R3
CALL DELAY
JMP MAIN
JMP MAIN
DELAY:
MOV R0,#20D
S1:MOV R1,#40D
S2:MOV R2,#250D
DJNZ R2,$
DJNZ R1,S2
DJNZ R0,S1
RET
END
仿真电路
2017年11月07日 01点11分 8
7SEG 4 针 BCD-LED 输出从 0-9 对应于 4 根线的 BCD 码
2017年11月07日 02点11分
@瞪谁谁怀孕6102 :下面的代码可以实现从0显示到f ORG 0000HMAIN: MOV R4,
#10H MOV A,#
00H S1:MOV P1,A CALL DELAY INC A DJNZ R4,S1JMP MAINDELAY: MOV R1,
#20 D1:MOV R2,#
40 D2:MOV R3,#250 DJNZ R3,$ DJNZ R2,D2 DJNZ R1,D1RETEND
2017年11月07日 08点11分
level 4
正玄波发生器信号送入示波器显示
2017年11月07日 03点11分 9
level 4
模拟了一个有源蜂鸣器用了好长时间 ,它就是不响,后来才发现他的property里有个它的工作电压,改的刚好合适就好了。


视频来自:优酷
源码:
ORG 0000H
MAIN:
MOV P2,#01H
CALL DELAY
MOV P2,#00H
CALL DELAY
JMP MAIN
DELAY:
MOV R1,#80
D1:MOV R2,#40
D2:MOV R3,#250
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET
END
电路图:
2017年11月07日 04点11分 10
level 4
这个代码实现一个四脚的数码管从0显示到f;
接线方法和上面的四脚数码管一样
ORG 0000H
MAIN:
MOV R4,#10H
MOV A,#00H
S1:MOV P1,A
CALL DELAY
INC A
DJNZ R4,S1
JMP MAIN
DELAY:
MOV R1,#20
D1:MOV R2,#40
D2:MOV R3,#250
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET
END
2017年11月07日 08点11分 11
level 4
用独立按键来计数,并且显示在数码管上的汇编程序:
连线:
程序源码:
ORG 0000H
MAIN:
MOV A,#00H ;累加器A用于记录当前键值
MOV P2,#00H ;初始化P2口,以免影响结果
S1:MOV P1,A ;将当前值送入数码管
CALL DELAY2 ;长延时用于避免短时间将一次按键按照多次来计算
S2:JNB P2.0,$
CALL DELAY1 ;短延时用于消抖
JNB P2.0,S2
INC A ;累加器将当前值加一
JMP S1 ;跳回S1等待下一个按键
DELAY1: ;短延时用于消除按键抖动
MOV R1,#20
D1:MOV R2,#40
D2:MOV R3,#25
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET
DELAY2: ;长延时用于规定按下一个键后再过一段时间接收另一次按键
MOV R1,#20
Y1:MOV R2,#40
Y2:MOV R3,#250
DJNZ R3,$
DJNZ R2,Y2
DJNZ R1,Y1
RET
END
2017年11月07日 10点11分 12
level 4
这个是上面那个程序的实验现象:


视频来自:优酷
2017年11月07日 12点11分 13
level 4
用定时器来实现一个led灯的闪烁实验
led灯亮1s,灭1s
实验现象:


视频来自:优酷
电路连接:只看那个led灯电路就行了,其他如数码管电路,按键电路请无视
源码:
#include <reg51.h>
typedef unsigned int uint;
sbit led0=P0^0;
void main()
{
uint ct;
TMOD=0X01;
TH0=0XB8;
TL0=0X00;
TR0=1;
led0=0;
while(1)
{
if(TF0==1)
{
TH0=0XB8;
TL0=0X00;
TF0=0;
ct++;
if(ct>=50)
{
led0=~led0;
ct=0;
}
}
}
}
2017年11月07日 14点11分 14
level 4
对上面那个定时器延时的程序进行了一点改进,把延时写成一个函数,这样想延时多长时间,就传多大的参数:
参数的单位谁ms
源码:
#include <reg51.h>
typedef unsigned int uint;
sbit led0=P0^0;
void delay(uint i)
{
uint ct=0;
TMOD=0X01;
TH0=0Xfc;
TL0=0X66;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0Xfc;
TL0=0X66;
ct++;
if(ct>=i)
{
return;
}
}
}
}
void main()
{
uint i;
led0=1;
while(1)
{
for(i=0;i<=5;i++)
{
led0=~led0;
delay(1000);
}
for(i=0;i<=5;i++)
{
led0=~led0;
delay(500);
}
}
}
2017年11月08日 02点11分 15
1 2 尾页