导航:首页 > 操作系统 > 单片机多功能按键

单片机多功能按键

发布时间:2022-12-09 13:08:07

⑴ 求教单片机一键多功能的问题,简单来说是:在已经进入子程序中,当按键按下,又再次进入另一个子程序

问题主要有两个:
1,“CHULI”这段指令只能执行一次
原因:也就是说,程序上电复位后,执行到ZERO循环,之后一直在这里循环,无法执行CHULI;
解决:将所有跳转到数字(如:ZERO、ONE、...、NINE)的跳转指令改为跳转到CHULI;保证中断之后CHULI能被执行到;

2,中断中散转表指针R1递增方式错误
虽然你的程序中还感觉不到这个错误,但是存在的,而且这个错误还有两点:

一是R1的初始值是0,这样无论你怎么移位,R1永远是0;

二是,这里你不应该使用移位(我想您的意图应该是从ZERO到ONE、...、NINE的顺次执行,否则只能执行ONE、TWO、FOUR、EIGHT等几条跳转),而应该使用ADD指令,每次加2个字节(我很长时间不编程了,忘记AJMP+地址有几个字节了,反正有几个字节加几)。

改改试试吧,应该没什么大问题!

另外,这个程序就算改后能执行,也尽量不要这样写。你这种写法接近使用操作系统的多任务方式编程方法,但又没有操作系统支持,所以显得怪怪的,可读性差,你可以参考Keil C51中TINY OS的原理改写下。如果觉得太难,可以使用常规方法,不要用死循环,比如:对每种输出(ZERO、ONE、...、NINE)编写子程序,在你的散转进行子程序调用,但调用后记得跳出。
方法很多,好好思考,不要“先后试了查询方式,中断方式”一定要知道为什么不行才行,祝好运!

⑵ PIC单片机按键1键多功能C语言

简单的可以设置一个变量,比如a=1,2,3,4,按一下可以增加一下,即a=1 if (a>4) a=1 else a=a+1
这样再判断a是什么值,然后确定相应的灯的亮就可以了

⑶ 基于单片机多功能数字钟

带万年历的LCD显示多功能数字钟

程序清单:

;SMC1602接口程序(MCS51模拟口线方式)

;***************************************************************************

;连线图:*LCM---8031**LCM---8031**LCM------------8031*

;*DB0---P0.0**DB4---P0.4**RS-------------P2.0*

;*DB1---P0.1**DB5---P0.5**RW-------------P2.1*

;*DB2---P0.2**DB6---P0.6**E--------------P2.2*

;*DB3---P0.3**DB7---P0.7**VLCD接10K可调电阻到GND*

;注:8051的晶振频率为11.0592MHzR0设置数据存放S8为设置键S7为加键S4为确认键

;**************************************************************************

;P0口液晶显示

;P2.4位选键P2.3加一键P2.2返回键及报时功能键闹钟设置P2.0控制显示键

;寄存器clrrs0setbrs1R0R4R5在按键中用到延时中用到SETBRS0SETBRS1的R0R1R2

;SETBRS0CLRRS1显示中用到CLRRS0CLRRS1在闹钟调整子程序中用到R1

;*********************************************************************

;

;报时功能P2.6和闹钟功能P2.5闹钟调整时间功能已经可以设置显示的切换方式变了再关闭的情况下一切正常运行

;*****************************

RSPINBITP1.2

RWPINBITP1.1

EPINBITP1.0

WEIXUANBITP2.4;位选键设置键

JIAJIANBITP2.3;加一键

JIANJIANBITP2.2;减一键

FANHUIBITP2.1;返回键

NZKGBITP2.0;闹钟设置键

SECONTLEQU30H;秒

SECONTHEQU31H;秒

MAOHAOLEQU32H;:

MINIUTLEQU33H;分

MINIUTHEQU34H;分

MAOHAOHEQU35H;:

HOURLEQU36H;时

HOURHEQU37H;时

;*****************************日期部分***************************

DAYLEQU40H;日个

DAYHEQU41H;日十

HENLEQU42H;-

MONTHLEQU43H;yue

MONTHHEQU44H;yue

HENHEQU45H;-

YEAROEQU46H;年

YEARTEQU47H

YEARSEQU48H

YEARFEQU49H

TEMPEQU50H;用做存储单元显示子程序(DISPLAY)里用到

BIJIAOEQU51H;加一子程序(JIAYI)中用到

ZDRQOEQU55H;中断加一程序中用到

ZDRQTEQU56H;中断加一程序中用到

ZDRQSEQU57H;中断加一程序中用到

ZDRQFEQU58H;中断加一程序中用到

DIZHIEQU59H;键盘(JIANPAN)子程序里用到

NZBZBIT60H;定时标志位在(闹钟开关部分)

;38H到3FH没用到

BSCSBZBIT39H;报时次数转换标志(BSCS)里用到

