張桂銘
摘 要:本項(xiàng)目教學(xué)難點(diǎn)是:1、定時(shí)器的應(yīng)用;2、時(shí)、分、秒如何計(jì)數(shù)及怎樣顯示在數(shù)碼管上。本例沒(méi)有應(yīng)用時(shí)鐘芯片,而是利用51系列單片機(jī)的定時(shí)器T1的自動(dòng)重裝的方式1功能實(shí)現(xiàn)了精確的1ms和1s的定時(shí)基準(zhǔn)的產(chǎn)生,其中1ms為最基本的定時(shí)時(shí)基,用于6位共陰動(dòng)態(tài)LED的掃描刷新之外,還通過(guò)sCounter軟計(jì)數(shù)變量用于1000次的1ms計(jì)數(shù)產(chǎn)生1s 精確的秒定時(shí)時(shí)基,用于基本計(jì)數(shù)時(shí)鐘源。本例采用云龍單片機(jī)實(shí)驗(yàn)板及C語(yǔ)言編程實(shí)現(xiàn)。
關(guān)鍵詞:數(shù)字電子鐘;精確定時(shí);數(shù)碼管動(dòng)態(tài)掃描;時(shí)鐘顯示的原理
在中職生單片機(jī)教學(xué)中需要突破的教學(xué)難點(diǎn)很多,而且涉及C語(yǔ)言編程,電子元件及模塊的應(yīng)用,電路原理等多項(xiàng)問(wèn)題,相對(duì)于中職生來(lái)說(shuō),在興趣的培養(yǎng)教學(xué)方面和簡(jiǎn)單易懂的原則教學(xué)問(wèn)題上都有著較大的挑戰(zhàn),是比較值得鉆研的教學(xué)難題,固此在這闡述一下我在教學(xué)中遇到的問(wèn)題,為進(jìn)一步探討和簡(jiǎn)化中職生單片機(jī)教法吸取經(jīng)驗(yàn)。
本例學(xué)生用到的實(shí)驗(yàn)板原理圖如下:
一、數(shù)碼管圖塊
二、單片機(jī)圖塊
三、數(shù)碼管段選和位選控制的鎖存器圖塊
實(shí)例中單片機(jī)晶振選擇的頻工作頻率為12MHz,定時(shí)器的最小計(jì)數(shù)時(shí)間為1us,調(diào)試參考程序如下:
#include
sfr P0M1 = 0x95; //--- 新增的功能寄存器地址聲明 ---
sfr P0M0 = 0x96;
unsigned char code LEDSEG[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,};//--- 顯示0~9,A~F筆段代碼表 ---
unsigned char code LEDDIG[] =
{ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,};
unsigned char LEDBuffer[6];//--- 定義的顯示緩沖區(qū) ---
unsigned char LEDPointer; //--- 定義的掃描計(jì)數(shù)變量 ---
unsigned int sCount; //--- 定義的秒計(jì)數(shù)器變量 ---
unsigned char Second; //--- 定義的秒變量 ---
unsigned char Minute; //--- 定義的分變量 ---
unsigned char Hour; //--- 定義的時(shí)變量 ---
void main(void)
{
P0M1 = 0x00; //--- 配置P5端口的P0.0~P0.7為推挽輸出模式 ---
P0M0 = 0xFF;
TMOD = 0x10; //--- 配置T1為定時(shí)模式,工作于方式1,16位裝載模式 ---
TH1 = (65536 - 1000) / 256; //--- 初始化T1定時(shí)1mS ---
TL1 = (65536 - 1000) % 256;
TR1 = 1; //--- 啟動(dòng)T1工作 ---
ET1 = 1; //--- 使能T1中斷 ---
EA = 1; //--- CPU開(kāi)中斷 ---
while(1)
{
}
}
sbit dula=P2^6;
sbit wela=P2^7;
//--------------------------------------------------------------------------------------
//--- 定時(shí)器T1溢出中斷服務(wù)程序 ---
void T1_ISR(void) interrupt 3
{
TH1 = (65536 - 1000) / 256; //--- 初始化T1定時(shí)1mS ---
TL1 = (65536 - 1000) % 256;
dula=1;
P0 = LEDSEG[LEDBuffer[LEDPointer]];//數(shù)碼管顯示段選碼
dula=0;
wela=1; //--- 顯示數(shù)字 ---
P0 = LEDDIG[LEDPointer];
wela=0; //--- 數(shù)碼管的位選段選擇 ---
LEDPointer++; //--- 動(dòng)態(tài)掃描計(jì)數(shù)變量加1 ---
if(sizeof(LEDBuffer)==LEDPointer)LEDPointer = 0; //--- 所有數(shù)碼管掃描完,計(jì)數(shù)歸0 ---
sCount ++; //--- 秒計(jì)數(shù)變量加1 ---
if(1000 == sCount)
//--- 定時(shí)1秒時(shí)間到 ---
{
sCount = 0; //--- 秒計(jì)數(shù)變量清0
Second ++; //--- 秒變量加1 ---
if(60 == Second //--- 計(jì)滿60秒 ---
{
Second = 0; //--- 秒變量清0 ---
Minute ++; //--- 分變量加1 ---
if(60 == Minute)//--- 分計(jì)滿60 ---
{
Minute = 0; //--- 分變量清0 ---
Hour ++; //--- 時(shí)變量加1 ---
if(24 == Hour)
Hour = 0;
//--- 時(shí)計(jì)滿24則時(shí)變量清0 ---
}
}
LEDBuffer[5] = Second % 10;
//--- 秒變量裝顯示緩沖區(qū) ---
LEDBuffer[4] = Second / 10;
LEDBuffer[3] = Minute % 10;
//--- 分變量裝顯示緩沖區(qū) ---
LEDBuffer[2] = Minute / 10;
LEDBuffer[1] = Hour % 10;
//--- 時(shí)變量裝顯示緩沖區(qū) ---
LEDBuffer[0] = Hour / 10;
}
}
其中定時(shí)器中斷初始化程序應(yīng)完成如下工作:
1.對(duì)TMOD賦值,以確定T0和T1的工作方式。
2.計(jì)算初值,并將其寫入TH0、TL0或TH1、TL1。
3.使TR0或TR1置位,啟動(dòng)定時(shí)/計(jì)數(shù)器定時(shí)或計(jì)數(shù)。
4.中斷方式時(shí),則對(duì)IE賦值,開(kāi)放中斷。
5.開(kāi)總中斷。
TMOD = 0x10; //---對(duì)TMOD賦值,配置使用定時(shí)器T1,工作于方式1,因?yàn)閱纹瑱C(jī)使用12MHz 晶振,機(jī)器周期為1us。
TH1 = (65536 - 1000) / 256; //定時(shí)器裝初值,1000us=1ms
TL1 = (65536 - 1000) % 256;
TR1 = 1; //--- 啟動(dòng)定時(shí)器T1
ET1 = 1; //--- 使能定時(shí)器T1中斷
EA = 1; //--- CPU開(kāi)中斷(開(kāi)總中斷)
以上是定時(shí)器初始化在程序的編寫上的5個(gè)步驟, 在C語(yǔ)言程序的編寫中是按這5個(gè)對(duì)應(yīng)的步驟實(shí)現(xiàn)的,其中對(duì)特殊功能寄存器的設(shè)置及特殊功能寄存器中相應(yīng)位的開(kāi)啟請(qǐng)注意查閱相關(guān)知識(shí)點(diǎn)。例于對(duì)TMOD的賦值
是對(duì)上面表格的各位的設(shè)置實(shí)現(xiàn)的。而開(kāi)定時(shí)器是對(duì)下表TCON寄存器TR1的設(shè)置。
因此關(guān)于單片機(jī)定時(shí)器的應(yīng)用我本人認(rèn)為還要利用多媒體投影,邊復(fù)習(xí)前面的內(nèi)容,邊編寫相應(yīng)的程序,否則學(xué)生也許越聽(tīng)越感覺(jué)困難,談不上突破這一難點(diǎn)了。
關(guān)于數(shù)字時(shí)鐘的時(shí)、分、秒如何計(jì)數(shù)并顯示在數(shù)碼管上也是本例的難點(diǎn),例 LEDBuffer[5] = Second % 10;
LEDBuffer[4] = Second / 10;
//--- 秒變量裝顯示緩沖區(qū) ---,是因?yàn)檫@是最后兩個(gè)數(shù)碼管,LEDBuffer[4]是秒的十分位,LEDBuffer[5]是秒的個(gè)位,所以個(gè)位要求余,十分位要求模得以實(shí)現(xiàn)??勺寣W(xué)生反復(fù)實(shí)訓(xùn)調(diào)試讓該難點(diǎn)得到突破。
單片機(jī)原理與應(yīng)用是對(duì)中職學(xué)生來(lái)說(shuō)是比較深?yuàn)W的學(xué)科,需要反得實(shí)踐,反得學(xué)習(xí)編程和調(diào)試,并要結(jié)合電子器件的工作原理一步步學(xué)習(xí),才能突破一個(gè)個(gè)難點(diǎn),從而使知識(shí)技能獲得一定的進(jìn)階。
參考文獻(xiàn):
[1]MCS-51單片機(jī)C語(yǔ)言編程100例 孫安青編著;2、云龍單片機(jī) 網(wǎng)絡(luò)教程.