单片机应用技术-基于STC15系列单片机 课件 项目3 抢答器的实现_第1页
单片机应用技术-基于STC15系列单片机 课件 项目3 抢答器的实现_第2页
单片机应用技术-基于STC15系列单片机 课件 项目3 抢答器的实现_第3页
单片机应用技术-基于STC15系列单片机 课件 项目3 抢答器的实现_第4页
单片机应用技术-基于STC15系列单片机 课件 项目3 抢答器的实现_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机C语言程序设计项目抢答器的实现抢答器的实现任务目录任务一开关控制LED灯显示任务二数码管显示按键按下次数任务三多路抢答器的实现开关控制LED灯显示任务介绍开关闭合,8个LED灯依次点亮,实现流水灯效果;开关断开,8个LED灯全亮。硬件电路单片机最小系统电路、8个LED灯电路、开关电路软件设计双分支结构实现程序,识别闭合时,实现流水灯;否则,8个LED全部点亮。开关控制LED灯显示1顺序结构程序设计2选择结构程序设计3循环结构程序设计4函数、数组主要内容5按键、数码管顺序结构程序设计AB按照程序中语句书写的顺序从上到下一条一条依次执行概念任务分析首先点亮D1,保持一段时间后,熄灭D1,点亮D2,保持一段时间后,熄灭D2,点亮D3……依次类推,直到点亮D8,然后停止流水灯效果流水灯电路序号名称Proteus中元件名参数数量1单片机STC15W4K32S412LED灯LED-RED

83排阻RX81K1流水灯控制原理端口的控制电平为低,LED灯亮;端口的控制电平为高,LED灯灭端口数据D8D7D6D5D4D3D2D1状态1灭灭灭灭灭灭灭亮端口数据:0XFE11111110状态2灭灭灭灭灭灭亮灭端口数据:0XFD11111101状态3灭灭灭灭灭亮灭灭端口数据:0XFB11111011流水灯程序设计端口数据D8D7D6D5D4D3D2D10xfe灭灭灭灭灭灭灭亮0xfd灭灭灭灭灭灭亮灭0xfb灭灭灭灭灭亮灭灭0xf7灭灭灭灭亮灭灭灭0xef灭灭灭亮灭灭灭灭0xdf灭灭亮灭灭灭灭灭0xbf灭亮灭灭灭灭灭灭0x7f亮灭灭灭灭灭灭灭通过赋值语句分8次将数据依次输出到P1口流水灯程序设计P1=0XFE…………延时P1=0XFD延时voidmain() {P1M0=0X00;P1M1=0X00;while(1){

P1=0xfe;

delay_nms(1000);

P1=0xfd; delay_nms(1000);

P1=0xfb; delay_nms(1000);

P1=0xf7; delay_nms(1000);

P1=0xef; delay_nms(1000);

P1=0xdf; delay_nms(1000);

P1=0xbf; delay_nms(1000);

P1=0x7f; delay_nms(1000); }}主函数赋值语句函数调用语句P1=0X7F延时流水灯工作的原理、设计流程、源程序51单片机顺序结构程序设计的原理和方法小结if语句if–else语句

选择语句选择结构程序设计开关控制灯序号名称Proteus中元件名参数数量1单片机STC15W4K32S412LED灯LED-RED

13排阻RX81K14按键button1选择结构程序设计LED灯开关原理按键按下时,P3.2=0按键松开时,P3.2=1P1=0xFFP1=0x00LED开关程序设计if(表达式)语句语句YN表达式条件:判断P3.2电平的高低状态执行语句:P1输出高低电平LED开关程序设计#include<stc15.h>sbitSW=P3^2voidmain(void){P1M0=0x00;P1M1=0X00;P3M0=0x00;P3M1=0X00;P1=0X00; while(1) { if(SW==0)P1=0xff; if(SW==1)P1=0X00; }}确定灯初始为亮循环判断操作关系运算符==而非赋值运算符=sbitSW=P3^2LED开关程序设计if(表达式)语句1else

