拨码开关控制实验电路图流程图/* 基本开关控制实验 *///==宣告区=================================#include <reg51.h> //定义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<reg51.h>//定义8051头文件,引入reg52.h sbit PB1=P2^0;//声明按钮1接至P2.0sbit PB2=P2^1;//声明按钮2接至P2.1sbit LED=P1^0;//声明LED为P1.0//==主程式======================================= main()//主程序开始{ LED=1;//关闭LEDPB1=PB2=1;//规划输入端口while(1)//无穷循环,程式一直跑{if (PB2==0)LED=1;//若按下PB2,则关闭LEDelse if (PB1==0)LED=0;//若按下PB1,则点亮LED}//while循环结束}//结束程序思考一下!在本实验里,有没有“抖动”的困扰?若将按钮开关当成启动电机的 ON-OFF开关,而 LED换成继电器(RELAY),是否可作为电机控制?若同时按下 PB1 与 PB2按钮会怎样?按钮切换式控制实验按钮切换式控制实验电路图流程图实验代码:/* 按钮切换式控制实验 *///==声明区===================================== #include<reg51.h>//定义8051头文件,引入reg52.h sbit PB1=P2^0;//声明PB1接至P2.0sbit LED=P1^0;//声明LED接至P1.0void debouncer(void);//声明防弹跳函数//==主程序===================================== main()//主程式开始{ LED=1;//关闭LEDPB1=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;//声明整数变数ifor(i=0;i<2400;i++);//计数2400次,延迟约20ms}//防弹跳函数结束思考一下!在本实验里,改变 debouncer函数的时间长短,看看有什么影响?若按住 PB1不放会怎样?如何改善?按钮开关应用电路图流程图代码如下:/* 按钮开关应用(两按钮控制七段显示器上下数) *///==声明区==========================================#include<reg51.h>//定义8051头文件,引入reg52.h文件#define SEG P0//定义七节显示器接至P0端口/* 声明七节显示器驱动信号阵列(共阳) */char codeTAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98} ;//数字0-9sbit PB1=P2^0;//声明按钮1接至P2.0sbit PB2=P2^1;//声明按钮2接至P2.1void debouncer(void);//声明防弹跳函数//==主程式=================================main()//主程序开始{ unsigned char i=0;//声明变量i初值=0PB1=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清除为0SEG=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重设为9SEG=TAB[i];//输出数字至七段显示器while(PB2==0);//PB1是否按住?debouncer();//呼叫防弹跳函数}//if叙述结束}//while循环结束}//主程序结束//==子程序==================================/* 防弹跳函数函数,延迟约20ms */void debouncer(void)//防弹跳函数开始{ int i;//声明整数变量ifor(i=0;i<2400;i++);//计数2400次,延迟约20ms}//防弹跳函数结束思考一下!在本实验里,若按钮按住不放,会怎样?如何改善?在本实验里,若 PB1与 PB2两个按钮同时按,会怎样?BCD数字型拨码开关实验BCD数字型拨码开关实验电路图流程图实验代码:/* BCD数字型指拨开关实验 *///==声明区======================================#include<reg51.h>//定义8051头文件,引入reg52.h文件#define SEG P0//定义七节显示器接至P0#define SW P2//定义开关接至P2/* 声明七节显示器驱动信号阵列(共阳) */char codeTAB[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进位数字型拨码开关,程序应如何修改?多重按钮开关实验多重按钮开关实验电路图流程图实验中的自编库函数/* myio.h自己写的程序库 *///==声明区============================== #define LED P1//定义LED接至P1void debouncer(void);//声明防弹跳函数void delay10ms(int);//声明10毫秒延迟函数void alter(int);//声明交互闪烁函数void left(int);//声明单灯左移函数void right(int);//声明单灯右移函数void pili(int); //声明霹雳灯函数void flash(int);//声明闪烁函数//==自己写的子程序========================/* 防弹跳函数函数,延迟约20ms */void debouncer(void)//防弹跳函数开始{ delay10ms(2);//延迟约20ms}//防弹跳函数结束/* 延迟函数开始,延迟约x 10ms */void delay10ms(int x)//延迟函数开始{ int i,j;//声明整数变量i,jfor (i=0;i<x;i++)//计数x次,延迟约x 10msfor (j=0;j<1200;j++);//计数1200次,延迟约10ms }//延迟函数结束/* 高低位元交互闪烁函数,执行x次 */void alter(int x)//高低位元交互闪烁函数开始{ int i;//声明变量iLED=0x0f;//初始状态(高位元亮,低位元灭)for(i=0;i<2*x-1;i++)//i变量for循环执行2x-1次{ delay10ms(50);//延迟50*10m=0.5sLED=~LED;//LED反相输出}//i变量for循环结束delay10ms(50);//延迟50 10m=0.5s}//高低位元交互闪烁函数结束/* 全灯闪烁函数,执行x次 */void flash(int x)//全灯闪烁函数开始{ int i;//声明变量iLED=0x00;//初始状态(全亮)for(i=0;i<2*x-1;i++)//i变量for循环执行2x-1次{ delay10ms(50);//延迟50 10m=0.5sLED=~LED;//P0反相输出}//i变量for循环结束delay10ms(50);//延迟50 10m=0.5s}//全灯闪烁函数结束/* 单灯左移函数,执行x圈 */void left(int x)//单灯左移函数开始{ int i, j;//声明变量i,jfor(i=0;i<x;i++)//i循环,执行x圈{ LED=0xfe;//初始状态=1111 1110for(j=0;j<7;j++)//j循环,左移7次{ delay10ms(25);//延迟25 10m=0.25sLED=(LED<<1)|0x01;//左移1位後,LSB设为1 }//j循环结束delay10ms(25);//延迟25 10m=0.25s}//i循环结束*/}//单灯左移函数结束/* 单灯右移函数,执行x圈 */void right(int x)//单灯右移函数开始{ int i, j;//声明变量i,jfor(i=0;i<x;i++)//i循环,执行x圈{ LED=0X7f;//初始状态=0111 1111for(j=0;j<7;j++)//j循环,右移7次{ delay10ms(25);//延迟25 10m=0.25sLED=(LED>>1)|0x80;//左移1位後,MSB设为1 }//j循环结束delay10ms(25);//延迟25 10m=0.25s}//i循环结束}//单灯左移函数结束/* 霹雳灯函数,执行x圈 */void pili(int x)//霹雳灯函数开始{ int i;//声明变量ifor(i=0;i<x;i++)//i循环,执行x圈{ left(1);//单灯左移一圈right(1);//单灯左移一圈}//i循环结束}//霹雳灯函数结束多重按钮开关实验之一:代码/* 多重按钮开关实验之1 *///==声明区================================#include<reg52.h>//定义8051头文件,引入reg52.h文件#include"myio.h"//自己写的I/O程序库sbit PB1=P2^0;//声明PB1=P2.0sbit PB2=P2^1;//声明PB2=P2.1sbit PB3=P2^2;//声明PB3=P2.2sbit PB4=P2^3;//声明PB4=P2.3//==主程序================================ main()//主程序开始{ LED=0xff;//初始状态(LED全灭)P2=0xff;//规划P2输入端口while(1)//无穷循环,程序一直跑{ if (PB1==0)//如果按下PB1{ debouncer();//防弹跳alter(3);//高低位元交互闪烁三次flash(3);}//全灯闪烁三次else if (PB2==0)//如果按下PB2{ debouncer();//防弹跳left(3);//单灯左移三圈flash(3);}//全灯闪烁三次else if (PB3==0)//如果按下PB3{ debouncer();//防弹跳right(3);//单灯右移三圈flash(3);}//全灯闪烁三次else if (PB4==0)//如果按下PB4{ debouncer();//防弹跳pili(3);//霹雳灯三圈flash(3);}//全灯闪烁三次}//while循环结束}//主程序结束思考一下!在本实验里,若同时按下多个按钮会如何?在本实验里,若按住按钮不放会如何?在本实验里,其中debouncer函数是个延迟20毫秒的函数,而delay10ms函数是个延迟 10毫秒的函数,可否使用delay10ms 函数取代 debouncer函数?如何修改?在本实验里,其中alter函数是个高四位与低四位交替闪烁的函数,而flash函数是个8灯闪烁的函数,其不同在于其初始值。