單片機計時器課程設計
Ⅰ 智能電子鍾,單片機課程設計,急!!!!!!
問題1:需要用單片機定時器中斷,內建一個實時時鍾(考察的是學生對單片機定時器中斷的認識),並根據提前設置的時刻作為鬧鈴的觸發事件,當實時時鍾的時,分,秒與鬧鈴時刻設置的時,分,秒數值相同時,單片機輸出一個有效電平,觸發鬧鈴.
問題2:問題1中鬧鈴功能的擴展,需要做幾個"鬧鈴"時刻,並分別控制不同的IO口輸出有效電平,如果允許有線控制的話(相信你們老師最後會在你的百般糾纏下妥協成允許用有線的^^)IO口接幾個繼電器即可,或直接用LED做虛擬演示就行.
要是非要用無線控制的話,有2種解決方案:
1種是只對具有紅外遙控功能的家電起作用,此時需要對遙控器的一些按鍵進行解碼,然後由單片機存儲後,在"鬧鈴"時驅動紅外線發射管編碼輸出.
另1種是用無線模塊,市場上有賣的,編碼解碼晶元是2262,2272的有地址編碼的那種,然後你就買一套發射的N套接收的,這種模塊收發端一般有都有4路單向IO,工作時接收端的4個埠狀態同步於發射端4個埠的狀態.發射端模塊的4路輸入口直接接單片機的輸出,至於接收端,如果只有4個以下的設備,就只買4個接收模塊,每個接收模塊只用到1個模塊的輸出口,舉例說明:每個模塊有4個輸出口,分別編號1234,然後每個家電設備分配一個模塊的一個輸出口,如電視機分配1號輸出口,電風扇分配2號輸出口.....,當然,4個接收模塊都必須用同一個接收地址,接收模塊的輸出直接接1個發光二極體演示即可.如果超過4個就比較麻煩了,需要加入邏輯電路處理,在這里就不討論了.
問題3:前面有高手提示用液晶,但以我看來,此要求是為了考察學生對數碼管動態掃描技術的了解,所以還是用數碼管吧,用2個4位一體的數碼管即可顯示完時-分-秒 ,00-00-00正好8位.
最後給這位MM忠告:對自己不善長且以後也不想擅長的東西來說不要太較真了,直接去找你們學校科協,變相賄賂一下某某部長或主席,他會幫你解決問題的~呵呵.
Ⅱ 課程設計:單片機設計一個完整的時鍾
S_SET BIT P3.2 ;數字鍾秒控制位
M_SET BIT P3.3 ;分鍾控制位
H_SET BIT P3.4 ;小時控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
TCNT EQU 34H
ORG 00H
SJMP START
ORG 0BH
LJMP INT_T0
START: MOV DPTR,#TABLE
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H
MOV TH0,#(65536-50000)/256 ;定時50毫秒
MOV TL0,#(65536-50000)MOD 256
MOV IE,#82H
SETB TR0
;****************************************************
;判斷是否有控制鍵按下,是哪一個鍵按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
LJMP A1
S1: LCALL DELAY ;去抖動
JB S_SET,A1
INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判斷是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1
K1: INC MINUTE ;分鍾值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判斷是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1
K2: INC HOUR ;小時值加1
MOV A,HOUR
CJNE A,#24,J2 ;判斷是否加到24小時
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
LJMP A1
;****************************************************
;等待按鍵抬起
J0: JB S_SET,A1
LCALL DISPLAY
SJMP J0
J1: JB M_SET,A1
LCALL DISPLAY
SJMP J1
J2: JB H_SET,A1
LCALL DISPLAY
SJMP J2
;***********************************************
;定時器中斷服務程序,對秒,分鍾和小時的計數
INT_T0: MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)MOD 256
INC TCNT
MOV A,TCNT
CJNE A,#40,RETUNE ;計時1秒
INC SECOND
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#25,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE: RETI
;******************************************
;顯示控制子程序
DISPLAY: MOV A,SECOND ;顯示秒
MOV B,#10
DIV AB
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.6
MOV A,B
CLR P2.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.7
CLR P2.5
MOV P0,#40H
LCALL DELAY
SETB P2.5
MOV A,MINUTE ;顯示分鍾
MOV B,#10
DIV AB
CLR P2.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.3
MOV A,B
CLR P2.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.4
CLR P2.2
MOV P0,#40H
LCALL DELAY
SETB P2.2
MOV A,HOUR ;顯示小時
MOV B,#10
DIV AB
CLR P2.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.0
MOV A,B
CLR P2.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DELAY: MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
運行過~~!!!
Ⅲ 單片機課程設計 電子時鍾 怎麼做
你需要怎麼做~~ 用定時中斷~ 還是用時鍾晶元,顯示用數碼管還是LCD
Ⅳ 單片機數字時鍾課程設計
這個 我正在學單片機,也剛剛做過了這個實驗沒多久,不過我的是8098單片機,確實是匯編語言。不過我做的僅僅是個電子鍾,你可以隨時改變你輸入的時間然後它就會按時分秒跳動,我做的是24小時制的。不過我沒有弄鬧鍾額……不過也簡單,可以弄一個中斷申請就ok。話說你的鬧鍾要求是什麼?我記得8098是不能響的,只有一個發光二極體可以亮一亮……
話說能請你把問題補充一下么?我的程序寫在紙上,然後我們還要求是要把程序翻譯出機器碼然後在單片機上實驗出結果的。所以我連機器碼都翻譯了的……實在不知道你們的要求。
原理可以先和你說一下:主程序先是一系列的初始化(中斷懸掛的清零和寄存器的設置,堆棧的設置等),然後開啟中斷,寫顯示程序(顯示程序前要弄好你顯示的寄存器以及掃描子程序的地址,還要對十六進制數進行轉換變成十進制數,只要做一個除法就行,用十六進制數除以A就能夠得出相應的十進制數。)
然後就是你的中斷程序了,比如你的中斷申請是每10ms申請一次,那你就計數,如果到了100次中斷了,那就秒加一,再查看秒是否到60,是則清零讓分加一,否則跳到中斷程序末端;然後再依次查分和時。最後中斷程序的末端還要用一次計時器軟體中斷申請。再跳回主程序反復運行。可能比較麻煩,我記得我打的草稿就好多張紙呢,後來在16進制向10進制轉換的時候還出了個寄存器的問題。
不知道和你程序的要求是否相同= =。
期待你能夠補充一下你的問題。
Ⅳ 單片機89c51的電子時鍾課程設計
#include <reg52.h>
#include<stddef.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_FLAG
#define LCD1602_PORT P0
sbit lcd1602_rs=P2^0;
sbit lcd1602_e=P2^2;
sbit lcd1602_rw=P2^1;
sbit lcd1602_busy=P0^7;
sbit key_ch=P3^5;
sbit key_add=P3^6;
sbit key_minus=P3^7;
uchar i,sec,min,h,date,month,flag;
uint year;
uchar *chgstr[7]={" ","sec","min","hour","date","min","year"};
uchar j,k,m,n,o,p;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar timestr[10],datestr[10];
void init();
void delay(uint);
void time_display();
void date_display();
void control();
void time();
/*
************************************
* 函數名稱:lcd1602_CheckBusy()
* 函數功能:狀態查詢
************************************
*/
void lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
* 函數名稱: lcd1602_WriteCmd()
* 函數功能:寫命令
* 入口參數:命令字
* 出口參數:無
***************************************
*/
void lcd1602_WriteCmd(const uchar cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
* 函數名稱:lcd1602_WriteData()
* 函數功能:寫數據
* 入口參數:c--待寫數據
* 出口參數:無
*********************************************
*/
void lcd1602_WriteData(const uchar c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
* 函數名稱:lcd1602_Init()
* 函數功能:初始化LCD
* 入口參數:無
* 出口參數:無
***********************************************
*/
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣
lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,
lcd1602_WriteCmd(0x06); //flag move to right,screen don't move
lcd1602_WriteCmd(0x01); //clear screen
}
/*
************************************************
* 函數名稱:lcd1602_Display()
* 函數功能: 字元顯示
* 入口參數:ptr--字元或字元串指針
* 出口參數:無
* 說 明:用戶可通過以下方式來調用:
* 1)lcd1602_Display("Hello,world!");
* 2) INT8U 存儲類型 txt[]="要顯示的字元串";
* 或者 INT8U 存儲類型 txt[]={'t','x','t',..,'