语句2P1=0x00P1=0xff高低P3.2语句1语句2真假表达式LED开关程序设计#include<stc15.h>sbitSW=P3^2voidmain(void){P1M0=0x00;P1M1=0X00;P3M0=0x00;P3M1=0X00;P1=0X00; while(1) { if(SW==0)P1=0xff; elseP1=0X00; }}双分支if-else语句LED开关的工作原理51单片机分支结构程序设计小结If语句和if-else语句实现了LED开关国家法律、国家利益、人民利益高于一切。我们不仅要学好专业知识,有高超的专业技术能力,设计出高质量的产品,还要具有强烈的法制意识,高尚的职业道德,良好的技术操守,为我们的国家我们的社会贡献自己的力量。if–elseif-else语句switch语句

选择语句多分支结构程序设计开关控制灯序号名称Proteus中元件名参数数量1单片机STC15W4K32S412LED灯LED-RED

43排阻RX81K14按键button4多分支语句if(表达式1)语句1elseif(表达式2)语句2…………elseif(表达式n)语句nelse语句n+1条件是按键引脚上电平的高低,语句i是LED引脚上输出高低电平LED开关分析要求:4个按键对应4个指示灯,S1按下,仅D1亮,S2按下,仅D2亮,S3按下,仅D3亮,S4按下,仅D4亮,其他情况,灯全灭。LED开关分析要求:4个按键对应4个指示灯,S1按下,仅D1亮,S2按下,仅D2亮,S3按下,仅D3亮,S4按下,仅D4亮,其他情况,灯全灭。(P34==0)&&(P35==1)&&(P36==1)&&(P37==1)(P34==1)&&(P35==0)&&(P36==1)&&(P37==1){D1=0;D2=1;D3=1;D4=1;}{D1=1;D2=0;D3=1;D4=1;}4个LED开关程序设计#defineD1P10#defineD2P11#defineD3P12#defineD4P13#defineS1P34#defineS2P35#defineS3P36#defineS4P37

voidmain(){P1M0=0x00;P1M1=0X00;P3M0=0x00;P3M1=0X00;D1=1;D2=1;D3=1;D4=1;while(1){

if((S1==0)&&(S2==1)&&(S3==1)&&(S4==1)){D1=0;D2=1;D3=1;D4=1;}

elseif((S1==1)&&(S2==0)&&(S3==1)&&(S4==1)){D1=1;D2=0;D3=1;D4=1;} elseif((S1==1)&&(S2==1)&&(S3==0)&&(S4==1)){D1=1;D2=1;D3=0;D4=1;}

elseif((S1==1)&&(S2==1)&&(S3==1)&&(S4==0)){D1=1;D2=1;D3=1;D4=0;}else{D1=1;D2=1;D3=1;D4=1;}}}复合语句关系运算符==逻辑运算符&&多分支语句switch(表达式){case常量表达式1:[语句组1][break;]case常量表达式2:[语句组2][break;]

……

…case常量表达式n:[语句组n][break;][default:语句组n+1]}执行过程:先计算表达式的值,然后依次与每一个case中的常量表达式的值进行比较,若有相等的,则从该case开始依次往下执行,若没有相等的,则从default开始往下执行。条件算法分析(P3^4==0)&&(P3^5==1)&&(P3^6==1)&&(P3^7==1)(P3^4==1)&&(P3^5==0)&&(P3^6==1)&&(P3^7==1)(P3^4==0)&&(P3^5==1)&&(P3^6==1)&&(P3^7==1)(P3^4==1)&&(P3^5==0)&&(P3^6==1)&&(P3^7==1)P3端口:需要保留位“&”上1,不需保留的“&”上0即P3&二进制数11110000即P3&0xf0位与常量值计算P3口P3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.0&0xf011110000S1按下:0xe011100000S2按下:0xd011010000S3按下:0xb010110000S4按下:0x7001110000S1S2S3S4S1S2按下:0xc011000000S1-S4按下:0x00000000004个LED开关程序设计#include<stc15.h>voidmain(void){P1M0=0x00;P1M1=0X00;P3M0=0x00;P3M1=0X00;unsignedcharkey_value=0;while(1){ key_value=P3&0xf0;switch(key_value){ case0xe0:P1=0xfe;break;//点亮D1 case0xd0:P1=0xfd;break;//点亮D2 case0xb0:P1=0xfb;break;//点亮D3 case0x70:P1=0xf7;break;//点亮D4default:P1=0xff;//否则灭灯} } }存放开关S4~S1的状态if-elseif-else语句实现了4路开关LED51单片机多分支结构程序设计小结switch语句实现了4路开关LED#include<stc15.h>voidmain(void){P1M0=0x00;P1M1=0X00;P3M0=0x00;P3M1=0X00;unsignedcharkey_value=0;while(1){ key_value=P3&0xf0;switch(key_value){ case0xe0:P1=0xfe;break;//点亮D1 case0xd0:P1=0xfd;break;//点亮D2 case0xb0:P1=0xfb;break;//点亮D3 case0x70:P1=0xf7;break;//点亮D4default:P1=0xff;} } }while(1)无限循环实例循环结构程序设计1while语句2do-while语句