BSCSCCEQU3AH;报时次数存储(BSCS)里用到

ZDBSBZBIT3BH;整点报时标志(SSBS)里用到

ZMBSBZBIT3CH;整秒闪烁标志(SSBS)里用到

BSKGBZBIT3DH;报时开启标志(BSKG)里用到

XKQHBZBIT3EH;显示开启关闭标志(XIANKONG)里用到

ORG0000H

AJMPMAIN

ORG000BH

AJMPZD

ORG0030H

MAIN:MOVSP,#60H;给堆栈指针赋初值

MOV30H,#05H;秒

MOV31H,#05H;秒

MOV32H,#3AH;:

MOV33H,#09H;分

MOV34H,#05H;分

MOV35H,#3AH;:

MOV36H,#03H;时

MOV37H,#01H;时

;*****************************日期部分***************************

MOV40H,#09H;日个

MOV41H,#02H;日十

MOV42H,#2DH;-

MOV43H,#09H;yue

MOV44H,#00H;yue

MOV45H,#2DH;-

MOV46H,#09H;年

MOV47H,#09H

MOV48H,#09H

MOV49H,#02H

CLRP2.5;闹钟

CLRP2.6;整点报时

MOV03H,#00H;闹钟分个位

MOV04H,#00H;闹钟分十位

MOV06H,#04H;闹钟时个位

MOV07H,#01H;闹钟时十位

;CLRP1.5

;CLRP1.4

MOVB,#20

MOVTMOD,#01H;定时器工作方式1

MOVTH0,#4CH

MOVTL0,#08H

SETBET0;允许T0中断

SETBEA;总中断开放

LCALLLCDRESET;初始化LCD

LCALLDISPSTART;调用显示初始状态

SETBTR0;开启定时器

CLRNZBZ;闹钟开启关闭标志

CLRBSKGBZ;报时开启关闭标志

CLRXKQHBZ;显示开启关闭标志

LOOP:LCALLJIANPAN;按键子程序

LCALLDISPLAY;显示子程序

LCALLNZBF;NAOZHONGBUFENG

LCALLNZBJ;NAOZHONGBIJIAO

LCALLBSKG;BAOSHIKAIGUAN

LCALLBSCS;BAOSHICISHU

LCALLSSBS;闪烁报时

SJMPLOOP

;==============================中断加一程序===================================

ZD:PUSHACC

MOVTH0,#4CH

MOVTL0,#08H

DJNZB,ZDEND

MOVB,#20

INCSECONTL

SETBZMBSBZ

MOVA,SECONTL

CJNEA,#0AH,ZDEND

MOVSECONTL,#00H

INCSECONTH

MOVA,SECONTH

CJNEA,#06H,ZDEND

MOVSECONTH,#00H

INCMINIUTL

MOVA,MINIUTL

CJNEA,#0AH,ZDEND

MOVMINIUTL,#00H

INCMINIUTH

MOVA,MINIUTH

CJNEA,#06H,ZDEND

MOVMINIUTH,#00H

INCHOURL

SETBBSCSBZ

SETBZDBSBZ

MOVA,HOURL;24小时的判断

CJNEA,#04H,ZDF

MOVA,HOURH

CJNEA,#02H,ZDEND

MOVHOURL,#00H

MOVHOURH,#00H

LCALLZDRQ

SJMPZDEND

ZDF:CJNEA,#0AH,ZDEND

MOVHOURL,#00H

INCHOURH

ZDEND:POPACC

RETI

;日期部分

ZDRQ:PUSHACC

INCDAYL

;判断天数28,30,31部分

MOVA,MONTHH;用于判断月份时为31天30天28天

CJNEA,#01H,LL

MOV55H,#0AH;存放月份的十位转化为个位是0AH

MOVA,MONTHL

ADDA,55H;月分高低相加用于查表

SJMPLL3

LL:MOVA,MONTHL

ADDA,MONTHH

LL3:MOV56H,A;存放相加后的月份数据

MOVDPTR,#TAB5

MOVCA,@A+DPTR;查十位和天数的十位比较

MOV57H,A

MOVA,56H

MOVDPTR,#TAB6;查个位和天数的个位比较

MOVCA,@A+DPTR

MOV58H,A

MOVA,DAYH

CJNEA,57H,LL2

MOVA,DAYL

CJNEA,58H,LL2

MOVDAYH,#00H

MOVDAYL,#01H

SJMPLL4

LL2:MOVA,DAYL

CJNEA,#0AH,ZDRQEND

MOVDAYL,#00H

INCDAYH

MOVA,DAYH;比较天数是否要进位

CJNEA,57H,ZDRQEND

MOVA,DAYL

CJNEA,58H,ZDRQEND

MOVDAYH,#00H

MOVDAYL,#01H

;月份和年份

LL4:INCMONTHL

MOVA,MONTHL

CJNEA,#03H,ZDRQ1;用于判断月份时为12月时进位

