c語言六位搶答器課程設計,51單片機八路搶答器課程設計

;說明:本人的這個設計改進后解決了前一個版本中1號搶答優先的問題,并增加了錦囊的設置,當參賽選手在回答問題時要求使用錦囊,則主持人按下搶答開始鍵,計時重新開始。

;八路搶答器電路請看下圖是用ps仿真的,已經測試成功

206b64c7cb803c51cde6b267646236da.png

;============================================================

;================單片機八路搶答器程序 =====================

;================ 51hei =======================

;================ 2008 年 5月 =======================

;============================================================

OK EQU 20H;搶答開始標志位

RING EQU 22H;響鈴標志位

ORG 0000H

AJMP MAIN

ORG 0003H

AJMP INT0SUB

ORG 000BH

AJMP T0INT

ORG 0013H

AJMP INT1SUB

ORG 001BH

AJMP T1INT

ORG 0040H

MAIN: MOV R1,#30;初設搶答時間為30s

MOV R2,#60;初設答題時間為60s

MOV TMOD,#11H;設置未定時器/模式1

MOV TH0,#0F0H

MOV TL0,#0FFH;越高發聲頻率越高,越尖

MOV TH1,#3CH

MOV TL1,#0B0H;50ms為一次溢出中斷

SETB EA

SETB ET0

SETB ET1

SETB EX0

SETB EX1;允許四個中斷,T0/T1/INT0/INT1

CLR OK

CLR RING

SETB TR1

SETB TR0;一開始就運行定時器,以開始顯示FFF.如果想重新計數,重置TH1/TL1就可以了

;=====查詢程序=====

START: MOV R5,#0BH

MOV R4,#0BH

MOV R3,#0BH

ACALL DISPLAY;未開始搶答時候顯示FFF

JB P3.0,NEXT;ddddddd

ACALL DELAY

JB P3.0,NEXT;去抖動,如果"開始鍵"按下就向下執行,否者跳到非法搶答查詢

ACALL BARK;按鍵發聲

MOV A,R1

MOV R6,A;送R1->R6,因為R1中保存了搶答時間

SETB OK;搶答標志位,用于COUNT只程序中判斷是否查詢搶答

MOV R7,#01H ;讀搶答鍵數據信號標志,這里表示只讀一次有用信號

MOV R3,#0AH;搶答只顯示計時,滅號數

AJMP COUNT;進入倒計時程序,"查詢有效搶答的程序"在COUNT里面

NEXT: JNB P1.0,FALSE1

JNB P1.1,FALSE2

JNB P1.2,FALSE3

JNB P1.3,FALSE4

JNB P1.4,FALSE5

JNB P1.5,FALSE6

JNB P1.6,FALSE7

JNB P1.7,FALSE8

AJMP START

;=====非法搶答處理程序=====

FALSE1: MOV R3,#01H

AJMP ERROR

FALSE2: MOV R3,#02H

AJMP ERROR

FALSE3: MOV R3,#03H

AJMP ERROR

FALSE4: MOV R3,#04H

AJMP ERROR

FALSE5: MOV R3,#05H

AJMP ERROR

FALSE6: MOV R3,#06H

AJMP ERROR

FALSE7: MOV R3,#07H

AJMP ERROR

FALSE8: MOV R3,#08H

AJMP ERROR

;=====INT0(搶答時間R1調整程序)=====

INT0SUB:MOV A,R1

MOV B,#0AH

DIV AB

MOV R5,A

MOV R4,B

MOV R3,#0AH

ACALL DISPLAY;先在兩個時間LED上顯示R1

JNB P3.4,INC0;P3.4為+1s鍵,如按下跳到INCO

JNB P3.5,DEC0;P3.5為-1s鍵,如按下跳到DECO

JNB P3.1,BACK0;P3.1為確定鍵,如按下跳到BACKO

AJMP INT0SUB

INC0: MOV A,R1

CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。

MOV R1,#00H

ACALL DELAY1

AJMP INT0SUB

ADD0: INC R1

ACALL DELAY1

AJMP INT0SUB

DEC0: MOV A,R1

JZ SETR1;如果R1為0, R1就置99,

DEC R1

ACALL DELAY1

AJMP INT0SUB

SETR1: MOV R1,#63H

ACALL DELAY1

AJMP INT0SUB

BACK0: RETI

;=====INT1(回答時間R2調整程序)=====

INT1SUB:MOV A,R2

MOV B,#0AH

DIV AB

MOV R5,A

MOV R4,B

MOV R3,#0AH

ACALL DISPLAY

JNB P3.4,INC1

JNB P3.5,DEC1

JNB P3.1,BACK1

