單片機(jī)實驗說明<三>數(shù)碼管和定時器基本使用
實驗三(上) 數(shù)碼管動態(tài)顯示設(shè)計
設(shè)計要求:
編程實現(xiàn)8段數(shù)碼管的動態(tài)掃描顯示,要求4個數(shù)碼管從左到右分別顯示“1”、“2”、“3”、“4”、及“A”、“b”、“C”、“d”。
電路設(shè)計:
軟件代碼:
/*****************************************************************************
* 頭文件 *
*****************************************************************************/
#include "hml/hml.h"
#define LSA P1_5
#define LSB P1_6
#define LSC P1_7
unsigned char smgduan[]={0xf9,0xa4,0xb0,0x99,0x88,0x83,0xc6,0xa1};
//共陽極的顯示代碼表1,2,3,4,A,b,C,d
/*****************************************************************************
* 初始化和功能函數(shù) *
*****************************************************************************/
void sys_init(void)
{
LSA = 0;
LSB = 0;
LSC = 0;
}
void LedScan(unsigned char pos,unsigned char dispcode)
{
unsigned char i;
for(i=0;i<=pos;i++)
{
switch(pos) //位選,選擇點亮的數(shù)碼管,
{
case(0):
LSA=1;LSB=0;LSC=0; break; //顯示
case(1):
LSA=0;LSB=1;LSC=0; break; //顯示第1位
case(2):
LSA=1;LSB=1;LSC=0; break; //顯示第2位
case(3):
LSA=0;LSB=0;LSC=1; break; //顯示第3位
}
P0=dispcode; //發(fā)送段碼
}
}
/*****************************************************************************
* 主函數(shù) *
*****************************************************************************/
void main(void)
{
sys_init();
int i=0,j=500;
while(j--)
{
for(i=0;i<4;i++)
{
LedScan(i,smgduan[3-i]);
sleep(1);
}
}
j=500;
while(j--)
{
for(i=0;i<4;i++)
{
LedScan(i,smgduan[7-i]);
sleep(1);
}
}
}
思考題:
1.何謂數(shù)碼管的動態(tài)顯示,其原理是什么?
2.若要實現(xiàn)秒表從 0.0s 秒到 9.9s 循環(huán)顯示,請寫出實現(xiàn)的思路或代碼?
實驗三(下) 2位倒計時設(shè)計(團(tuán)隊課題)
設(shè)計要求:
編寫實驗程序,實現(xiàn)59秒倒計時功能,初始狀態(tài)數(shù)碼管最后兩位顯示數(shù)字“59”,要求定時器0每10ms產(chǎn)生一次中斷,在定時中斷服務(wù)程序里進(jìn)行計數(shù),計數(shù)滿一秒,數(shù)碼管顯示相應(yīng)減1,倒計時結(jié)束時,數(shù)碼管顯示“00”,并以周期1秒進(jìn)行閃爍;按鍵可以控制計數(shù)器的啟動和暫停。
電路設(shè)計:
自主完成。
軟件代碼:
/*****************************************************************************
* 頭文件 *
*****************************************************************************/
#include "hml/hml.h"
#define LSA P1_5
#define LSB P1_6
#define LSC P1_7
unsigned int cnt=0;
unsigned char T0RH = 0; //T0 重載值的高字節(jié)
unsigned char T0RL = 0; //T0 重載值的低字節(jié)
signed char sec;
signed char sec_all=19;
signed char count=0;
unsigned char smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x0f8,0x80,0x90};
//共陽極的顯示代碼表0~9
void EXINT0() __interrupt 0;
void Timer0() __interrupt 1;
/*****************************************************************************
* 初始化和功能函數(shù) *
*****************************************************************************/
/* 配置T0, ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時變量
tmp = 11059200 / 12; //定時器計數(shù)頻率
tmp = (tmp * ms) / 1000; //計算所需的計數(shù)值
tmp = 65536 - tmp; //計算定時器重載值
tmp = tmp + 18; //補償中斷響應(yīng)延時造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 為模式 1
TH0 = T0RH; //加載 T0 重載值
TL0 = T0RL;
ET0 = 1; //使能 T0 中斷
}
void EXINT0() __interrupt 0
{
count++;
}
void Timer0() __interrupt 1
{
TH0 = T0RH; //重新加載重載值
TL0 = T0RL;
cnt++; //中斷次數(shù)加1
if (cnt >= 100) //中斷100次=1s
{
cnt = 0;
sec--;
if (sec < 0) //當(dāng)顯示值到0后,閃爍
{
sec = 0;
}
}
}
void LedScan(unsigned char pos,unsigned char dispcode)
{
unsigned char i;
for(i=0;i<=pos;i++)
{
switch(pos) //位選,選擇點亮的數(shù)碼管,
{
case(0):
LSA=1;LSB=0;LSC=0; break; //顯示
case(1):
LSA=0;LSB=1;LSC=0; break; //顯示第1位
case(2):
LSA=1;LSB=1;LSC=0; break; //顯示第2位
case(3):
LSA=0;LSB=0;LSC=1; break; //顯示第3位
}
P0=dispcode; //發(fā)送段碼
}
}
void sys_init(void)
{
LSA = 0;
LSB = 0;
LSC = 0;
cnt = 0; //中斷次數(shù)計數(shù)器
sec = sec_all; //秒數(shù)初值
ConfigTimer0(10); //配置 T0 定時 10ms
EA=1; //開中斷
IT0=0;
EX0=1;
// IT1=1;
// EX1=1;
// PX1=1;
TR0=1;
}
/*****************************************************************************
* 主函數(shù) *
*****************************************************************************/
void main(void)
{
sys_init();
while(1)
{
if(count%2==0)
{
TR0 = 1;
}
else
{
TR0 = 0;
}
if((cnt>49)&&(sec==0))
{
LedScan(0,0xff); //顯示個位值
LedScan(1,0xff); //顯示個位值
}
else
{
LedScan(0,smgduan[sec%10]); //顯示個位值
LedScan(1,smgduan[sec/10]); //顯示十位值
}
}
}
思考題:
1.畫出主程序和定時中斷流程圖;
2.加入獨立鍵盤的兩個按鍵(自選),其中一個按鍵實現(xiàn)復(fù)位,即按下后馬上回到顯示“19”;另一個按鍵實現(xiàn)暫停和啟動功能,即按一下后暫停,再按一下后啟動。
IDE 單片機(jī) 電商家電數(shù)碼
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。