按钮控制LED——51单片机的
Proteus实验
实验原理
51单片机的一个I/O口接按钮,再通过另一个I/O口控制LED的亮、灭。
主要器件以及电路图
单片机——AT89C51,上拉电阻——pullup,按钮button,发光二极管——LED。
按钮控制LED汇编程序源码
ORG 0
START:
MOV P1,#0 ;LED不亮
MOV P0,#0FFH ;P0口准备读数
ST1:
JB P0.0,$ ;等待按钮抬起
JNB P0.0,$ ;等待按钮按下
;以上两句使得只有按一下按钮才可能执行下面的语句
CPL P1.0 ;LED状态改变
SJMP ST1 ;返回
END
流水灯——51单片机的Proteus实验
实验原理
通过个51单片机的一个I/O口送不同的数字,实现8个LED的流水灯。
本实验为移动一个不亮的LED。
通过修改送给I/O口送的数字可以实现不同方式的流水灯。
主要器件以及电路图
单片机——AT89C51,8排电阻——RX8,发光二极管——LED。
流水灯汇编程序源码
org 0
sjmp start
org 30h
start: mov P1,#1 ;P1.0为1,不亮mov P1,#2 ;P1.1为1,不亮
mov P1,#4 ;以下原理同上
mov P1,#8
mov P1,#10h
mov P1,#20h
mov P1,#40h
mov P1,#80h
sjmp start
delay: nop
nop
nop
nop
ret
end
数码显示管——51单片机的Proteus
实验
实验原理
51单片机的一个I/O口接4个开关,再通过另一个I/O口控制7段数码显示管显示想要的数字。
主要器件以及电路图
单片机——AT89C51,共地的7段数码显示管——7SEG-COM-AN-GRN,开关——SW-SPST。
汇编程序源码
汇编后139字节。
org 0
sjmp START
org 30h
START: mov P1,#0FFh ;LED不亮
st1: mov P2,#0FFh ;准备读数(开关状态)
mov A,P2 ;读数
anl A,#0Fh ;取低四位
acall SEG7 ;调用显示码子程序
mov P1,A ;将得到的显示码送数显管显示
sjmp st1 ;循环
SEG7: inc A ;该子程序实现将数字转换为显示码movc A,@A+pc
ret
DB 0c0h,0F9h,0a4h,0b0h
DB 99h,92h,82h,0F8h
DB 80h,90h,88h,83h
DB 0c6h,0a1h,86h,8eh
end
C语言程序源码
用C语言写了一下实现同样功能的程序,编译后1.39K,代码如下:
#include<reg51.h>
int main(){
P1 = 0xff;
while(1){
P2 = 0xff;
ACC = P2;
ACC &= 0xf;
switch(ACC){
case 0: P1 = 0xc0; break;
case 1: P1 = 0xf9; break;
case 2: P1 = 0xa4; break;
case 3: P1 = 0xb0; break;
case 4: P1 = 0x99; break;
case 5: P1 = 0x92; break;
case 6: P1 = 0x82; break;
case 7: P1 = 0xf8; break;
case 8: P1 = 0x80; break;
case 9: P1 = 0x90; break;
case 10: P1 = 0x88; break;
case 11: P1 = 0x83; break;
case 12: P1 = 0xc6; break;
case 13: P1 = 0xa1; break;
case 14: P1 = 0x86; break;
case 15: P1 = 0x8e; break;
}
}
while(1);
}
用数组实现,更大(1.51K),代码如下:
#include<reg51.h>
int main(){
int ledNum[16] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0 xa1,0x86,0x8e};
P1 = 0xff;
while(1){
P2 = 0xff;
ACC = P2;
ACC &= 0xf;
P1 = ledNum[ACC];
}
while(1);
}
开关控制流水灯2——51单片机的
Proteus实验
实验原理
51单片机的一个I/O口接四个开关,每个开关控制流水灯的不同方面,再通过另一个I/O口控制8个LED的亮、灭,从而实现流水灯。
其中:开关一控制流水灯是否有翻转;开关二控制流动方向;开关三控制是否改变数字;开关四控制流动时间。
主要器件以及电路图
单片机——AT89C51,发光二极管——LED。
C语言程序源码
#include <reg51.h>
typedef unsigned int uint;
sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
uint delayT = 10000;
void delay(){
int i;
for(i=0;i<delayT;i++){
;
}
}
int main(){
int i;
uint leds[8] = {254,253,251,247,239,223,191,127};//只有一个灯亮
while(1){
P0 = 0xff;
//是否取反
if(P0_0 == 0){
for(i=0;i<8;i++){
leds[i] = -leds[i];
}
}
if(P0_2 == 0){
//控制是否数字加一
for(i=0;i<8;i++){
leds[i] = leds[i] + 1;
}
}
if(P0_1 == 1){
//下面的循环正常循环
for(i=0;i<8;i++){
P1 = leds[i];
delay();
}
}
if(P0_1 == 0){
//反循环
for(i=7;i>=0;i--){
P1 = leds[i];
delay();
}
}
if(P0_3 == 1){
//控制流动时间
delayT = 60000;
}
else{
delayT = 10000;
}
}
}。