3for语句

循环语句循环结构程序设计while(表达式){

循环体语句}循环体真假表达式voidmain(void){P1M0=0x00;P1M1=0X00;P3M0=0x00;P3M1=0X00;unsignedcharkey_value=0;while(1){ key_value=P3&0xf0;switch(key_value){ case0xe0:P1=0xfe;break; case0xd0:P1=0xfd;break; case0xb0:P1=0xfb;break; case0x70:P1=0xf7;break;default:P1=0xff;} } }循环结构程序设计do{

循环体语句}while(表达式);voidmain(void){P1M0=0x00;P1M1=0X00;P3M0=0x00;P3M1=0X00;unsignedcharkey_value=0;

do{ key_value=P3&0xf0;switch(key_value){ case0xe0:P1=0xfe;break; case0xd0:P1=0xfd;break; case0xb0:P1=0xfb;break; case0x70:P1=0xf7;break;default:P1=0xff;} }while(1);

}循环结构之延时函数/*延时函数*/voiddelay_ms(unsignedintms){unsignedinti;

do{ i=MAIN_Fosc/13000;

while(--i);}while(--ms);}#defineMAIN_Fosc 11059200L //定义主时钟循环执行i次空操作“;”循环次数i值的计算i是估算值,时间不精准for语句for(表达式1;表达式2;表达式3){

循环体语句}YN

表达式2

表达式3

表达式1