AJMP INT1SUB

INC1: MOV A,R2

CJNE A,#63H,ADD1

MOV R2,#00H

ACALL DELAY1

AJMP INT1SUB

ADD1: INC R2

ACALL DELAY1

AJMP INT1SUB

DEC1: MOV A,R2

JZ SETR2

DEC R2

ACALL DELAY1

AJMP INT1SUB

SETR2: MOV R2,#63H

ACALL DELAY1

AJMP INT1SUB

BACK1: RETI

;=====倒計時程序(搶答倒計時和回答倒計時都跳到改程序)=====

REPEAT:MOV A,R2 ;使用錦囊時重新計時

MOV R6,A

CLR RING

COUNT: MOV R0,#00H;重置定時器中斷次數

MOV TH1,#3CH

MOV TL1,#0B0H;重置定時器

RECOUNT:MOV A,R6;R6保存了倒計時的時間,之前先將搶答時間或回答時間給R6

MOV B,#0AH

DIV AB;除十分出個位/十位

MOV 30H,A;十位存于(30H)

MOV 31H,B;個位存于(31H)

MOV R5,30H;取十位

MOV R4,31H;取個位

MOV A,R6

SUBB A,#07H

JNC LARGER;大于5s跳到LARGER,小于等于5s會提醒

MOV A,R0

CJNE A,#0AH,FULL;1s中0.5s向下運行

CLR RING

AJMP CHECK

FULL: CJNE A,#14H,CHECK;下面是1s的情況,響并顯示號數并清R0,重新計

SETB RING

MOV A,R6

JZ QUIT;計時完畢

MOV R0,#00H

DEC R6;一秒標志減1

AJMP CHECK

LARGER: MOV A,R0

CJNE A,#14H,CHECK;如果1s向下運行,否者跳到查"停/顯示"

DEC R6;計時一秒R6自動減1

MOV R0,#00H

CHECK: JNB P3.1,QUIT;如按下停止鍵退出

JNB OK,CHECKK ;只在回答倒計時才有效

AJMP NEXTT

CHECKK:JNB P3.0,REPEAT ;判斷是否使用錦囊

NEXTT: ACALL DISPLAY

JB OK,ACCOUT;如果是搶答倒計時,如是則查詢搶答,否者跳過查詢繼續倒數(這里起到鎖搶答作用)

AJMP RECOUNT

ACCOUT:

MOV A,36H

JNB ACC.0,TRUE1

JNB ACC.1,TRUE2

JNB ACC.2,TRUE3

JNB ACC.3,TRUE4

JNB ACC.4,TRUE5

JNB ACC.5,TRUE6

JNB ACC.6,TZ1

JNB ACC.7,TZ2

AJMP RECOUNT

TZ1:JMP TRUE7

TZ2:JMP TRUE8

QUIT: CLR OK;如果按下了"停止鍵"執行的程序

CLR RING

AJMP START

;=====正常搶答處理程序=====

TRUE1: ACALL BARK

MOV A,R2

MOV R6,A;搶答時間R2送R6

MOV R3,#01H

CLR OK;因為答題的計時不再查詢搶答,所以就鎖了搶答

AJMP COUNT

TRUE2:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#02H

CLR OK

AJMP COUNT

TRUE3:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#03H

CLR OK

AJMP COUNT

TRUE4:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#04H

CLR OK

AJMP COUNT

TRUE5:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#05H

CLR OK

AJMP COUNT

TRUE6: ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#06H

CLR OK

AJMP COUNT

TRUE7:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#07H

CLR OK

AJMP COUNT

TRUE8:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#08H

CLR OK

AJMP COUNT

;=====犯規搶答程序=====

ERROR: MOV R0,#00H

MOV TH1,#3CH

MOV TL1,#0B0H

MOV 34H,R3;犯規號數暫存與(34H)

HERE: MOV A,R0

CJNE A,#06H,FLASH;0.3s向下運行->滅并停響

CLR RING

MOV R3,#0AH

MOV R4,#0AH

MOV R5,#0AH;三燈全滅

AJMP CHECK1

FLASH: CJNE A,#0CH,CHECK1;下面是0.8s的情況,響并顯示號數并清R0,重新計

SETB RING

MOV R0,#00H

MOV R3,34H;取回號數

MOV R5,#0BH

MOV R4,#0BH;顯示FF和號數

AJMP CHECK1

CHECK1: JNB P3.1,QUIT1

ACALL DISPLAY

AJMP HERE

QUIT1: CLR RING

CLR OK

AJMP START

;=====顯示程序=====

DISPLAY:MOV DPTR,#DAT1;查表顯示程序,利用P0口做段選碼口輸出/P2低三位做位選碼輸出,

