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

電子時鍾課程設計單片機

發布時間: 2021-02-08 21:00:41

1. 單片機課程設計電子時鍾程序

#include <at89x51.h> //頭文件包含

#define uchar unsigned char //宏定義
#define uint unsigned int
#define ON 0 //定義0為打開
#define OFF 1 //定義1為關閉
#define LEDBus P1 //定義p1口為數碼管段碼口
sbit MIAO =P1^2; //秒點
sbit HOU_S=P3^0; //時十位位選
sbit HOU_G=P3^1; //時個位位選
sbit MIN_S=P3^2; //分十位位選
sbit MIN_G=P3^3; //分個位位選
sbit H_KEY=P3^4; //時調整鍵
sbit M_KEY=P3^5; //分調整鍵
bit SHAN; //閃爍標志位
uchar second,minute,hour; //定義秒、分、時寄存器
uchar code LEDTab[]={0x14,0xd7,0x4c, //數碼管段碼表0--9
0x45,0x87,0x25,0x24,0x57,0x04,0x05};
void delay(uchar t); //延時函數
void init(); //初始化函數
void display(); //顯示函數
void min_tiao(); //分調整函數
void hou_tiao(); //時調整函數
/***************************************
函 數 名:main
功 能:主函數
說 明:
入口參數:無
返 回 值:無
****************************************/
void main()
{
init(); //調用初始化函數
while(1) //主程序循環
{
if(!H_KEY) hou_tiao(); //如果時調整鍵按下(為0),調用時調整函數
if(!M_KEY) min_tiao(); //如果分調整鍵按下(為0),調用分調整函數
display(); //調用顯示函數
}
}
/***************************************
函 數 名:init
功 能:初始化函數
說 明:初始化定時器及中斷
入口參數:無
返 回 值:無
***************************************/
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0; //定時器0模式1,50毫秒
ET0=1;TR0=1;EA=1; //開定時器0中斷、啟動定時器0、開總中斷
}
/***************************************
函 數 名:display
功 能:顯示函數
說 明:
入口參數:無
返 回 值:無
***************************************/
void display()
{
LEDBus=LEDTab[minute%10]; //分個位送數碼管顯示
MIAO=SHAN; //秒點閃爍
MIN_G=ON; //打開分個位位選
delay(1); //顯示1毫秒
MIN_G=OFF; //關閉分個位位選
LEDBus=LEDTab[minute/10]; //分十位送數碼管顯示
MIAO=SHAN; //秒點閃爍
MIN_S=ON; //打開分十位位選
delay(1); //顯示1毫秒
MIN_S=OFF; //關閉分十位位選
LEDBus=LEDTab[hour%10]; //時個位送數碼管顯示
HOU_G=ON; //打開時個位位選
delay(1); //顯示1毫秒
HOU_G=OFF; //關閉時個位位選
if(hour/10) //如果時十位為0,不顯示十位數字
{
LEDBus=LEDTab[hour/10]; //時十位送數碼管顯示
HOU_S=ON; //打開時十位位選
delay(1); //顯示1毫秒
HOU_S=OFF; //關閉時十位位選
}
}
/***************************************
函 數 名:min_tiao
功 能:分調整
說 明:
入口參數:無
返 回 值:無
***************************************/
void min_tiao()
{
while(!M_KEY) display(); //等待分調整鍵松開
second=0;minute++; //秒清零、分加1
if(minute==60) minute=0; //如果分等於60,分變0
}
/***************************************
函 數 名:hou_tiao
功 能:時調整
說 明:
入口參數:無
返 回 值:無
***************************************/
void hou_tiao()
{
while(!H_KEY) display(); //等待時調整鍵松開
second=0;hour++; //秒清零,時加1
if(hour==24) hour=0; //如果時等於24,時變0
}
/***************************************
函 數 名:delay
功 能:延時函數
說 明:
入口參數:t:延時時間長短
返 回 值:無
***************************************/
void delay(uchar t)
{
uchar i; //定義變數
for(;t>0;t--) //如果t大於0,t減1(外層循環)
for(i=124;i>0;i--); //i等於124,如果i大於0,i減1
}

