當前位置:首頁 » 課程大全 » 單片機計時器課程設計

單片機計時器課程設計

發布時間: 2020-11-29 03:13:33

Ⅰ 智能電子鍾,單片機課程設計,急!!!!!!

問題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',..,''};

* INT8U *ptr;

* ptr=&txt;

* lcd1602_Display(ptr);

* 或 lcd1602_Display(txt);

* 或 lcd1602_Display(&txt);

************************************************

*/


void lcd1602_Display(const uchar *ptr,uchar line,uchar xaddr)

{

uchar data i=0;

uchar *data q;


q=ptr;

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80+xaddr);

while(q!=NULL && (*q!='') && i<16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

case 1:

lcd1602_WriteCmd(0xc0+xaddr);

while(q!=NULL && (*q!='') && i<16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

}

}



void main()

{

lcd1602_Init();

init();

while(1)

{

time_display();

date_display();

control();

}

}

void init()

{

i=0;

sec=0;

min=30;

h=7;

date=17;

month=10;

year=2017;

flag=0;

EA=1;

ET0=1;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void time_display()

{

timestr[7]=0x30+sec%10;

timestr[6]=0x30+sec/10;

timestr[5]=':';

timestr[4]=0x30+min%10;

timestr[3]=0x30+min/10;

timestr[2]=':';

timestr[1]=0x30+h%10;

timestr[0]=0x30+h/10;

timestr[8]=0;

lcd1602_Display(timestr,1,3);

}

void date_display()

{

datestr[9]=0x30+date%10;

datestr[8]=0x30+date/10;

datestr[7]=':';

datestr[6]=0x30+month%10;

datestr[5]=0x30+month/10;

datestr[4]=':';

datestr[3]=0x30+year%10;

datestr[2]=0x30+year/10%10;

datestr[1]=0x30+year/100%10;

datestr[0]=0x30+year/1000;

lcd1602_Display(datestr,0,2);

}

void control()

{

if(!key_ch)

{

delay(5);

if(!key_ch)

{

flag++;

TR0=0;

if(flag==7)

{flag=0;TR0=1;lcd1602_Init();}

lcd1602_Display(chgstr[flag],1,12);

}

}

while(!key_ch);

if(flag==1&&key_add==0)

{

while(!key_add);

sec++;

if(sec==60)

sec=0;

}

if(flag==1&&key_minus==0)

{

while(!key_minus);

sec--;

if(sec==-1)

sec=59;

}


if(flag==2&&key_add==0)

{

while(!key_add);

min++;

if(min==60)

min=0;

}

if(flag==2&&key_minus==0)

{

while(!key_minus);

min--;

if(min==-1)

min=59;

}


if(flag==3&&key_add==0)

{

while(!key_add);

h++;

if(h==24)

h=0;

}

if(flag==3&&key_minus==0)

{

while(!key_minus);

h--;

if(h==-1)

h=23;

}


if(flag==4&&key_add==0)

{

while(!key_add);

date++;

if(date==29)

if((year%4!=0)&&(month==2))

date=1;

if(date==30)

if((year%4==0)&&(month==2))

date=1;

if(date==31)

if((month==4)||(month==6)||(month==9)||(month==11))

date=1;

if(date==32)

if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))

date=1;

}


if(flag==4&&key_minus==0)

{

while(!key_minus);

if(date>1)date--;

}


if(flag==5&&key_add==0)

{

while(!key_add);

month++;

if(month==13)

month=1;

}

if(flag==5&&key_minus==0)

{

while(!key_minus);

month--;

if(month==0)

month=12;

}


if(flag==6&&key_add==0)

{

while(!key_add);

year++;

if(year==99)

year=1;

}

if(flag==6&&key_minus==0)

{

while(!key_minus);

year--;

if(year==0)

year=99;

}

}


void T0_rpt() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

i++;

time();

}


void time()

{

if(i==20)

{

i=0;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

h++;

if(h==24)

{

h=0;

min=0;

sec=0;

date++;

if(date==29)

if((year%4!=0)&&(month==2))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==30)

if((year%4==0)&&(month==2))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==31)

if((month==4)||(month==6)||(month==9)||(month==11))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==32)

if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

}

}

}

}

}

Ⅵ 急求:單片機課程設計電子時鍾

A方案
--------------------------
外加一復顆時鍾芯製片DS1302(非常准確)。
按鍵為單片機中斷。
--------------------------