MOV A,R3

MOVC A,@A+DPTR

MOV P2,#0feH

MOV P0,A

ACALL DELAY2

MOV DPTR,#DAT2

MOV A,R5

MOVC A,@A+DPTR

MOV P2,#0fdH

MOV P0,A

ACALL DELAY2

MOV A,R4

MOVC A,@A+DPTR

MOV P2,#0fbH

MOV P0,A

ACALL DELAY2

RET

DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;"滅","1","2","3","4","5","6","7","8","9","滅","F"

DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;第一個為零,其他與上相同,因為十位如果為零顯示熄滅

;====加減時間延時(起到不會按下就加N個數)======

DELAY1: MOV 35H,#08H

LOOP0: ACALL DISPLAY

DJNZ 35H,LOOP0

RET

;=====延時4236個機器周期(去抖動用到)=====

DELAY: MOV 32H,#12H

LOOP: MOV 33H,#0AFH

LOOP1: DJNZ 33H,LOOP1

DJNZ 32H,LOOP

RET

;=====延時4236個機器周期(顯示用到)=====

DELAY2: MOV 32H,#43H

LOOP3: MOV 33H,#1EH

MOV A,R7 ;每隔60~70個機器周期讀一次P1口,全為1時為無效數據,繼續讀,有一個不為1時,轉到正常搶答處理

JNZ AAAA1 ;沒讀到有效數據時繼續轉到AAAA1

LOOP2: DJNZ 33H,LOOP2

DJNZ 32H,LOOP3

RET

;=====讀搶答按鍵數據口程序=====

;由于在讀搶答數據口的時候,單片機首先進入倒計時程序,再調用顯示程序,最后才檢測按鍵口

;然而在檢測按鍵口時動態掃描要調用三次(4ms)延時程序.這樣就會導致讀數據口出現滯后,造成1號優先最高.8號最低.

;故采用在延時子程序中加了讀數據口程序.保證了靈敏度和可靠性

AAAA1: MOV A,P1

CJNE A,#0FFH,AA1 ;當不全為1時的數據為有效數據

AA0: MOV 36H,A ;將有效數據送到36H暫存

AJMP LOOP2

AA1: DEC R7

AJMP AA0

;=====發聲程序=====

BARK: SETB RING

ACALL DELAY1

ACALL DELAY1

CLR RING;按鍵發聲

RET

;=====TO溢出中斷(響鈴程序)=====

T0INT: MOV TH0,#0ECH

MOV TL0,#0FFH

JNB RING,OUT;

CPL P3.6;RING標志位為1時候P3.6口不短取反使喇叭發出一定頻率的聲音

OUT: RETI

;=====T1溢出中斷(計時程序)=====

T1INT: MOV TH1,#3CH

MOV TL1,#0B0H

INC R0

RETI

END

*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ELF文件詳解—初步認識

ELF文件詳解—初步認識 轉自:https://blog.csdn.net/daide2012/article/details/73065204 一、 引言 在講解ELF文件格式之前,我們來回顧一下,一個用C語言編寫的高級語言程序是從編寫到打包、再到編譯執行的基本過程,我們知道在C…

埃及分數問題c語言,埃及分數問題(轉)

今日,小雨和小明來到網絡中心,繼續與劉老師討論“數的認識”問題。劉老師說:“還有一種‘埃及分數’需要認識。這是一類分裂分數的思維題,對思維能力的訓練很有價值。”小明說:“有意思,愿洗耳恭聽。”劉老…

linux常用命令--開發調試篇

前言 Linux常用命令中有一些命令可以在開發或調試過程中起到很好的幫助作用,有些可以幫助了解或優化我們的程序,有些可以幫我們定位疑難問題。本文將簡單介紹一下這些命令。 轉自:https://www.yanbinghu.com/2018/09/26/61877.html 示例程序…

簡單有趣的c語言小程序,一個有趣的小程序

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓源碼:#include #include #include #include #include HINSTANCE g_hInstance 0;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nSh…

linux下ora 01110,ORA-01003ORA-01110

Oracle 9i數據庫登錄時,提示ORA-01003&ORA-01110,大概意思是數據文件存儲介質損壞。startup nomount,正常;alter database mount,也正常;alter database open,提示如下:alter database open*ERROR 位于第 1 行:ORA…

x11轉發:通過ssh遠程使用GUI程序

x11轉發:通過ssh遠程使用GUI程序 我們常常使用ssh服務遠程操控服務器,大多數操作我們都可以通過命令行命令來實現。 ssh遠程無法查看GUI程序 現在,筆者在x11-test目錄下放入一張圖片test.jpg,并通過opnencv-python寫一個簡單的…