MOVA,MONTHH

CJNEA,#01H,ZDRQ1

MOVMONTHL,#01H;天数符合要求

MOVMONTHH,#00H

SJMPZDRQ2

ZDRQ1:CJNEA,#0AH,ZDRQEND

MOVMONTHL,#00H

INCMONTHH

SJMPZDRQEND

ZDRQ2:INCYEARO;年的加一

MOVA,YEARO

CJNEA,#0AH,ZDRQEND

MOVYEARO,#00H

INCYEART;年的进位

MOVA,YEART

CJNEA,#0AH,ZDRQEND

MOVYEART,#00H

INCYEARS

MOVA,YEARS

CJNEA,#0AH,ZDRQEND

MOVYEARS,#00H

INCYEARF

MOVA,YEARF

CJNEA,#0AH,ZDRQEND

MOVYEARF,#00H

ZDRQEND:

POPACC

RET

;液晶初始化

;========================初始化程序=======================================

LCDRESET:;初始化程序

LCALLDELAY5MS;延时15MS

LCALLDELAY5MS

LCALLDELAY5MS

MOVA,#38H;显示模式设置(不检测忙信号)

LCALLLCDWCN;共三次

LCALLDELAY5MS

MOVA,#38H

LCALLLCDWCN

LCALLDELAY5MS

MOVA,#38H

LCALLLCDWCN

MOVA,#38H;显示模式设置(以后均检测忙信号)

LCALLLCDWC

MOVA,#08H;显示关闭

LCALLLCDWC

MOVA,#01H;显示清屏

LCALLLCDWC

MOVA,#06H;显示光标移动设置

LCALLLCDWC

MOVA,#0CH;显示开及光标设置

LCALLLCDWC

RET

;==============================写指令===================================

LCDWC:;送控制字子程序(检测忙信号)

LCALLWAITIDLE

;******写指令*******;送控制字子程序(不检测忙信号)

LCDWCN:CLRRSPIN;RS=0RW=0E=高脉冲

CLRRWPIN

MOVP0,A

SETBEPIN;(

NOP;给高电平脉冲

CLREPIN;)

RET

;==========================写数据=======================================

LCDWD:;写字符子程序

LCALLWAITIDLE

SETBRSPIN;RS=1RW=0E=高脉冲

CLRRWPIN

MOVP0,A

SETBEPIN

NOP

CLREPIN

RET

;===============================等待控制器空闲==================================

WAITIDLE:

PUSHACC;正常读写操作之前必须检测LCD控制器状态

MOVP0,#0FFH

lcallDELAY5MS;666666666666666666666666

CLRRSPIN;RS=0RW=1E=高电平

SETBRWPIN

SETBEPIN

lcallDELAY5MS;98

WTD_PA:NOP;DB7:0LCD控制器空闲

JBP0.7,WTD_PA;1LCD控制器忙

CLREPIN

POPACC

RET

;***********************初始状态子程序*******************************

DISPSTART:;显示初始状态子程序

PUSHACC

MOVA,#80H

LCALLLCDWC

MOVDPTR,#TAB;显示字符

DISP1:CLRA

MOVCA,@A+DPTR

JZDISP2

LCALLLCDWD

INCDPTR

SJMPDISP1

DISP2:MOVA,#0C0H

LCALLLCDWC

MOVDPTR,#TAB1

DISP3:CLRA

MOVCA,@A+DPTR

JZDISP_END

LCALLLCDWD

INCDPTR

SJMPDISP3

DISP_END:

POPACC

RET

;==========================显示子程序=======================================

DISPLAY:PUSHPSW

PUSHACC

SETBRS0

CLRRS1

MOVA,#85H

LCALLLCDWC

MOVR1,#38H;第一行显示数据存储单元的启始地址

MOVTEMP,#30H;第一行显示数据存储单元的结束地址

MOVR6,#2

PLAY:DECR1

CJNER1,#32H,PLY;判断是否为冒号位

MOVA,MAOHAOL;是者送冒号的ACSI码

SJMPPLAY1

PLY:CJNER1,#35H,PLY1

MOVA,MAOHAOH

SJMPPLAY1

PLY1:CJNER1,#42H,PLY2;判断是否为横杠的位置

MOVA,HENL;是者送横杠的ACSI码

SJMPPLAY1

PLY2:CJNER1,#45H,PLY3

MOVA,HENH

SJMPPLAY1

PLY3:MOVA,@R1;用查表法送要显示的数据

MOVDPTR,#TAB2

MOVCA,@A+DPTR

PLAY1:LCALLLCDWD

MOVA,R1

CJNEA,TEMP,PLAY;判断第一行是否显示好了

MOVA,#0C5H

LCALLLCDWC

MOVR1,#4AH;第二行显示数据存储单元的启始地址

MOVTEMP,#40H;第二行的结束地址

DJNZR6,PLAY;R6为0时两行显示结束

