拨码开关控制实验电路

拨码开关控制实验电路
拨码开关控制实验电路

拨码开关控制实验电路图

流程图

/* 基本开关控制实验 */

//==宣告区=================================

#include //定义8051头文件,引入reg52.h

#define SW P2//定义开关接至P2

#define LED P1//定义LED接至P 1

//==主程式=================================

main()//主程序开始

{ SW=0xff;//规划输入端口

while(1)//无穷循环,程式一直跑

LED=SW;//读取开关(P2)状态,输出到LED(P1)

}//主程序结束

思考一下!

在本实验里,有没有“抖动”的困扰?

若希望拨码开关中的S1、S3、S5三个开关都on,则前四个LED 亮;S2 或 S4 或 S6开关 on,则后四个LED 亮;S7及 S8 开关 on,则所有LED全亮,程序应如何编写?

若将拨码开关换成一般家里墙壁上的开关,而LED换成继电器(RELAY),是否可作为家里的负载控制?

按钮ON-OFF控制实验

按钮 ON-OFF 控制实验电路图

流程图如下:

/* 基本按钮 ON-OFF控制实验 */

//==声明区======================================= #include//定义8051头文件,引入reg52.h sbit PB1=P2^0;//声明按钮1接至P2.0

sbit PB2=P2^1;//声明按钮2接至P2.1

sbit LED=P1^0;//声明LED为P1.0

//==主程式======================================= main()//主程序开始

{ LED=1;//关闭LED

PB1=PB2=1;//规划输入端口

while(1)//无穷循环,程式一直跑

{

if (PB2==0)

LED=1;//若按下PB2,则关闭LED

else if (PB1==0)

LED=0;//若按下PB1,则点亮LED

}//while循环结束

}//结束程序

思考一下!

在本实验里,有没有“抖动”的困扰?

若将按钮开关当成启动电机的 ON-OFF开关,而 LED换成继电器(RELAY),是否可作为电机控制?

若同时按下 PB1 与 PB2按钮会怎样?

按钮切换式控制实验

按钮切换式控制实验电路图

流程图

实验代码:

/* 按钮切换式控制实验 */

//==声明区===================================== #include//定义8051头文件,引入reg52.h sbit PB1=P2^0;//声明PB1接至P2.0

sbit LED=P1^0;//声明LED接至P1.0

void debouncer(void);//声明防弹跳函数

//==主程序===================================== main()//主程式开始

{ LED=1;//关闭LED

PB1=1;//规划P2.0为输入埠

while(1)//无穷循环,程序一直跑

{ if (PB1==0)//若按下PB1

{ debouncer();//呼叫防弹跳函数(按下时)

LED=!LED;//切换LED为反相

while(PB1 != 1);//若仍按住PB1,继续等

debouncer();//呼叫防弹跳函数(放开时)

}//if叙述结束

}//while循环结束

}//主程序结束

//==子程序=====================================

/* 防弹跳函数函数,延迟约20ms */

void debouncer(void)//防弹跳函数开始

{ int i;//声明整数变数i

for(i=0;i<2400;i++);//计数2400次,延迟约20ms

}//防弹跳函数结束

思考一下!

在本实验里,改变 debouncer函数的时间长短,看看有什么影响?

若按住 PB1不放会怎样?如何改善?

按钮开关应用电路图

流程图

代码如下:

/* 按钮开关应用(两按钮控制七段显示器上下数) */

//==声明区==========================================

#include//定义8051头文件,引入reg52.h文件

#define SEG P0//定义七节显示器接至P0端口

/* 声明七节显示器驱动信号阵列(共阳) */

char code

TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98} ;//数字0-9

sbit PB1=P2^0;//声明按钮1接至P2.0

sbit PB2=P2^1;//声明按钮2接至P2.1

void debouncer(void);//声明防弹跳函数

//==主程式=================================

main()//主程序开始

{ unsigned char i=0;//声明变量i初值=0

PB1=PB2=1;//规划输入端口

SEG=TAB[i];//输出数字至七段显示器

while(1)//无穷循环,程式一直跑

{ if (PB1==0)//判断PB1是否按下

{ debouncer();//呼叫防弹跳函数

i= (i<9)? i+1:0;//若i<9则i=i+1,若i>=9清除为0

SEG=TAB[i]; //输出数字至七段显示器

while(PB1==0); //PB1是否按住?

debouncer(); //呼叫防弹跳函数

}//if叙述结束

if (PB2==0)//判断PB2是否按下

{ debouncer();//呼叫防弹跳函数

i= (i>0)? i-1:9;//若i>0则i=i-1,i<=0重设为9

SEG=TAB[i];//输出数字至七段显示器

while(PB2==0);//PB1是否按住?

debouncer();//呼叫防弹跳函数

}//if叙述结束

}//while循环结束

}//主程序结束

//==子程序==================================

/* 防弹跳函数函数,延迟约20ms */

void debouncer(void)//防弹跳函数开始

{ int i;//声明整数变量i

for(i=0;i<2400;i++);//计数2400次,延迟约20ms

}//防弹跳函数结束

思考一下!

在本实验里,若按钮按住不放,会怎样?如何改善?

在本实验里,若 PB1与 PB2两个按钮同时按,会怎样?

BCD数字型拨码开关实验

BCD数字型拨码开关实验电路图

流程图

实验代码:

/* BCD数字型指拨开关实验 */

//==声明区======================================

#include//定义8051头文件,引入reg52.h文件

#define SEG P0//定义七节显示器接至P0

#define SW P2//定义开关接至P2

/* 声明七节显示器驱动信号阵列(共阳) */

char code

TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98} ;//数字0-9

#define SW_H() SW&0x0f//读取开关值(P2清除高4bits)

//==主程序======================================

main()//主程序开始

{ SW=0xff;//规划输入埠

while(1)//无穷循环,程序一直跑

SEG=TAB[SW_H()];//读取开关值,输出至七节显示器(P0)

}//主程序结束

思考一下!

在本实验里,有没有“抖动”的困扰?

若把本单元的BCD数字型拨码开关,改为16进位数字型拨码开关,程序应如何修改?

多重按钮开关实验

多重按钮开关实验电路图

流程图

相关主题
相关文档
最新文档