操作系統引導詳細過程

操作系統引導詳細過程 轉自:https://blog.csdn.net/lijie45655/article/details/89366372 就直觀而言,我們所見到計算機啟動的過程是:按下電腦開機鍵,系統在黑色的屏幕下打印出一些英文語句、然后進入進度條狀態,最后…

android 自定義透明 等待 dialog,Android自定義Dialog內部透明、外部遮罩效果

Android自定義Dialog內部透明、外部遮罩效果發布時間:2020-09-09 03:01:41來源:腳本之家閱讀:117作者:zst1303939801本文實例為大家分享了Android自定義Dialog遮罩效果的具體代碼,供大家參考,具體內容如下圖…

對比損失的PyTorch實現詳解

對比損失的PyTorch實現詳解 本文以SiT代碼中對比損失的實現為例作介紹。 論文:https://arxiv.org/abs/2104.03602 代碼:https://github.com/Sara-Ahmed/SiT 對比損失簡介 作為一種經典的自監督損失,對比損失就是對一張原圖像做不同的圖像…

android 融云瀏覽大圖,融云 Android sdk kit 頭像昵稱更新機制

先申明筆者的實現方式不是唯一 也不一定是最優化的方案 如果您看到此篇博文 有不同看法 或者 更好的優化 更高的效率 歡迎在評論發表意見 融云官網點我融云頭像機制相關視頻詳解首先跟大家說一下 kit 跟 lib 的頭像機制 kit 是已經包含融云已經給開發者定制好的界面 諸如 會話界…

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one.

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. 報錯信息 報錯信息: RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates tha…

android訪問重定向地址,如何從android中重定向url加載圖像(示例代碼)

嗨,我正面臨這個問題我從RESTCall獲取了一個URL網址是http://hck.re/kWWxUI但是當我在瀏覽器中檢查時,它會重定向到https://s3-ap-southeast-1.amazonaws.com/he-public-data/afreen2ac5a33.jpg如何將此圖像加載到我的imageView中我已經知道如何將畢加索…

Linux中的awk、sed、grep及正則表達式詳解

Linux中的awk、sed、grep及正則表達式詳解 簡介 awk、sed和grep是Linux中文本操作的三大利器。 其中awk適用于取列,sed適用于取行,grep適用于過濾。 正則表達式 首先我們來介紹一下正則表達式,正則表達式(regular expression)描述了一種…

android聚焦時如何給控件加邊框,edittext設置獲得焦點時的邊框顏色

第一步:為了更好的比較,準備兩個一模一樣的EditText(當Activity啟動時,焦點會在第一個EditText上,如果你不希望這樣只需要寫一個高度和寬帶為0的EditText即可避免,這里就不這么做了),代碼如下:a…

gcc參數 -i, -L, -l, -include

gcc參數 -i, -L, -l, -include -i,-L,-l,-include -l和-L -l參數就是用來指定程序要鏈接的庫,-l參數緊接著就是庫名,那么庫名跟真正的庫文件名有什么關系呢?就拿數學庫來說,他的庫名是m&…

xargs 命令教程

xargs 命令教程 轉自:http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 作者: 阮一峰 日期: 2019年8月 8日 xargs是 Unix 系統的一個很有用的命令,但是常常被忽視,很多人不了解它的用法。 本文介紹如…

android strictmode有什么作用,Android 性能優化 之 StrictMode

8種機械鍵盤軸體對比本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?StrictMode概述StrictMode 是用來檢測程序中違例情況的開發者工具。使用StrictMode,系統檢測出主線程違例的情況會做出相應的反應,如日志打…

curl 的用法指南

curl 的用法指南 轉自:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者: 阮一峰 日期: 2019年9月 5日 簡介 curl 是常用的命令行工具,用來請求 Web 服務器。它的名字就是客戶端(client&#xf…

怎么在html顯示已登錄狀態,jQuery Ajax 實現在html頁面實時顯示用戶登錄狀態

當網站是全靜態的html頁面時,而又希望網站會員在登錄之后并在所有頁面頭部顯示登錄狀態,如用戶名等,如果未登錄就是未登錄狀態,下面給大家來分享實現的方法。一、在html靜態頁面中加入div,并指定ID如:二、新…

互斥鎖、條件變量、信號量淺析

互斥鎖、條件變量、信號量淺析 互斥鎖與條件變量 條件變量是為了保證同步 條件變量用在多線程多任務同步的,一個線程完成了某一個動作就通過條件變量告訴別的線程,別的線程再進行某些動作(大家都在semtake的時候,就阻塞在哪里&a…