POPACC

POPPSW

RET

;************************按键子程序************************

JIANPAN:clrrs0;键盘子程序

setbrs1;键盘子程序

JBWEIXUAN,JIAN_ZEND;设置键的判断

LCALLDELAY5MS

JBWEIXUAN,JIAN_ZEND

PUSHACC

JNBWEIXUAN,$

;MOVA,#0FH;开启光标闪烁设置

;LCALLLCDWCN

fah:JNBNZBZ,JPNZSJ;为“1”闹钟为“0”时钟

LCALLJPXS

MOVR4,#86H;闹钟设定时间R4存放显示位地址

MOVR5,#2;闹钟设定时间第一行第二行•••••位置改变次数

MOVDIZHI,#8CH;闹钟设定时间第一行结束地址

MOVR0,#06H

SJMPGIVED

JPNZSJ:CLRTR0

MOVR4,#86H;R4存放显示位地址

MOVR5,#2;第一行第二行•••••位置改变次数

MOVDIZHI,#8DH;第一行结束地址

MOVR0,#36H

GIVED:MOVA,#0FH;开启光标闪烁设置

LCALLLCDWCN

MOVA,R4

LCALLLCDWC

UPONE:JBFANHUI,UPtwo;返回键的判断

LCALLDELAY5MS

JBFANHUI,UPtwo

JNBFANHUI,$

SJMPGOBACK

JIAN_ZEND:SJMPJIAN_END;中继跳转

UPtwo:JBJIAJIAN,IAM;加一键的判断

LCALLDELAY5MS

JBJIAJIAN,IAM

JNBJIAJIAN,$

LCALLJIAYI;调用按键加一子程序

;MOVA,#0FH;开启光标闪烁设置

;LCALLLCDWCN

IAM:JBJIANJIAN,IAM22;减一键的判断

LCALLDELAY5MS

JBJIANJIAN,IAM22

JNBJIANJIAN,$

LCALLJIANYI;调用按键减一子程序

AJMPGIVED

IAM22:JBWEIXUAN,UPONE;位选键的判断

LCALLDELAY5MS

JBWEIXUAN,UPONE

JNBWEIXUAN,$

DECR0

INCR4

LCALLJIAN;调用位选比较程序

CJNEr4,#88H,JJ11

DECR0

INCR4

SJMPJJ22

JJ11:CJNEr4,#8BH,JJ22

DECR0

INCR4

JJ22:MOVA,R4

CJNEA,DIZHI,GIVED

JBNZBZ,fah;为“1”闹钟为“0”时钟

MOVR4,#0C5H

MOVDIZHI,#0CFH

MOVR0,#49H

DJNZR5,GIVED

LJMPfah

GOBACK:MOVA,#0CH;关闭光标闪烁设置

LCALLLCDWCN

POPACC

JIAN_END:

SETBTR0

RET

;111111

;1111

JPXS:MOVA,#85H

LCALLLCDWC

MOVR1,#08H;第一行显示数据存储单元的启始地址

JPXS_LL:DECR1

CJNER1,#05H,JPXS_LP

MOVA,#3AH

SJMPJPXS_LY

JPXS_LP:MOVA,@R1;用查表法送要显示的数据

MOVDPTR,#TAB2

MOVCA,@A+DPTR

JPXS_LY:LCALLLCDWD

CJNER1,#03H,JPXS_LL

RET

;

;

;************************位选比较控制程序************************

;在调整时间时这几位是符号冒号和横杠的数据

;在这几位时跳过到下一位

JIAN:CJNER4,#87H,JIAN5

DECR0

INCR4

SJMPJIANEND

JIAN5:CJNER4,#8AH,JIAN1

DECR0

INCR4

SJMPJIANEND

JIAN1:CJNER4,#0C9H,JIAN2

DECR0

INCR4

SJMPJIANEND

JIAN2:CJNER4,#0CCH,JIANEND

DECR0

INCR4

JIANEND:RET

;************************按键加一子程序********************

JIAYI:INC@R0

CJNE@R0,#0AH,JIAYI_END

MOV@R0,#0

CJNER4,#86H,JIAYI55

SJMPJIAYI33

JIAYI55:CJNEr4,#89H,JIAYI11

SJMPJIAYI33

JIAYI11:CJNEr4,#8CH,JIAYI22

SJMPJIAYI33

JIAYI22:CJNER0,#30H,JIAYI_END

JIAYI33:INCR0

INC@R0

CJNE@R0,#06H,JIAYI44

MOV@R0,#0

JIAYI44:DECR0

JIAYI_END:MOVA,#0CH;开启光标闪烁设置

LCALLLCDWCN

JNBNZBZ,JIAYI88;为“1”闹钟为“0”时钟

LCALLJPXS

SJMPJIAYI99

JIAYI88:LCALLDISPLAY;显示子程序

JIAYI99:RET

