0db2c9ca7bcb0a46bad765d06963f6246a60af27.jpg (213.18 KB, 下載次數: 48)
下載附件
倒計時
2019-5-25 00:06 上傳
一、實驗目的
1、掌握數碼管顯示原理
2、理解中斷系統的工作原理
3、學會數碼管顯示和中斷系統結合使用
二、實驗步驟
1、連接線路:
USB轉串口與電腦連接
電源模塊與電腦連接
將單片機的IO(P0)口與開發板的P7連接
P1口與流水燈(開發板插針p1)用一根導線連接
2、使用keil uvison4軟件編寫、編譯程序
①新建工程:
點擊“Project”菜單選擇“New uVision Project”選項后填寫新建立的工程名(流水燈)后保存到某個文件夾下,在彈出的對話框里選擇MCU型號(此處我們選STC公司的STC89C52),右邊Description列表框中顯示MCU的基本說明,單擊“OK”按鈕。
②設置工程:
右擊窗口左側“Target 1”,在彈出的快捷菜單中點擊“Options for ‘Target 1’”命令,在彈出的對話框中點擊“Output”選項卡,在“Create HEX File”選項前的方框內打勾 (輸出HEX文件),單擊“Ok”結束。選中‘Target’選項,修改Xtal(MHZ) 為11.0592。
③新建源程序文件:
選“File”下拉菜單中的“New”命令,打開程序編輯窗口輸入編輯源程序(流水燈.c),然后單擊工具欄的“保存”按鈕保存文件(匯編源程序:文件名.asm; C源程序:文件名.c)。
④為工程添加源文件:
單擊“Target 1”前面的+號,展開里面的內容“Source Group 1”;右擊“Source Group 1”,在彈出的快捷菜單中選擇“Add Files to Group ‘Source Group 1’”命令;選擇剛才的文件,文件類型選擇“C Source file(*.c)”,單擊“Add”按鈕后點擊“Close”按鈕。
⑤下載、調試:
編譯成功后,用串口助手將.HEX文件下載到單片機內部ROM中運行,在運行過程中若發現錯誤要重新修改程序,并編譯后再下載運行。
3、程序下載
①打開串口下載軟件,“MCU Type”下拉菜單下選擇MCU的類型,此處選擇“STC89C5X、RD+”系列的“STC89C52RC”;
②點擊“打開程序文件”按鈕,找到MCU運行的“HEX”文件所在的文件夾,打開該“HEX”文件;
③在COM下拉菜單中找到安裝的串口標號,各個USB口的串口標號不同,具體標號需要查詢;其它選項選擇默認(但是第一次下載失敗,因為波特率太高了,把最高波特率改為4800后就操作成功了);
④點擊“Down/下載”按鈕,關掉開發板電源,然后稍等片刻打開電源(冷啟動),等待下載完成即可。
三、拓展任務
·拓展功能:左邊第一個數碼管進行九秒倒計時,結束后數碼管滅,一個LED燈亮。
程序代碼實現:
#include<reg51.h>
#define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
sbit LATCH1=P2^6;//定義鎖存使能端口 段鎖存
sbit LATCH2=P2^7;// 位鎖存
unsigned char code dofly_DuanMa[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
// 顯示段碼值01234567
unsigned char code dofly_WeiMa[]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe};
//分別對應相應的數碼管點亮,即位碼
char i=20;
unsigned char j=0;
void main ()
{
TMOD=0x01; //定時器T0為方式1
TH0=0x4c; //設置定時器初值
TL0=0x00;
DataPort=dofly_WeiMa[j]; //取位碼
LATCH2=1; //位鎖存
LATCH2=0;
DataPort=dofly_DuanMa[j]; //取顯示數據,段碼
LATCH1=1; //段鎖存
LATCH1=0;
EA=1; //總中斷開
ET0=1; //開T0中斷
TR0=1; //啟動T0
while(1); //循環等待
{
;
}
}
void timer0() interrupt 1 //T0中斷程序
{
TH0=0x4c; //重新賦初值
TL0=0x00;
i--; //循環次數減1
if(i<=0)
{
DataPort=dofly_WeiMa[j+1]; //取位碼
LATCH2=1; //位鎖存
LATCH2=0;
DataPort=dofly_DuanMa[j+1]; //取顯示數據,段碼
LATCH1=1; //段鎖存
LATCH1=0;
j++;
if(10==j){
P1=0xfe;
}
i=20; //重置循環次數
}
}
|