循环体for(i=0;i<10;i++){

循环体语句}voiddelay_ms(unsignedintms){;;;;}voidmain() {

P1=0xfe;

delay(20000);

P1=0xfd; delay(20000);

P1=0xfb; delay(20000);

P1=0xf7; delay(20000);

P1=0xef; delay(20000);

P1=0xdf; delay(20000);

P1=0xbf; delay(20000);

P1=0x7f; delay(20000);

while(1); //结束}流水灯程序顺序结构顺序结构循环结构设计流水灯程序8次P1=0XFE…………延时1秒P1=0XFD延时1秒P1=0X7F延时1秒P1=常数1…………延时1秒P1=常数2延时1秒P1=常数8延时1秒过程不变数据在变数据变量算法表示循环结构设计流水灯程序“<<”运算端口数据1D7D6D5D4D3D2D10xfe111111100xfd111111010xfb111110110xf7111101110xef111011110xdf110111110xbf101111110x7f011111111111111011111100<<111111101+111111010<<111111011+1led=(led<<1)+1;循环结构设计流水灯程序8次P1=常数1…………延时1秒P1=常数2延时1秒P1=常数8延时1秒满8次吗否是循环体语句组:P1=led;延时Led=(led<<1)+1;变量led赋初始值0xfe循环结构设计流水灯程序voidmain() {unsignedchar i,led;P1M0=0x00;P1M1=0X00;while(1){

led=0xfe;

for(i=0;i<8;i++) { P1=led; delay_ms(1000); led=led<<1; led=led+1;

}}}外循环体内循环体满8次?否是循环体语句组:P1=led;延时Led=(led<<1)+1;变量赋初始值循环结构之流水灯程序小结初始化循环控制循环体100%循环结构程序设计鲁迅先生说:伟大的成绩和辛勤劳动是成正比例的,有一分劳动,就有一分收获,日积月累,从少到多,奇迹就可以创造出来。voidmain() {unsigned

chari,led;

P1M0=0x00;P1M1=0X00;while(1){ led=0xfe; for(i=0;i<8;i++) {P1=led; delay(1000); led=led<<1; led=led+1;

}}}实例任务循环结构实现流水灯库函数标准库函数是由C51编译器提供的,用户可以直接调用,以头文件的形式给出//STC15.HsfrP0=0x80;sbitP00=P0^0;sbitP01=P0^1;sbitP02=P0^2;sbitP03=P0^3;sbitP04=P0^4;sbitP05=P0^5;sbitP06=P0^6;sbitP07=P0^7;intrins.h库函数Intrins.h功能_cror_(v,n)将字符型数据向右环移若干位_crol_(v,n)将字符型数据向左环移若干位_iror_(v,n)将整形型数据向右环移若干位_irol_(v,n)将整形型数据向左环移若干位_lror_(v,n)将长整形型数据向右环移若干位_lrol_(v,n)将长整形型数据向左环移若干位_nop_()空操作,相当于汇编语言中的NOPv为变量,n为移位的位数环移函数_crol_(led,1)环移是指数据在内部进行循环移位,最高位和最低位不会丢弃也不会填01111111011111101

voidmain() {P1M0=0x00;P1M1=0X00;unsignedchar i,led;while(1){

led=0xfe;

for(i=0;i<8;i++)

{

P1=led;

delay_ms(1000); led=led<<1;led=led+1;} }}voidmain() {P1M0=0x00;P1M1=0X00;unsignedcharled;led=0xfe;while(1){

P1=led; delay_ms(1000); led=_crol_(led,1);}}库函数intrins.h库函数中的移位操作函数小结用库函数中的环移函数设计了流水灯程序函数定义和调用

自定义函数是用户根据需要自行编写的函数,它必须先定义再调用。voiddelay_ms(unsignedintms){unsignedinti;

do{ i=MAIN_Fosc/13000; while(--i);}while(--ms);}voidmain() {P1M0=0x00;P1M1=0X00;unsignedchari,led;led=0xfe;while(1){ P1=led; delay_nms(1000); led=_crol_(led,1);}}函数调用函数定义自定义函数voiddelay_ms(unsignedintms){unsignedinti;do{ i=MAIN_Fosc/13000; while(--i);}while(--ms);}函数类型函数名(形式参数表){局部变量定义函数体语句return表达式;}自定义函数voidmove_left(unsignedcharval){unsignedchari;P1=val;for(i=0;i<8;i++) { delay_ms(1000); P1=_crol_(P1,1); }}voidmain(void){P1M0=0x00;P1M1=0X00;unsignedcharled;while(1){ led=0xfe;move_left(led);led=0x7f;move_right(led);}}设计2个函数,函数功能是分别是流水灯D1~D8逐个移动和D8~D1逐个移动,在主函数中调用函数,实现流水灯正反向反复流动。voidmove_right(unsignedcharval){unsignedchari;P1=val;for(i=0;i<8;i++) { delay_ms(1000); P1=_cror_(P1,1); }}voidmain() {P1M0=0x00;P1M1=0X00;unsigned char led;led=0xfe;while(1){ P1=led; delay_ms(1000); led=_crol_(led,1);}}}数组数组端口数据D8D7D6D5D4D3D2D1D2亮:0xfd11111101D8亮:0x7f01111111D7亮:0xbf10111111D4亮:0xf711110111D5亮:0xef11101111D6亮:0xdf11011111D1亮:0xfe11111110D3亮:0xfb11111011霓虹灯:依次点亮D2D8D7D4D5D6D1D3数据变化无规律,无法用算法表示数据霓虹灯数据数组voidmain() //主函数{P1M0=0x00;P1M1=0X00;

