當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件

設(shè)計(jì)一個(gè)單片機(jī)控制的簡(jiǎn)易定時(shí)報(bào)警器。要求根據(jù)設(shè)定的初始值(1-59秒)進(jìn)行倒計(jì)時(shí),當(dāng)計(jì)時(shí)到0時(shí)數(shù)碼管閃爍“00”(以1Hz閃爍),按鍵功能如下:
(1)設(shè)定鍵:在倒計(jì)時(shí)模式時(shí),按下此鍵后停止倒計(jì)時(shí),進(jìn)入設(shè)置狀態(tài);如果已經(jīng)處于設(shè)置狀態(tài)則此鍵無(wú)效。
(2)增一鍵:在設(shè)置狀態(tài)時(shí),每按一次遞增鍵,初始值的數(shù)字增1。
(3)遞一鍵:在設(shè)置狀態(tài)時(shí),每按一次遞減鍵,初始值的數(shù)字減1。
(4)確認(rèn)鍵:在設(shè)置狀態(tài)時(shí),按下此鍵后,單片機(jī)按照新的初始值進(jìn)行倒計(jì)時(shí)及顯示倒計(jì)時(shí)的數(shù)字。如果已經(jīng)處于計(jì)時(shí)狀態(tài)則此鍵無(wú)效。
3.1.2 模塊1:系統(tǒng)設(shè)計(jì)
(1)任務(wù)分析與整體設(shè)計(jì)思路
根據(jù)題目的要求,需要實(shí)現(xiàn)如下幾個(gè)方面的功能。
計(jì)時(shí)功能:要實(shí)現(xiàn)計(jì)時(shí)功能則需要使用定時(shí)器來(lái)計(jì)時(shí),通過(guò)設(shè)置定時(shí)器的初始值來(lái)控制溢出中斷的時(shí)間間隔,再利用一個(gè)變量記錄定時(shí)器溢出的次數(shù),達(dá)到定時(shí)1秒中的功能。然后,當(dāng)計(jì)時(shí)每到1秒鐘后,倒計(jì)時(shí)的計(jì)數(shù)器減1。當(dāng)?shù)褂?jì)時(shí)計(jì)數(shù)器到0時(shí),觸發(fā)另一個(gè)標(biāo)志變量,進(jìn)入閃爍狀態(tài)。
顯示功能:顯示倒計(jì)時(shí)的數(shù)字要采用動(dòng)態(tài)掃描的方式將數(shù)字拆成“十位”和“個(gè)位”動(dòng)態(tài)掃描顯示。如果處于閃爍狀態(tài),則可以不需要?jiǎng)討B(tài)掃描顯示,只需要控制共陰極數(shù)碼管的位控線(xiàn),實(shí)現(xiàn)數(shù)碼管的滅和亮。
鍵盤(pán)掃描和運(yùn)行模式的切換:主程序在初始化一些變量和寄存器之后,需要不斷循環(huán)地讀取鍵盤(pán)的狀態(tài)和動(dòng)態(tài)掃描數(shù)碼管顯示相應(yīng)的數(shù)字。根據(jù)鍵盤(pán)的按鍵值實(shí)現(xiàn)設(shè)置狀態(tài)、計(jì)時(shí)狀態(tài)的切換。
(2)單片機(jī)型號(hào)及所需外圍器件型號(hào),單片機(jī)硬件電路原理圖
選用MCS-51系列AT89S51單片機(jī)作為微控制器,選擇兩個(gè)四聯(lián)的共陰極數(shù)碼管組成8位顯示模塊,由于AT89S51單片機(jī)驅(qū)動(dòng)能力有限,采用兩片74HC244實(shí)現(xiàn)總線(xiàn)的驅(qū)動(dòng),一個(gè)74HC244完成位控線(xiàn)的控制和驅(qū)動(dòng),另一個(gè)74HC244完成數(shù)碼管的7段碼輸出,在輸出口上各串聯(lián)一個(gè)100歐姆的電阻對(duì)7段數(shù)碼管限流。
由于鍵盤(pán)數(shù)量不多,選擇獨(dú)立式按鍵與P1口連接作為四個(gè)按鍵輸入。沒(méi)有鍵按下時(shí)P1.0-P1.3為高電平,當(dāng)有鍵按下時(shí),P1.0-P1.3相應(yīng)管腳為低電平。電路原理圖如圖3-1所示。