1、上電時自動顯示時、分、秒;
實現方式:上電時單片機去啟動DS1202,然後讀取裡面的時間值,自動顯示時、分、秒;

2、設置一個控制按鍵,按下按鍵,則時鍾以秒為單位開始計時;
實現方式:將DS1302此時的值暫時保存,最為計時開始的時間。
然後不停地讀取DS1302里的新的時間值,
並將新的時間值 - 計時開始的時間 = 已計時數值

3、運行狀態下可通過控制按鍵使時鍾暫停,同時顯示已計時數值;
實現方式:顯示步驟2里的已計時數值。

4、停止狀態下(已上電),按下復位按鈕,時鍾復位(清零),並進入下一次計時狀態。
實現方式:計時開始的時間換成當前時間。

B方案
--------------------------
採用單片機內部定時器計時(不準)。
按鍵為單片機中斷。
--------------------------
步驟類似,不用去讀DS1302的時間,讀自己內部的時間。

Ⅶ 單片機課程設計:倒計時計時器,從99到0

單片機課程設計:倒計時計時器,從99到0這個是可以搞定的.

Ⅷ 單片機籃球比賽計時器課程設計 要求 24秒到計時,計兩隊得分

籃球比賽24秒倒計時器的設計
設計製作一個籃球競賽計時系統,具有進攻方24秒倒計時功能,具體設計要求如下:
1、具有顯示 24s 倒計時功能:用兩個共陰數碼管顯示,其計時間隔為1s。 2、設置啟暫停/繼續鍵,控制兩個計時器的計數,暫停/繼續計數功能。 3、設置復位鍵:按復位鍵可隨時返回初始狀態,即進攻方計時器返回到24s。 4、計時器遞減計數到「00」時,計時器跳回「24」停止工作,並給出聲音和發光提示,即蜂鳴器發出聲響和發光二極體發光 前言
電子課程設計是電子技術學習中非常重要的一個環節,是將理論知識和實踐能力相統一的一個環節,是真正鍛煉學生能力的一個環節。
在許多領域中計時器均得到普遍應用,諸如在體育比賽,定時報警器、游戲中的倒時器,交通信號燈、紅綠燈、行人燈、交通纖毫控制機,還可以用來做為各種葯丸、葯片,膠囊在指定時間提醒用葯等等,由此可見計時器在現代社會的應用是相當普遍的。
在籃球比賽中,規定了球員的持球時間不能超過24秒,否則就違例了。本課程設計「智能籃球比賽倒計時器的設計」,可用於籃球比賽中,用於對球員持球時間24秒限制。一旦球員的持球時間超過了24秒,它自動的報警從而判定此球員的違例。
本設計主要能完成:顯示24秒倒計時功能;系統設置外部操作開關,控制計時器的直接清零、啟動和暫停/連續功能;在直接清零時,數碼管顯示器滅燈;計時器為24秒遞減計時其計時間隔為1秒;計時器遞減計時到零時,數碼顯示器不滅燈,同時發出光電報警信號等。
1.1基本原理
24秒計時器的總體參考方案框圖如圖1所示。它包括秒脈沖發生器、計數器、解碼顯示電路、報警電路和輔助時序控制電路(簡稱控制電路)等五個模塊組成。其中計數器和控制電路是系統的主要模塊。計數器完成24秒計時功能,而控制電路完成計數器的直接清零、啟動計數、暫停/連續計數、解碼顯示電路的顯示與滅燈、定時時間到報警等功能。

熱點內容
武漢大學學生會輔導員寄語 發布:2021-03-16 21:44:16 瀏覽:612
七年級學生作文輔導學案 發布:2021-03-16 21:42:09 瀏覽:1
不屑弟高考成績 發布:2021-03-16 21:40:59 瀏覽:754
大學畢業證會有成績單 發布:2021-03-16 21:40:07 瀏覽:756
2017信陽學院輔導員招聘名單 發布:2021-03-16 21:40:02 瀏覽:800
查詢重慶2018中考成績查詢 發布:2021-03-16 21:39:58 瀏覽:21
結業考試成績怎麼查詢 發布:2021-03-16 21:28:40 瀏覽:679
14中醫醫師資格筆試考試成績查分 發布:2021-03-16 21:28:39 瀏覽:655
名著賞析課程標准 發布:2021-03-16 21:27:57 瀏覽:881
北京大學商業領袖高端培訓課程 發布:2021-03-16 21:27:41 瀏覽:919