;%%%%%%%%%%%%%%%%%%减一%%%%%%%%%%%%%%%%%%%%%%%%

JIANYI:DEC@R0

CJNE@R0,#00H,JIANYI_END

MOV@R0,#9

CJNER4,#86H,JIANYI55

SJMPJIANYI33

JIANYI55:CJNEr4,#89H,JIANYI11

SJMPJIANYI33

JIANYI11:CJNEr4,#8CH,JIANYI22

SJMPJIANYI33

JIANYI22:CJNER0,#30H,JIANYI_END

JIANYI33:INCR0

DEC@R0

CJNE@R0,#0FFH,JIANYI44

MOV@R0,#5

JIANYI44:DECR0

JIANYI_END:MOVA,#0CH;开启光标闪烁设置

LCALLLCDWCN

JNBNZBZ,JIANYI88;为“1”闹钟为“0”时钟

LCALLJPXS

SJMPJIANYI99

JIANYI88:LCALLDISPLAY;显示子程序

JIANYI99:RET

;******************************闹钟开关部分************************

NZBF:JBNZKG,NZBF_END

LCALLDELAY5MS

JBNZKG,NZBF_END

JNBNZKG,$

CPLNZBZ

JBNZBZ,NZBF_LL

MOVA,#01H;显示清屏

LCALLLCDWC

CLRP2.5

LCALLDISPSTART;调用显示初始状态

LCALLDISPLAY;调用显示初始状态

JBBSKGBZ,NZBF_LP;|

SJMPNZBF_END;|

NZBF_LP:MOVA,#8FH;报时标志显示位置;|

LCALLLCDWC;|保护报时标志在清屏是不被误清

MOVA,#25H;显示报时标志;|

LCALLLCDWD;|

SJMPNZBF_END;|

NZBF_LL:MOVA,#8EH;闹钟标志显示位置

LCALLLCDWC

MOVA,#26H;显示闹钟标志

LCALLLCDWD

NZBF_END:RET

;******************************闹钟比较部分************************

NZBJ:JBNZBZ,NZBJ_LL

SJMPNZBJ_END

NZBJ_LL:MOVA,07H

CJNEA,37H,NZBJ_END

MOVA,06H

CJNEA,36H,NZBJ_END

MOVA,04H

CJNEA,34H,NZBJ_END

MOVA,03H

CJNEA,33H,NZBJ_END

SETBP2.5

NZBJ_END:RET

;***************报时开关********************

BSKG:JBFANHUI,BSKG_END

LCALLDELAY5MS

JBFANHUI,BSKG_END

JNBFANHUI,$

CPLBSKGBZ

JBBSKGBZ,BSKG_LL

MOVA,#01H;显示清屏

LCALLLCDWC

CLRP2.6

LCALLDISPSTART;调用显示初始状态

LCALLDISPLAY;调用显示

JBNZBZ,BSKG_LP;|

SJMPBSKG_END;|

BSKG_LP:MOVA,#8EH;|

LCALLLCDWC;|保护闹钟标志在清屏是不被误清

MOVA,#26H;|

LCALLLCDWD;|

SJMPBSKG_END;|

BSKG_LL:MOVA,#8FH;报时标志显示位置

LCALLLCDWC

MOVA,#25H;显示报时标志

LCALLLCDWD

BSKG_END:RET

;*********************报时次数********************

BSCS:JNBBSKGBZ,BSCS_END

JNBBSCSBZ,BSCS_END

MOVA,37H

CJNEA,#01H,BSCS_LL

MOVA,#0AH

SJMPBSCS_LP

BSCS_LL:CJNEA,#02H,BSCS_LP

MOVA,#14H

BSCS_LP:ADDA,36H

RLA

MOVBSCSCC,A

CLRBSCSBZ

BSCS_END:RET

;**********************闪烁报时********************************

SSBS:JNBBSKGBZ,SSBS_END

JNBZDBSBZ,SSBS_END

JNBZMBSBZ,SSBS_END

CPLP2.6

CPLP2.7

CLRZMBSBZ

DJNZBSCSCC,SSBS_END

CLRZDBSBZ

CLRP2.6

SSBS_END:RET

;************************延时子程序(5MS)************************

DELAY5MS:

PUSHPSW

SETBRS0

SETBRS1

MOVR1,#25;延时子程序(5MS)

DL5_PA:MOVR2,#100

DJNZR2,$

DJNZR1,DL5_PA

POPPSW

RET

TAB:DB"TIME:",00h

TAB1:DB"DATE:",00h

TAB2:DB"01234567891"

TAB3:DB0AH,06H,00H,0AH,06H,00H,0AH,03H;用于比较调整时间时的比较

TAB4:DB0AH,04H,00H,0AH,02H,00H,0AH,0AH,0AH,0AH;用于调整日期时的比较

TAB5:DB00H,03H,02H,03H,03H,03H,03H,03H,03H,03H,03H,03H,03H;用于天数十位比较