圖3-1 定時(shí)報(bào)警器電路原理圖
(3)程序設(shè)計(jì)思路,單片機(jī)資源分配以及程序流程
①單片機(jī)資源分配
采用單片機(jī)的P3口作為按鍵的輸入,使用獨(dú)立式按鍵與P3.0-P3.3連接,構(gòu)成四個(gè)功能按鍵。
在計(jì)時(shí)功能中,需要三個(gè)變量分別暫存定時(shí)器溢出的次數(shù)(T1_cnt)、倒計(jì)時(shí)的初始值(init_val)以及當(dāng)前倒計(jì)時(shí)的秒數(shù)(cnt_val)。
按鍵掃描功能中,需要兩個(gè)變量,一個(gè)變量(key_val_new)用來(lái)存儲(chǔ)當(dāng)前掃描的鍵值(若無(wú)按鍵按下則為255),另一個(gè)變量(key_val_old)用來(lái)存儲(chǔ)上一次掃描的鍵值。只有這兩個(gè)變量值不一樣時(shí),才能說(shuō)明是一次新的按鍵按下或彈起了,同時(shí)將新的鍵值賦給key_val_old變量。
在顯示功能中,需要定義一組數(shù)組(code類(lèi)型),值為0-9數(shù)字對(duì)應(yīng)的數(shù)碼管7段碼。還需要定義一個(gè)變量(show_val)暫存要顯示的數(shù)據(jù),用于動(dòng)態(tài)掃描顯示中。
在整個(gè)程序中,定義了一個(gè)狀態(tài)變量(state_val)用來(lái)存儲(chǔ)當(dāng)前單片機(jī)工作在哪種狀態(tài)。
②程序設(shè)計(jì)思路
鑒于題目要求,存在三種工作模式:初始值設(shè)置模式、倒計(jì)時(shí)模式、計(jì)時(shí)到0時(shí)的閃爍模式。變量state_val為0時(shí),處于倒計(jì)時(shí)模式。變量state_val為1時(shí),處于初始值設(shè)置模式。變量state_val為2時(shí),處于閃爍模式。這些狀態(tài)的切換取決于按下哪一個(gè)鍵以及是否計(jì)時(shí)到0。狀態(tài)的切換圖如圖3-2

圖3-2 狀態(tài)的切換
單片機(jī)復(fù)位之后,默認(rèn)處于倒計(jì)時(shí)模式,啟動(dòng)定時(shí)器,定時(shí)器每隔250us溢出一次,根據(jù)定時(shí)器溢出次數(shù)來(lái)計(jì)時(shí),到1秒時(shí)將時(shí)間的計(jì)數(shù)器減1。當(dāng)“設(shè)置鍵”按下時(shí),變量state_val由0變?yōu)?,切換到設(shè)置模式。可以使用“遞增鍵”“遞減鍵”對(duì)計(jì)時(shí)初始值進(jìn)行修改。按下“確認(rèn)鍵”時(shí),回到計(jì)時(shí)模式開(kāi)始以新的初始值進(jìn)行倒計(jì)時(shí)。當(dāng)?shù)褂?jì)時(shí)到0時(shí),變量state_val由1變?yōu)?,處于閃爍狀態(tài),在這種狀態(tài)下,根據(jù)按鍵的情況分別又切換到計(jì)時(shí)和設(shè)置狀態(tài)。
③程序流程
主程序首先需要初始化定時(shí)器的參數(shù)和一些變量,然后進(jìn)入一個(gè)循環(huán)結(jié)構(gòu),在循環(huán)中始終只做兩件事,一是鍵盤(pán)的掃描,二是數(shù)碼管的動(dòng)態(tài)掃描。
在掃描鍵盤(pán)后,根據(jù)前一次按鍵的結(jié)果是否與本次鍵值相同。如果不同,表示有鍵按下或彈起,同時(shí)用本次按鍵值更新上一次的按鍵值。這樣設(shè)計(jì)旨在避免一個(gè)按鍵長(zhǎng)時(shí)間按下時(shí)被重復(fù)判為有新鍵按下,使得當(dāng)前按下的鍵只有松開(kāi)后,下一次按下時(shí)才算為一次新的按鍵。
根據(jù)按鍵的值分別改變變量(state_val)的值或者在設(shè)置狀態(tài)時(shí)的倒計(jì)時(shí)初始值。完整的主程序圖如圖3-3所示。

