当前位置:
文档之家› MCS51单片机输出输入型外设与51的IO口
MCS51单片机输出输入型外设与51的IO口
#include <reg52.h> #include <absacc.h> void main(void) { unsigned int i,j; unsigned char d; d|=(1<<3); while(1) { XBYTE[0x8800]=d; //英特尔总线发送数据 for(i=300;i>0;i--) for(j=2000;j>0;j--); d^=(1<<3); //异或运算取反 } }
继电器
基本原理:低压电控制高压电通断,电磁铁原理。 技术指标:线圈额定电压,触点最大电压、触点最 大电流 继电器HK4100F的线圈额定电压是5V,触点电压、 电流:AC220V/DC30V,3A
相比于蜂鸣器,继电器的工作电流要大很多(蜂鸣器20mA,继电器100mA左右)
继电器应用电路图
#include <reg52.h> #include <absacc.h> sbit LED_BIT=P1^6; void main(void) { unsigned int i,j; LED_BIT=1; P0=0x01; while(1) { for(i=300;i>0;i--) for(j=2000;j>0;j--); P0<<=1; if(P0==0) P0=0X01; } }
#include <reg52.h> #include <absacc.h> sbit LED_BIT=P1^6; void main(void) { unsigned int i,j; LED_BIT=1; while(1) { P0=0xff; for(i=300;i>0;i--) for(j=2000;j>0;j--); P0=0x00; for(i=300;i>0;i--) for(j=2000;j>0;j--); } }
MCS51单片机输出型外设 与51的IO口
LED发光二极管
LED发光二极管应用电路图
例一
闪烁灯
现象:8位流水灯周期性的同时亮灭闪烁。
ORG 0000h JMP start ORG 0030h start: SETB P1.6 ;打开74HC573锁存端L,直通状态 next: MOV P0,#0ffh ;点亮所有LED ACALL delay ;延时 MOV P0,#00h ;熄灭所有LED ACALL delay ;延时 JMP next ;死循环 delay: MOV r2,#0ffh ;延时子程序 next2: MOV r3,#0ffh next1: DJNZ r3,next1 DJNZ r2,next2 RET END
#include <reg52.h> #include <absacc.h> void main(void) { unsigned int i,j; unsigned char d; d|=(1<<2); while(1) { XBYTE[0x8800]=d; //英特尔总线发送数据 for(i=300;i>0;i--) for(j=2000;j>0;j--); d^=(1<<2); //异或运算取反 } }
例
继电器周期性吸合与断开
ORG 0000h JMP start ORG 0030h start: MOV DPTR,#0x8800 ;74HC573外设芯片地址 next: SETB Acc.2 ;控制继电器吸和 MOVX @DPTR,A ;利用英特尔总线向外设74HC573发送数据 ACALL delay ;延时 CLR Acc.2 ;控制继电器释放 MOVX @DPTR,A ACALL delay ;延时 JMP next ;死循环 delay: MOV r2,#0ffh;延时子程序 next2: MOV r3,#0ffh next1: DJNZ r3,next1 DJNZ r2,next2 RET END
例二 1位流水灯 现象:1位发光的LED在8位LED上周期性的循环 响左移位。
ORG 0000h JMP start ORG 0030h start: SETB P1.6 ;打开74HC573锁存端L,直通状态 MOV A,#01h ;初始化 next: MOV P0,A ;点亮最末位LED ACALL delay ;延时 RL A ;循环左移1位 MOV P0,A ACALL delay ;延时 JMP next ;死循环 delay: MOV r2,#0ffh;延时子程序 next2: MOV r3,#0ffh next1: DJNZ r3,next1 DJNZ r2,next2 RET END
#include <reg52.h> #include <absacc.h> sbit KEY=P3^3;//按键检测位定义 void delay10ms(void) { unsigned int i,j; for(i=128;i>0;i--) for(j=10;j>0;j--); } void main(void) { unsigned char d; d|=(1<<3); while(1) { if(KEY==0) //有键按下 { delay10ms(); //消抖 if(KEY==0) //的确真正按下 { while(!KEY); //等待按键释放 XBYTE[0x8800]=d; //英特尔总线向外设写数据驱动蜂鸣器 d^=(1<<3); //改变鸣叫状态 } } } }
MCS51单片机输入型外设 与51的IO口
单个按键
按键抬起:1 按键按下:0
按键应用电路图
按键消抖
为什么要消抖 按 键 按 下 瞬 间 会 产 生 一 段 时 间 的 毛 刺 ( 持 续 10mS左右)然后才稳定的现象,如果不加消抖措 施会在程序中误判为多次按下按键。 通常采取软件消抖的方法,即程序检测到按键按 下后,延时10ms以上再次检测按键状态,如果状 态仍然按下则为一次可靠的按下。
蜂鸣器
有源蜂鸣器
加上电源电压即可发出鸣叫声,消耗电流 20mA左右 MSC51的IO口无法提供大电流,需要用三极 管扩流或采用74HC573等驱动芯片驱动路图
例
蜂鸣器周期性鸣响
ORG 0000h JMP start ORG 0030h start: MOV DPTR,#0x8800 ;74HC573外设芯片地址 next: SETB Acc.3 ;控制蜂鸣器响 MOVX @DPTR,A ;利用英特尔总线向外设74HC573发送数据 ACALL delay ;延时 CLR Acc.3 ;控制蜂鸣器不响 MOVX @DPTR,A ACALL delay ;延时 JMP next ;死循环 delay: MOV r2,#0ffh;延时子程序 next2: MOV r3,#0ffh next1: DJNZ r3,next1 DJNZ r2,next2 RET END
例 按一下S3按键蜂鸣器开始鸣响,再按一下S3则蜂鸣器关闭。
ORG 0000h JMP start ORG 0030h start: MOV DPTR,#0x8800 ;74HC573外设芯片地址 CLR A ;初始化累加器清0 next: SETB P3.3 ;P3准双向口,读之前先写入高电平1 JNB P3.3,HANDLE ;按键S3按下转移处理 HANDLE:ACALL delay ;延时10ms,消抖 JB P3.3,next ;按键S3未真正按下返回 HERE: JNB P3.3,HERE ;按键S3真正按下等待按键抬起 CPL Acc.3 ;控制蜂鸣器切换响与不响 MOVX @DPTR,A ;利用英特尔总线向外设74HC573发送数据 JMP next ;死循环 delay: MOV r2,#40;延时子程序 1us next2: MOV r3,#125 ;1us next1: DJNZ r3,next1 ;(125*2us) DJNZ r2,next2;2us total=1us+(1us+(125*2us)+2us)*40= 10.121ms RET END