TAB6:DB00H,02H,09H,02H,01H,02H,01H,02H,02H,01H,02H,01H,02H;用于天数个位比较

⑷ 求教单片机一键多功能的问题 简单来说是:在已经进入子程序中,当按键按下,又再次进入另一个子程序

呵呵,你用的是外部中断吧?你看可以不可以改成定时器中断呢?你把按键口放在中断里,按一次某单元加一,在主程序中判断单元等于几,这样就可以实现了.按键程序我就不给你发了.呵呵 自己想一想. 就几条程序.

⑸ 如何设计基于单片机的多功能8路抢答器

八路抢答器的设计

摘要

本文介绍了一种采用数字电路制作的多功能数显抢答器,它主要采用了74系列的常用集成电路,它除了具有基本的抢答功能之外,还具有定时报警的功能,和数显的功能,当抢答开始后,系统会自动倒计时,并且时间是可以预设的,期间有人抢答的话系统会停止计时,如果期间没人抢答,系统会有短暂的报警,提示抢答结束。

关键字

单片机、PLC、抢答、报警、数显

一、 设计目的

在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。

二、 方案

制作抢答器可以用好多的方法,可以用单片机来完成,它的功能强大制作简单,并且外围的元件也很少;也可以用PLC来实现,他的制作也是比较简单;还可以用我们学过的EDA技术来制作;最后也可以用数字电路来实现,它的原理比较简单,集成块的价格也比较便宜且很容易购买,与我们学完的〈〈数字电路〉〉联系紧密,能将我们所学知识用于实际,对巩固所学知识有重要意义,用了一些成型电路,如NE555标准秒脉冲电路等,使总体方案易于实现。

方案一〈采用数字电路〉

1、原理方框图

定时抢答器的总体框图如图1所示,它由主体电路和扩展电路两部分组成。主体电路完成基本的抢答功能,即开始抢答后,当选手按动抢答键时,能显示选手的编号,同时能封锁输入电路,禁止其他选手抢答。扩展电路完成定时抢答的功能。

图1

图1所示的定时抢答器的工作过程是:接通电源时,节目主持人将开关置于“清除”位置,抢答器处于禁止工作状态,编号显示器灭灯,定时显示器显示设定的时间,当节目主持人宣布“抢答开始”,同时将控制开关拨到“开始”位置,扬声器给出声响提示,抢答器处于工作状态,定时器倒计时。当定时时间到,却没有选手抢答时,系统报警,并封锁输入电路,禁止选手超时后抢答。当选手在定时时间内按动抢答键时,抢答器要完成以下四项工作:

①优先编码电路立即分辨出抢答者的编号,并由锁存器进行锁存,然后由译码显示电路显示编号;

②扬声器发出短暂声响,提醒节目主持人注意;

③控制电路要对输入编码电路进行封锁,避免其他选手再次进行抢答;

④控制电路要使定时器停止工作,时间显示器上显示剩余的抢答时间,并保持到主持人将系统清零为止。当选手将问题回答完毕,主持人操作控制开关,使系统回复到禁止工作状态,以便进行下一轮抢答。

方案二〈采用单片机〉

1、原理方框图

此电路完成的功能如图2所示,当主持人宣布抢答开始的时候,按下开始按钮,此时电路进入抢答状态,选手的输入采用了扫描式的输入,之后把相应的信息送往单片机,再由单片机输出到显示输出电路中。此时有人第一按下相应的抢答按钮,经过单片机的控制选择,在八段显示器上显示相应的号码,并锁存,同时禁止其他按钮的输入。

(图2)

方案三〈采用PLC〉

1、原理方框图

此电路的功能如图3所示,当主持人打开启动开关后,在设定时间TO 内,如果某组抢先按下抢答按钮,则驱动音效电路①发出声响,指示灯LI亮,并且在8段数码管显示器上显示出抢答成功的组号,此时电路实现互锁,其他组再按下抢答按钮为无效;

如果在时间TO内,无人应答,则驱动音效电路②发出声响,指示灯L2亮,表示抢答者均放弃该题;

在抢答成功后,主持人打开限时开关SW2,启动计时器,在设定的时间TI 内回答有效,当到达设定时间TI时,驱动音效电路③,指示灯L3亮,表示答题时间到。

(图3)

三、 方案选择

方案比较
数字电路
单片机
PLC

制作难度

一般
一般

实现难度
一般



价格

一般


电路原理
简单
一般
一般

设计难度
简单

一般

通过上面的方案比较,数字电路的制作方案比较容易实现,并且在原理方面也是比较简单,所以我选择采用第一种方案来完成抢答器电路。

四、 设计系统功能

1.基本功能:

(1) 同时供8名选手比赛,分别用8个按钮S0 ~ S7表示。

(2)设置一个系统清除和抢答控制开关S,该开关由主持人控制。