圖3-3 主程序的流程圖
在定時(shí)器的參數(shù)中,選擇定時(shí)器T1的8位自動(dòng)裝載模式,每250us產(chǎn)生一次溢出中斷,中斷服務(wù)程序如圖3-4所示。

中斷服務(wù)程序流程圖

(4)軟硬件調(diào)試方案
軟件調(diào)試方案:偉福軟件中,在“文件新建文件”中,新建C語(yǔ)言源程序文件,編寫(xiě)相應(yīng)的程序。在“文件新建項(xiàng)目”的菜單中,新建項(xiàng)目并將C語(yǔ)言源程序文件包括在項(xiàng)目文件中。
在 “項(xiàng)目編譯”菜單中將C源文件編譯,檢查語(yǔ)法錯(cuò)誤及邏輯錯(cuò)誤。在編譯成功后,產(chǎn)生以 “*.hex”和“*.bin” 后綴的目標(biāo)文件。
硬件調(diào)試方案:在設(shè)計(jì)平臺(tái)中,將單片機(jī)的P3.0-P3.3分別與獨(dú)立式鍵盤(pán)的相應(yīng)位通過(guò)插線(xiàn)連接起來(lái)。
在偉福中將程序文件編譯成目標(biāo)文件后,運(yùn)行MCU下載程序,選擇相應(yīng)的flash 數(shù)據(jù)文件,點(diǎn)擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。
然后,上電重新啟動(dòng)單片機(jī),檢查所編寫(xiě)的程序是否達(dá)到題目的要求,是否全面完整地完成試題的內(nèi)容。

