資源簡介
基本要求:利用定時計數器,設計一個電子時鐘,可以先編寫顯示子程序。從左到右依次顯示時分秒。有兩種方法實現,一種是在中斷程序中計數,產生時分秒計數,送顯示緩沖區。另一種是中斷程序每一秒清除一個位變量,而主程序通過監視位變量的變化來知道每秒的時間。
進而要求:
1. 加入時間調整程序,使用兩個或三個按鈕,調節當前的時間。類似平常使用的 電子表。可以讓正在調整的位閃爍顯示。
2. 可以加入一個鬧鐘鐘設置,當所定的時間到時,產生斷續的蜂鳴聲。
可以加入日歷的功能。
鄭旅軍原創,謝絕抄襲,可以借鑒
進而要求:
1. 加入時間調整程序,使用兩個或三個按鈕,調節當前的時間。類似平常使用的 電子表。可以讓正在調整的位閃爍顯示。
2. 可以加入一個鬧鐘鐘設置,當所定的時間到時,產生斷續的蜂鳴聲。
可以加入日歷的功能。
鄭旅軍原創,謝絕抄襲,可以借鑒
代碼片段和文件信息
#include?“reg51.h“
#include?“absacc.h“
//以下是鍵碼定義
//?鍵碼表?????????????????????????//????對應鍵位:
//?0x700x710x720x730x740x75?//?7?8?9?A?MODE?RESET
//?0xb00xb10xb20xb30xb40xb5?//?4?5?6?B?MOVE?MON
//?0xd00xd10xd20xd30xd40xd5?//?1?2?3?C?HERE?LAST
//?0xe00xe10xe20xe30xe40xe5;?//?0?F?E?D?EXEC?NEXT
unsigned?char?led[10]={0x3F0x060x5B0x4F0x660x6D0x7D0x070x7F0x6F};//從0~9的LED編碼
unsigned?char?ledchar[3]={0x5c0x540x71};//o?n?f??鬧鐘狀態指示
//以下是系統地址
#define?base_ADDRESS?0x8000?//選通基地址
#define?LINE_ADDRESS?base_ADDRESS+1?//鍵盤行線地址
#define?COLU_ADDRESS?base_ADDRESS+2?//鍵盤列線地址
#define?LED_SEG?base_ADDRESS+4?//數碼管段選地址
#define?LED_BIT?base_ADDRESS+2?//數碼管位選地址
//以下是3種功能定義
#define?CLOCK?clockstr?//時鐘
#define?ALART?alartstr?//鬧鐘
#define?DATE?datestr?//日期
//以下是所有子函數的聲明
void?init(void);?//系統的初始化函數
void?display(void);?//刷新一次數碼管函數
void?clockplus(void);?//時間加1S的子函數
void?update_clockstr(void);?//更新時間顯示編碼
void?update_alartstr(void);?//更新鬧鐘時間的顯示編碼
void?update_datestr(void);?//更新日期顯示編碼
void?deley(int);?//延時子程序
void?update_dispbuf(unsigned?char?*);?//更新顯示緩沖區
unsigned?char?getkeycode(void);?//獲取鍵值子程序
void?keyprocess(unsigned?char);?//鍵值處理子程序
unsigned?char?getmonthdays(unsigned?intunsigned?char);//計算某月的天數子程序
//功能鍵功能子函數
void?MODE(void);?//切換3種工作模式
void?MOVE(void);?//設置位選擇
void?NEXT(void);?//當前設置位+1
void?LAST(void);?//當前設置位-1
struct{?//時間結構體變量
unsigned?char?s;
unsigned?char?m;
unsigned?char?h;
}clock={000};
struct{?//鬧鈴時間結構體變量
unsigned?char?m;
unsigned?char?h;
}alart={00};
struct{?//日期結構體變量
unsigned?int?year;
unsigned?char?month;
unsigned?char?day;
}date={9611};
unsigned?char?dispbuf[6];?//顯示緩沖區數組
unsigned?char?clockstr[6];?//時間顯示的數碼管編碼數組
unsigned?char?alartstr[6];?//鬧鐘顯示的數碼管編碼數組
unsigned?char?datestr[6];?//日期顯示的數碼管編碼數組
unsigned?int?itime=0;?//定時器0中斷計數
sbit?alarm=P1^0;?//外接蜂鳴器的管腳
bdata?bit?Alart_EN=0;?//鬧鈴功能允許位?0:禁止鬧鈴?1:允許鬧鈴
bdata?bit?IsBeep=0;?//響鈴標志位?0:未響鈴?1:正在響鈴
bdata?bit?IsSet=0;?//設置模式標志位?0:正常走時?1:設置模式
#define?SECOND?0?//對應數碼管右邊兩位
#define?MINUTE?1?//對應數碼管中間兩位
#define?HOUR?2?//對應數碼管左邊兩位
unsigned?char?SetSelect=0;?//在設置模式IsSet=1時,正在被設置的位對應上面3個宏定義
unsigned?char?*Fun;?//標志當前正設置的功能
//*************************函數部分************************
void?main(void)
{
init();
while(1)
{
XBYTE[COLU_ADDRESS0x00];?//給鍵盤列線賦全零掃描碼,判斷是否有鍵按下
while((XBYTE[LINE_ADDRESS]&0x0f)==0x0f)?//檢測是否有鍵按下,無則一直進行LED的刷新顯示
{
if(Alart_EN&&(clock.h==alart.h)&&(clock.m==alart.m))?
{
IsBeep=1;
}
else
{?
IsBeep=0;
alarm=0;
}
display();
}
keyprocess(getkeycode());?//有鍵按下時得到鍵值,并送入鍵值處理程序
}
}
void?init(void)
{
TMOD=0x02;?//定時器0設置為工作方式2基準定時250×2=500us=0.5ms
TH0=0x06;?//定時器0中斷服務用來產生1秒時鐘定時及鬧鐘蜂鳴器蜂鳴脈沖
TL0=0x06;
ET0=1;
EA=1;
TR0=1;
update_clockstr();?//初始化時鐘顯示編碼數組
update_alartstr();?//初始化鬧鐘顯示編碼數組
update_datestr();?//初始化日期顯示編碼數組
Fun=CLOCK;?//默認的顯示摸式為時鐘
update_dispbuf(Fun);//初始化顯示緩沖數組
alarm=0;?//蜂鳴器接線引腳復位
}
void?time
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????343040??2009-06-17?12:57??鄭旅軍?實驗六?秒表程序報告.doc
?????文件??????10361??2009-06-10?21:26??e_clock.c
-----------?---------??----------?-----??----
???????????????353401????????????????????2
- 上一篇:改進的BP神經網絡算法
- 下一篇:單片機做的6位時分秒數字鐘
評論
共有 條評論