while(1)//无限循环

{ P1=0xfd;

delay_ms(1000);

P1=0x7f;

delay_ms(1000);

P1=0xbf;

delay_ms(1000);

P1=0xf7;

delay_ms(1000);

P1=0xef;

delay_ms(1000);

P1=0xdf;

delay_ms(1000);

P1=0xfe;

delay_ms(1000);

P1=0xfb;

delay_ms(1000); }}

led0led1led7ledilediledi霓虹灯:依次点亮D2D8D7D4D5D6D1D3霓虹灯程序分析数组的使用100%相同类型的数据才能组成数组,不同类型的数据不能构成数组,同一数组中的每个数据称为数组元素数组一般定义格式为:类型数组名[常量表达式];

unsignedcharled[8];可以通过使用下标led[i]来引用这些元素一维数组初始化unsignedcharled[8]={0xfd,0x7f,0xbf,0xf7,0xef,0xdf,0xfe,0xfb}数组的使用123数组#include<stc15.h>voidmain()

{P1M0=0x00;P1M1=0X00;unsignedcharled[8]={0xfd,0x7f,0xbf,0xf7,0xef,0xdf,0xfe,0xfb};//数组的定义和初始化unsignedchari;

while(1) //主(外)循环 { for(i=0;i<8;i++)//内循环 { P1=led[i]; //数组元素引用 delay_ms(1000); } }}主(外)循环循环次数+1送数组元素延时1s

8次到?YN数组初始化霓虹灯控制程序设计库函数#include<stc15.h>codeunsignedcharled[8]={0xfd,0x7f,0xbf,0xf7,0xef,0xdf,0xfe,0xfb};//数组定义在程序存储区voidmain()

{P1M0=0x00;P1M1=0X00;unsignedchari;

while(1) //主(外)循环 { for(i=0;i<8;i++)//内循环 { P1=led[i];//数组元素引用 delay_ms(1000); } }}数组定义在代码区使用数组设计循环结构霓虹灯程序数组优化程序设计的方法小结项目抢答器的实现抢答器的实现任务目录任务一开关控制LED灯显示任务二数码管显示按键按下次数任务三多路抢答器的实现项目任务实现1位共阳极数码管显示按键按下次数序号名称Proteus中元件名参数数量1单片机STC15W4K32S412LED数码管7seg-com-anode13排阻RX847014按键button1数码管显示按键按下次数1数码管2独立按键主要内容数组数码管的应用数码管的分类数码管的外观和引脚数码管的内部结构abcdefgCOM共阳极bcadefgCOM共阴极数码管的内部电路及公共端控制共阳极共阴极VCCGND数码管电路设计在共阳极数码管上循环显示数字0~9电路设计序号名称Proteus中元件名参数数量1单片机STC15W4K32S412LED数码管7seg-com-anode

13排阻RX84701数码管电路设计在共阳极数码管上循环显示数字0~9电路设计数码管为共阳管,公共端接电源;受控端a~g采用低电平点亮数码管,通过限流电阻连接到单片机P0口;阻值越大,电流越小,数码管点亮时越暗,阻值越小,电流越大,数码管点亮时越亮,但阻值过小,会导致P0口的总负载电流过大数码管显示原理dpgfedcba11000000字形码0XC0111110010XF9端口的控制电平为低,LED灯亮;端口的控制电平为高,LED灯灭数码管字形码显示字符共阴字形码共阳字形码显示字符共阴字形码共阳字形码03FHC0H96FH90H106HF9HA77H88H25BHA4HB7CH83H34FHB0HC39HC6H466H99HD5EHA1H56DH92HE79H86H67DH82HF71H8EH707HF8HP73H8CH87FH80H“灭”00HFFH数码管显示控制原理显示数字共阳极共阴极0C03F1F9062A45B3B04F499665926D6827D7F8078807F9906F共阳数码管,如果要显示“0”,单片机只要给连接到受控端的并口输出0XC0,如果要显示“1”,给并口输出0XF9,以此类推;共阴数码管,如果要显示“0”,单片机只要给连接到受控端的并口输出0X3F,如果要显示“1”,给并口输出0X06,以此类推;单片机只要将字形码输出到并口,数码管就会显示字形码对应的字符程序控制原理数码管静态显示程序设计voidmain() {P0M0=0x00;P0M1=0X00;while(1)

{P0=0xc0; delay_ms(1000);

P0=0xf9; delay_ms(1000);

P0=0xa4; delay_ms(1000);

P0=0xb0; delay_ms(1000);

P0=0x99; delay_ms(1000);

P0=0x92; delay_ms(1000);

P0=0x82; delay_ms(1000);

P0=0xf8; delay_ms(1000);

P0=0x80; delay_ms(1000);

P0=0x90; delay_ms(1000);}}设计程序:在共阳极数码管上循环显示数字0~9P0=0XC0…………延时1秒P0=0XF9延时1秒P0=0X90延时1秒将字形码定义成一个数组,优化程序数组#include<stc15.h>voiddelay_ms(unsignedintms);#defineMAIN_Fosc11059200L unsignedcharsegtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};voidmain(void)

{unsignedchari=0;

P0M0=0x00;P0M1=0X00;

while(1) //主(外)循环{for(i=0;i<10;i++)//内循环{P0=segtab[i];//数组元素引用delay_ms(1000);}}}主(外)循环循环次数+1送数组元素延时1s

循环10次?YN数组初始化数码管静态显示程序设计数码管外部引脚、内部电路及显示原理小结共阳码和共阴码设计静态显示电路和控制程序,实现了循环显示0~9数码管显示按键按下次数——按键库函数抢答器——按键的使用库函数按键按键分类什么是按键编码键盘

非编码键盘

矩阵键盘键盘上按键的识别由专用的硬件编码器实现,并产生键值。如:普通的PC键盘(PS2接口、USB接口)。需要靠软件编程来识别按键的称为非编码键盘,在单片机组成的各种系统中,用的最多。独立按键按键:又称按钮开关,是嵌入式系统中常见的一种人机交互输入设备。分类什么是按键ABCD

AD引脚内部连通BC引脚内部连通按键与单片机的连接序号名称Proteus中元件名参数数量1单片机STC15W4K32S412按键button4按键测试按键用作开关:在proteus中编程实现按键按下,P1.0连接灯亮,按键弹起来,灯灭;按键测试:在proteus中编程实现按键按下一次,P1.0连接灯状态切换一次。按键的识别P3.2引脚电平状态思考:如何判断按键是否按下一次?机械式按键按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,不能马上稳定地接通或断开,最终由于机械在过渡时的不稳定会以电信号抖动的形式体现出来。

按键实际波形:机械式按键机械式按键抖动时间:长短由按键的机械特性决定,一般为5ms~10ms;按键按下:一般为20ms按键按下时的电平变化:干扰、噪声:去抖方法如何消抖:(1)硬件消抖

RS触发器:常用并联电容法:利用电容的的硬件去抖。

放电延时,实现硬件消抖。

去抖方法如何消抖:(2)软件消抖

软件消抖的方法:检测出键闭合后执行一个延时程序(10ms左右的延时),等待抖动消失后再检测一次键的状态,如果仍然保持闭合状态,则确认为真正有键按下。

5-10ms20ms10ms独立式按键电路设计开始按键是否按下延时去抖按键是否按下执行按键功能按键是否释放按键测试:在proteus中编程实现按键按下一次,P1.0连接灯状态切换次。YNYYNN20ms独立式按键电路设计开始按键是否按下延时去抖按键是否按下执行按键功能按键是否释放按键测试:在proteus中编程实现按键按下一次,P1.0连接灯状态切换次。YNYYNN20ms机械式按键内容拓展:1.如何优化软件去抖部分10ms的延时程序段;2.是否需要后延去抖;3.如何识别按键双击;

期待你的解决思路或者效果展示!统计按键次数,显示在单个数码管上,按键次数不超过9次独立式按键电路设计序号名称Proteus中元件名参数数量1单片机STC15W4K32S4127段共阳数码管7seg-com-anode

13排阻RX847014按键button1独立式按键判别处理流程P3.2==0?NP3.2==0?YNY延时几个ms去抖P3.2==0?NY次数+1,显示退出按键状态判别:判到按下,软件消抖;确认按键按下的处理;按键松开判别次数超9,清0数码管显示按键次数程序sbitKEY=P3^2;unsignedcharcodesegtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0xff};voidmain(void){unsignedcharnum=0;//统计按键次数的变量P0M0=0x00;P0M1=0X00;P3M0&=~0X04;P3M1&=~0X04;P0=segtab[0];//数码管初始显示0while(1){if(KEY==0)//按键引脚电平是否为0,为0,有可能有按键按下{delay_ms(10);//去抖动if(KEY==0)//再次判断按键引脚电平是否为0,为0,有按键按下 {num++;if(num>9)num=0; }while(KEY==0); //等待按键释放

}P0=segtab[num];}}4个按键,在单个数码管上,显示按键号按键电路设计4个按键判别处理方法是否有任意按键按下;有键按下,延时消抖;确认键号,按键处理;等待该键松开保留位”&1”,其他位”&0”即P3&二进制数11110000即P3&0xf0位与P3&0xf0P3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.0无键按下:0xf011110000S1按下:0xe011100000S2按下:0xd011010000S3按下:0xb010110000S2按下:0x70011100004个按键判别处理流程P3&0xf0=0xf0?NNYY延时10msYY显示”1”退出P3&0xf0=0xf0?P3&0xf0=0xf0?显示”2”显示”3”显示”4”N0xe00xd00xb00x70显示按键号程序unsignedcharcodesegtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0xff};voidmain(){P0M0=0x00;P0M1=0X00;P3M0&=~0X04;P3M1&=~0X04;P0=0xff;while(1) {if((P3&0xf0)!=0xf0)//高4位不为f,有键按下 {delay_ms(10);//去抖动 if((P3&0xf0)!=0xf0)//高4位不为f,有键按下 {switch(P3&0xf0) {case0xe0:P0=segtab[1];break;//1号键 case0xd0:P0=segtab[2];break;//2号键 case0xb0:P0=segtab[3];break;//3号键

case0x70:P0=segtab[4];break;//4号键

default:P0=0xff;};//无键 } while((P3&0xf0)!=0xf0);//等待释放 } }}按键的去抖原理小结独立式按键的电路设计和判别处理实现了用一位数码管显示按键次数和按键号谢谢观看!项目抢答器的实现抢答器的实现任务目录任务一开关控制LED灯显示任务二数码管显示按键按下次数任务三多路抢答器的实现抢答器的实现主持人有一个开始抢答命令按键任务功能3个选手各有一个抢答按键当主持人按下开始按键后,数码管显示“P”,允许选手开始抢答,否则抢答无效;某选手按下对应的按键后,数码管显示选手号,蜂鸣器鸣叫一段时间,此时其他选手不允许抢答;当主持人重新按下对应的按键后,上述动作继续主裁判点评在抢答的任意环节,主裁判可打断进行点评;点评后,恢复打断前的状态选手裁判主持抢答器硬件电路设计序号名称Proteus中元件名参数数量1单片机STC15W4K32S4127段共阳数码管7seg-com-anode

13排阻RX847014按键button55蜂鸣器buzzer16三极管PNP17电阻RES22018发光二极管LED8蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,根据使用方式分为:无源蜂鸣器:内驱动部无震荡源,需要2KHZ-5KHZ的方波信号驱动有源蜂鸣器:内带震荡源,接入额定的电源电压驱动无源蜂鸣器:内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。优点是:1.便宜2.声音频率可控,可以做出“多来米发索拉西”的效果。(a)有源蜂鸣器(b)无源蜂鸣器蜂鸣器蜂鸣器的工作电流在30mA左右,单片机的I/O口输出电流:拉电流:<1mA灌电流:10mA单片机的I/O口不足以驱动蜂鸣器,需要接驱动电路。蜂鸣器sbitBUZZER=P3^6; voidmain() {

while(1) {

BUZZER=0;delay_ms(500);

BUZZER=1;delay_ms(500);} }抢答器的实现主持人有一个开始抢答命令按键任务功能3个选手各有一个抢答按键当主持人按下开始按键后,数码管显示“P”,允许选手开始抢答,否则抢答无效;某选手按下对应的按键后,数码管显示选手号,蜂鸣器鸣叫一段时间,此时其他选手不允许抢答;当主持人重新按下对应的按键后,上述动作继续主裁判点评在抢答的任意环节,主裁判可打断进行点评;点评后,恢复打断前的状态选手裁判主持抢答器软件程序设计循环内有2个函数,一个是判主持人是否按下开始键的函数chairman_scan();一个是判选手是否按下抢答键的函数player_scan();chairman_scan()给出主持人是否按下的标识,根据该标识来确定是否执行player_scan()Y初始化state=1?Nplayer_scan()chairman_scan()程序主函数bitstate=0;//初始状态不允许抢答voidmain(void){IO_Init();P0=0xff;//关数码管state=0;//初始状态不允许抢答while(1){ chairman_scan(); //扫描主持人按键if(state==1){ player_scan(); //扫描选手按键

}}}主持人按键函数sbitCHAIRMAN=P3^1;voidchairman_scan()//主持人扫描函数定义{ if(CHAIRMAN==0) { delay_ms(10);//去抖动