(3)抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,扬声器发出声响提示,并在七段数码管上显示选手号码。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。

2.扩展功能:

(1)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。当主持人启动"开始"键后,定时器进行减计时。

(2)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。在这段(3)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

五、 各部分单元电路的设计

(1)抢答器的主体电路设计

抢答电路的功能有两个:一是能分辨出选手按键的先后,并锁存优先抢答者的编号,供译码显示电路用;二是要使其他选手的按键操作无效。选用优先编码器74148和DFF锁存器可以完成上述功能,其电路组成如图4所示。其工作原理是:当主持人控制开关处于“清除”位置时,RS触发器的端为低电平,输出端(4Q~1Q)全部为低电平。于是74LS48的 =0,显示器灭灯;74148的选通输入端 =0,74LS148处于工作状态,此时锁存电路不工作。当主持人开关拨到“开始”位置时,优先编码电路和锁存电路同时处于工作状态,即抢答器处于等待工作状态,等待输入端 7... 0输入信号,当有选手将键按下时(如按下S5),74LSl48的输出=010, =0,经RS锁存器后,CTR=l, =1,74LS279处于工作状态,4Q3Q2Q=101,经74LS48译码后,显示器显示出“5”。此外,CTR=1,使74l48的端为高电平,74LSl48处于禁止工作状态,封锁了其它按键的输入。当按下的键松开后,74LSl48的为高电平,但由于CTR维持高电平不变,所以74LSl48仍处于禁止工作状态,其它按键的输入信号不会被接收。这就保证了抢答者的优先性以及抢答电路的准确性。当优先抢答者回答完问题后,由主持人操作控制开关S,使抢答电路复位,以便进行下一轮抢答。

(图4)

74LS148为8线-3线优先编码器,表1为其功能表。

表1 74LS148的功能真值表

(2)定时电路设计

原理及设计:该部分主要由555定时器秒脉冲产生电路、十进制同步加减计数器74LS192减法计数电路、74LS48译码电路和2个7段数码管即相关电路组成。具体电路如图5所示。两块74LS192实现减法计数,通过译码电路74LS48显示到数码管上,其时钟信号由时钟产生电路提供。74192的预置数控制端实现预置数,由节目主持人根据抢答题的难易程度,设定一次抢答的时间,通过预置时间电路对计数器进行预置,如果要设置为30S,就可以在计数器的预置数控制端输入00110000。时钟脉冲由秒脉冲电路提供。按键弹起后,计数器开始减法计数工作,并将时间显示在共阴极七段数码显示管上,当有人抢答时,停止计数并显示此时的倒计时时间;如果没有人抢答,且倒计时时间到时,输出低电平到时序控制电路,控制报警电路报警,同时以后选手抢答无效。具体电路如图5所示。

(图5)

秒脉冲产生电路:秒脉冲由NE555提供,它的的3端输出的脉冲的频率为

,结合我们的实际经验及考虑到元器件的成本,我们选择的电阻值为R1=15K,R2=68K,C=10uF,代入到上式中即得,即秒脉冲。

(3)报警电路的设计

采用555定时器和三极管构成的报警电路如图6所示。其中555构成多谐振荡器,振荡频率

其输出信号经三极管推动扬声器。PR为控制信号,当PR为高电平时,多谐振荡器工作,当PR为低电平的时候,电路停振。

(图6)

(4)时序控制电路设计

与门G1 的作用是控制时钟信号CP的放行与禁止,门G2的作用是控制74LS148的输入使能端(即图二中的5端)。图7的工作原理是:主持人控制开关从"清除"位置拨到"开始"位置时,来自于图2中的74LS279的输出 1Q,即CTR=0,经G3反相,输出为1,则NE555产生的时钟信号CP能够加到74LS192的CPD时钟输入端,定时电路进行递减计时。同时,在定时时间未到时,则"定时到信号"为 1,门G2的输出 =0,使 74LS148处于正常工作状态。当选手在定时时间内按动抢答按键时,CTR=1,经G3反相,输出为0,封锁 CP信号,定时器处于保持工作状态;同时,门G2的输出 =1,74LS148处于禁止工作状态。当定时时间到时,则"定时到信号"为0,/ST=1,74LS148处于禁止工作状态,禁止选手进行抢答。同时,门G1处于关门状态,封锁时钟CP信号,使定时电路保持00状态不变,此次抢答结束。

(图7)

集成单稳态触发器74LS121用于控制报警电路及发声的时间(其功能表见表2),具体原理如下:主要由555时钟电路(用于控制报警声音频率)、蜂鸣器即相关的延时电路和控制电路组成。单稳态触发器74121通过信号/Ys、BO2、S控制报警与否和报警时间,555时钟电路产生脉冲时钟。在规定的时间有人抢答时,/Ys由1跳变到0,74121有状态2,即Q输出暂态高电平,蜂鸣器连续发声报警,持续时间为 =2.15秒;如果在规定时间内无人抢答,BO2由1跳变到0,74121有状态1,Q输出暂态高电平,蜂鸣器连续发声报警持续时间为
结合图6所示报警电路,分析 计算如下: 。取C=100uF, R=25K,。有=2.15秒。(原理图见图8)