/***************************************
函 數 名:timer0
功 能:定時器0中斷函數
說 明:
入口參數:無
返 回 值:無
***************************************/
void timer0() interrupt 1 //定時器0(中斷1)
{
uchar tim1,tim2; //定義臨時變數
TL0=TL0+0XB0;TH0=0X3C; //重裝定時器初值
tim1++; //每中斷一次tim1加1
if(tim1==10) //中斷10(0.5秒)
{
SHAN=!SHAN; //閃爍標志取反
tim1=0;tim2++; //tim1清零,tim2加1
if(tim2==2) //到了1秒
{
tim2=0;second++; //tim2清零,秒加1
if(second==60) //如果秒到60
{
second=0;minute++; //秒變0,分加1
if(minute==60) //如果分到60
{
minute=0;hour++; //分變0,時加1
if(hour==24) hour=0; //如果時到24,時變0
}
}
}
}
}
/***************************************
program end 程序結束

2. 單片機課程設計 電子時鍾設計

基於AVR單片機Mega16的電子時鍾設計

摘要】 Mega16是一款採用先進RISC精簡指令,內置A/D的8位單片機內,可支持低電壓聯機Flash和EEPROM寫入功能容;同時還支持Basic和C等高級語言編程。用它設計電子時鍾不僅成本低,硬體簡單,而且很容易實現系統移植。介紹了如何利用AVR系列單片機Mega16及1602字元液晶來設計電子時鍾的方法,同時給出了相應的電路原理及部分語言程序。

3. 單片機數字時鍾課程設計

這個 我正在學單片機,也剛剛做過了這個實驗沒多久,不過我的是8098單片機,確實是匯編語言。不過我做的僅僅是個電子鍾,你可以隨時改變你輸入的時間然後它就會按時分秒跳動,我做的是24小時制的。不過我沒有弄鬧鍾額……不過也簡單,可以弄一個中斷申請就ok。話說你的鬧鍾要求是什麼?我記得8098是不能響的,只有一個發光二極體可以亮一亮……
話說能請你把問題補充一下么?我的程序寫在紙上,然後我們還要求是要把程序翻譯出機器碼然後在單片機上實驗出結果的。所以我連機器碼都翻譯了的……實在不知道你們的要求。

原理可以先和你說一下:主程序先是一系列的初始化(中斷懸掛的清零和寄存器的設置,堆棧的設置等),然後開啟中斷,寫顯示程序(顯示程序前要弄好你顯示的寄存器以及掃描子程序的地址,還要對十六進制數進行轉換變成十進制數,只要做一個除法就行,用十六進制數除以A就能夠得出相應的十進制數。)
然後就是你的中斷程序了,比如你的中斷申請是每10ms申請一次,那你就計數,如果到了100次中斷了,那就秒加一,再查看秒是否到60,是則清零讓分加一,否則跳到中斷程序末端;然後再依次查分和時。最後中斷程序的末端還要用一次計時器軟體中斷申請。再跳回主程序反復運行。可能比較麻煩,我記得我打的草稿就好多張紙呢,後來在16進制向10進制轉換的時候還出了個寄存器的問題。
不知道和你程序的要求是否相同= =。

期待你能夠補充一下你的問題。

4. 求C51單片機數字電子時鍾課程設計

#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define
unit
unsigned
int
#define
uchar
unsigned
char
//#define
HZ
12
sbit
key0=P0^0;
//
分鍾調整
sbit
key1=P0^1;
//
小時調整
sbit
P2_0=P2^7;
//秒
指示燈
sbit
MN_RXD=P3^6;
sbit
MN_TXD=P3^7;
uchar
data
CLOCK[4]={0,0,0,12};//存放時鍾時間(百分秒,秒,分,和時位)
//數碼管顯示表0-f

uchar
code
TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};
//**********************************
//模擬串口發送一個位元組數據
函數
//**********************************
void
SendData(unsigned
char
senddata)
{
unsigned
char
i;
for(i=0;i<8;i++)
{
if((senddata&0x01)==0)
MN_RXD=0;
else
MN_RXD=1;
_nop_();
MN_TXD=0;
_nop_();
MN_TXD=1;
senddata=senddata>>1;
}
}
//**********************************
//顯示程序函數
//**********************************
void
display(void)
{
//
unsigned
int
n;
uchar
temp;
temp=CLOCK[1];
temp=temp%10;
SendData(TABLE[temp]);
temp=CLOCK[1];
temp=temp/10;
SendData(TABLE[temp]);
temp=CLOCK[2];
temp=temp%10;
SendData(TABLE[temp]);
temp=CLOCK[2];
temp=temp/10;
SendData(TABLE[temp]);
temp=CLOCK[3];
temp=temp%10;
SendData(TABLE[temp]);
temp=CLOCK[3];
temp=temp/10;
SendData(TABLE[temp]);
/*
for(n=0;n<5000;n++);
for(n=0;n<6;n++)
{
SendData(TABLE[10]);
}
*/
}
//**********************************
//按鍵控制函數
//**********************************
void
keycan()
{
unsigned
int
n;
EA=0;
if(key0==0)
//
分鍾調整
{
for(n=0;n<10000;n++);
//延時去抖動
while(key0==0);
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60)
//到一時
{
CLOCK[2]=0;
}
display();
}
if(key1==0)
//
小時調整
{
for(n=0;n<10000;n++);
//延時去抖動
while(key1==0);
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
display();
}
EA=1;
}
//**********************************
//T0中斷服務函數
//**********************************
void
time0()
interrupt
1
//using
1
{
TH0=0xD8;
TL0=0xF0;
//重置初值
//
TH0=0xB1;
TL0=0xE0;
//時鍾處理
CLOCK[0]=CLOCK[0]+1;
}
//**********************************
//主函數
//**********************************
void
main()
{
EA=1;
ET0=1;
TMOD=0x01;
//T0方式1定時
TH0=0xD8;
TL0=0xF0;
//D8F0
定時10ms
//
TH0=0xB1;
TL0=0xE0;
//定時
20ms
TR0=1;
for(;;)
{
if(CLOCK[0]==100)
//到一秒
10ms*100
{
CLOCK[0]=0;
P2_0=~P2_0;
CLOCK[1]=CLOCK[1]+1;
if(CLOCK[1]==60)
//到一分
{
CLOCK[1]=0;
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60)
//到一時
{
CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
}
}
display();
}
keycan();
}
}

5. 單片機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++;

}

}

}

}

}

}

}

熱點內容
武漢大學學生會輔導員寄語 發布: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