3.1.3 程序設(shè)計(jì)(僅供參考的C語(yǔ)言源程序)
//晶振:11.0592M T1-250微秒 按鍵P10 P11 P12 P13
/*變量的定義:
show_val: 顯示的值0-59
init_val: 初始值
state_val: 狀態(tài)值 0-計(jì)數(shù)狀態(tài);1-設(shè)置狀態(tài);2-閃爍狀態(tài)
shan_val:
key_val1: 四個(gè)按鍵的值 255-無(wú)鍵;1-設(shè)置鍵 2-增一鍵 3-減一鍵 4-確定鍵
T1_cnt: 定時(shí)器計(jì)數(shù)溢出數(shù)
cnt_val: 倒計(jì)時(shí)的數(shù)值
led_seg_code:數(shù)碼管7段碼
*/
#include "reg51.h" //包含文件
sbit P1_0=P1^0; //設(shè)置鍵
sbit P1_1=P1^1; //增一鍵
sbit P1_2=P1^2; //減一鍵
sbit P1_3=P1^3; //確定鍵
unsigned char data shan_val; //閃爍時(shí)LED的開(kāi)/關(guān)狀態(tài)
unsigned char data cnt_val; //保存倒計(jì)數(shù)的當(dāng)前值
unsigned int data T1_cnt; //保存定時(shí)器溢出次數(shù)
unsigned char data key_val_new,key_val_old;//存放當(dāng)前掃描的鍵和前一次按下的鍵值
unsigned char data state_val; //狀態(tài)值
unsigned char data show_val; //存放需要在數(shù)碼管顯示的數(shù)字
unsigned char data init_val; //暫存倒計(jì)數(shù)的初始值
char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//----------延時(shí)--------------
void delay(unsigned int i) //大約延時(shí)i*2個(gè)微秒
{ while(--i);}
//-----------按鍵掃描-------------
unsigned char scan_key()
{ unsigned char i;
i=P1&0x0f;
delay(100); //延時(shí),去抖動(dòng)
if (i==(P1&0x0f))
{ if (P1_0==0)
{ i=1; }
else
{ if (P1_1==0)
{ i=2;}
else
{ if (P1_2==0)
{ i=3;}
else
{ if (P1_3==0)
{ i=4;} }
} } }
else
{ i=255; }
return i;
}
//---------數(shù)碼管顯示---------------
void led_show(unsigned int v)
{
unsigned char i;
if (state_val!=2) //動(dòng)態(tài)掃描
{i=v%10; //取要顯示的數(shù)的個(gè)位
P0=led_seg_code[i]; //轉(zhuǎn)換為7段碼
P2=0xfe; //顯示個(gè)位
delay(15); //延時(shí)
i=v%100/10; //取十位
P0=led_seg_code[i]; //轉(zhuǎn)換為7段碼
P2=0xfd; //顯示十位
delay(5); //延時(shí)
}
else
{ P0=led_seg_code[0]; //處于閃爍狀態(tài)
if (shan_val)
{ P2=0xff; } //將數(shù)碼管的關(guān)閉
else
{ P2=0xfc; } //將數(shù)碼管的打開(kāi)
}
}
//----------定時(shí)器T1中斷服務(wù)程序---------------
void timer1() interrupt 3 //T1中斷,250us中斷一次
{ T1_cnt++;
switch (state_val)
{ case 0:
if(T1_cnt>3999) //如果計(jì)數(shù)>3999, 計(jì)時(shí)1s
{ T1_cnt=0;
if(cnt_val!=0)
{ cnt_val--;}
else
{state_val=2;} //定時(shí)計(jì)數(shù)到0時(shí),切換狀態(tài)
show_val=cnt_val;
}
break;
case 2:
if(T1_cnt>1999) //如果計(jì)數(shù)>1999, 計(jì)時(shí)0.5s
{ T1_cnt=0; shan_val=!shan_val; } //閃爍狀態(tài)
break;
}
}
//---------主程序----------------
main()
{init_val=59; //初始化各變量
cnt_val=init_val;
show_val=cnt_val;
state_val=0;
key_val_old=255;
T1_cnt=0;
shan_val=0; //初始化51的寄存器
TMOD=0x20; //用T1計(jì)時(shí) 8位自動(dòng)裝載定時(shí)模式
TH1=0x19; //250微秒溢出一次; 250=(256-x)*12/11.0592 -> x= 230.4
TL1=0x19;
EA=1; //打開(kāi)總中斷允許
ET1=1; //開(kāi)中斷允許
TR1=1; //開(kāi)定時(shí)器T1
while(1)
{ key_val_new=scan_key(); // 255表示無(wú)鍵按下
if (key_val_new!=key_val_old)
{ // 只有當(dāng)前掃描的鍵值與上次掃描的不同,才判斷是有鍵按下
key_val_old=key_val_new;
switch (key_val_new)
{ case 1: //設(shè)置鍵
state_val=1; //處于設(shè)置狀態(tài)
TR1=1; //停止計(jì)時(shí)
show_val=init_val; //顯示原來(lái)的倒計(jì)數(shù)初始值
break;
case 2: if(state_val==1) //只有在設(shè)置狀態(tài),增1鍵才有用
{ if (init_val>0) //更改原來(lái)的倒計(jì)數(shù)初始值
{init_val--; }
else
{init_val=59;}
show_val=init_val;//顯示更改后的倒計(jì)數(shù)初始值
}
break;
case 3: if(state_val==1) //只有在設(shè)置狀態(tài),減1鍵才有用
{ if (init_val<59) //更改原來(lái)的倒計(jì)數(shù)初始值
{init_val++; }
else
{init_val=0;}
show_val=init_val; //顯示更改后的計(jì)數(shù)初始值
}
break;
case 4: if(state_val!=0) //如果已處于計(jì)數(shù)模式,確認(rèn)鍵不起作用
{ cnt_val=init_val; //將初始值賦給計(jì)數(shù)變量
show_val=cnt_val; //將計(jì)數(shù)變量的數(shù)字顯示
TR1=1; //啟動(dòng)定時(shí)器T1
state_val=0; //將狀態(tài)切換為計(jì)數(shù)模式
}
break;
}
}
led_show(show_val); //動(dòng)態(tài)掃描
}
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