導航:首頁 > 操作系統 > 單片機多功能按鍵

單片機多功能按鍵

發布時間: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
光遇為什麼登錄時伺服器已滿 瀏覽:301
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:141
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:890
app轉賬是什麼 瀏覽:163