if(CHAIRMAN==0) { state=1; P0=0x8c; //显示"P",表示开始抢答

}while(CHAIRMAN==0); //等待按键释放 }}P3&0x38=0x38?NNYY延时几个msYY显示”1”退出P3&0x38=0x38?P3&0x38=0x38?显示”2”显示”3”关闭显示N0x300x280x18其他选手按键函数增加state=0;增加beep();选手按键函数

voidplayer_scan(){if((P3&0x38)!=0x38) {delay_ms(10);//去抖动 if((P3&0x38)!=0x38) {switch(P3&0x38){ case0x30:P0=segtab[1];P1=~0x01;break; case0x28:P0=segtab[2];P1=~0x02;break;case0x18:P0=segtab[3];P1=~0x04;break;default:P0=0xff;P1=0xff;} state=0;beep();//声音提示

while((P3&0x38)!=0x38); //等待按键释放}

}}蜂鸣器鸣叫函数sbitBUZZER=P3^6;voidbeep(){unsignedchari;for(i=0;i<200;i++)//产生200个周期为1ms左右的方波

{delay_ms(1);//延时1ms

BUZZER=~BUZZER;//产生方波

}}IO初始化voidIO_Init(){P0M0=0x00;P0M1=0x00;//设置P0工作于准双向口模式P1M0=0x00;P1M1=0x00;//设置P1工作于准双向口模式P3M0=0x00;P3M1=0x00;//设置P3工作于准双向口模式}抢答器的实现主持人有一个开始抢答命令按键任务功能3个选手各有一个抢答按键当主持人按下开始按键后,数码管显示“P”,允许选手开始抢答,否则抢答无效;某选手按下对应的按键后,数码管显示选手号,蜂鸣器鸣叫一段时间,此时其他选手不允许抢答;当主持人重新按下对应的按键后,上述动作继续主裁判点评在抢答的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论