(图8)

表2 74121功能表

(6) 电源电路

电源电路采用三端集成线性稳压集成块,L7805CV,因为它的外围电路比较简单,并且工作比较稳定,很适合74系列的集成块。它的稳压精度为2%,工作电流1.5A,封装为TO-220(A),工作温度也很不错,并且具有过温保护和短路保护,最大输入电压为35V,能对电路的长时间工作有很大的保障。(具体电路见图9)

(图9)

六、 总结

毕业设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。下面我对整个毕业设计的过程做一下简单的总结。

第一,接到任务以后进行选题。选题是毕业设计的开端,选择恰当的、感兴趣的题目,这对于整个毕业设计是否能够顺利进行关系极大。好比走路,这开始的第一步是具有决定意义的,第一步迈向何方,需要慎重考虑。否则,就可能走许多弯路、费许多周折,甚至南辕北辙,难以到达目的地。因此,选;题时一定要考虑好了。

第二,题目确定后就是找资料了。查资料是做毕业设计的前期准备工作,好的开端就相当于成功了一半,到图书馆、书店、资料室去虽说是比较原始的方式,但也有可取之处的。总之,不管通过哪种方式查的资料都是有利用价值的,要一一记录下来以备后用。

第三,通过上面的过程,已经积累了不少资料,对所选的题目也大概有了一些了解,这一步就是在这样一个基础上,综合已有的资料来更透彻的分析题目。

第四,有了研究方向,就应该动手实现了。其实以前的三步都是为这一步作的铺垫。

通过这次设计,我对数字电路设计中的逻辑关系等有了一定的认识,对以前学的数字电路又有了一定的新认识,温习了以前学的知识,就像人们常说的温故而知新嘛,但在设计的过程中,遇到了很多的问题,有一些知识都已经不太清楚了,但是通过一些资料又重新的温习了一下数字电路部分的内容。在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。

在此要感谢我的指导老师,感谢老师给我这样的机会锻炼。在整个毕业设计过程中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中的探索的艰难和成功的喜悦。虽然这个项目还不是很完善,但是在设计过程中所学到的东西是这次毕业设计的最大收获和财富,使我终身受益。

⑹ 急求一个单片机控制一个LED灯发光的汇编程序,启动时LED发光有按键按下灯熄灭

一键多功能按键识别技术
1.实验任务
开关K1接在P3.2管脚上,在AT89S51单片机的P0.0端口接有1个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在亮,当一次按下开关K1的时候,灯灭,再按一次,灯亮,如此轮流下去。
2.系统板上硬件连线
把“单片机系统”区域中的P3.2端口连接到“独立式键盘”区域中的K1端口上;把P0.0连到L1上
3.程序设计方法
(1. 设计思想由来
在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。
(2. 设计方法
从上面的要求我们可以看出,L1到亮灭受开关K1来控制,我们给L1亮灭定义出不同的ID号,当L1在亮时,ID=0;当L1在灭时,ID=1;分别给出不同的ID号我们就能够完成上面的任务了
4.汇编程序:
ID EQU 30H
K1 BIT P3.2
L1 BIT P0.0
ORG 0000H
CLR P1.7
MOV ID,#00H
START: JB K1,REL ;K1没闭合转
LCALL DELAY10MS ;K1闭合,延时消抖动
JB K1,REL :再判断
INC ID
MOV A,ID
CJNE A,#02,REL
MOV ID,#00H
REL: JNB K1,$ ;等待开关弹起
MOV A,ID
CJNE A,#00H,IS0 ;判断相应ID
CLR L1 :ID=0,灯亮
LCALL DELAY光 ;延时
SJMP START
IS0: CJNE A,#01H,START;
SETB L1
LCALL DELAY
SJMP START

DELAY10MS: MOV R6,#20 ;延时10MS子程序
LOOP1: MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP1
RET
DELAY: MOV R5,#20 ;延时20MS子程序
LOOP2: LCALL DELAY10MS
DJNZ R5,LOOP2
RET
END

⑺ 单片机怎样通过按键在程序实现多功能

如果你就是只有一个按键,可以这样做:设置一个寄存器Key_Times_Buf,然后记录第几次按键,通过这个值,处理相应的程序.
if(Key_Pin==0)
{
Key_Times_Buf++;
if(Key_Times_Buf>=3)
{
Key_Times_Buf=0;
}
}

switch(Key_Times_Buf)
{
case 0:
//程序0
break;

case 1:
//程序1
break;

case 2:
//程序2
break;
}

阅读全文

与单片机多功能按键相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:142
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:732
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:141
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163