導航:首頁 > 操作系統 > 單片機簡易時鍾實驗

單片機簡易時鍾實驗

發布時間:2022-06-14 16:19:49

『壹』 製作一個簡易時鍾,使用51內核單片機,4位數碼管(帶秒點),完成以下任務 1.顯示12進制時鍾(5)

你好!你的原理圖確定了嗎?程序什麼時間要

『貳』 用單片機製作一個簡易的時鍾。。

#include<reg52.h>
#include"segnumca.h"
#define uchar unsigned char
sbit _speak=P1^0; //蜂鳴器P1^0
uchar hello_[]={0x89,0x86,0xc7,0xc7,0xc0,0xf7}; //HELLO_
uchar con[]={0x01,0x02,0x04,0x08,0x10,0x20}; //位控制
uchar time0=100;
uchar i=0;
uchar s,m,h;
void delay(); //0.3s
void intr_(); //int0\1初始化
/*********************************
主函數
*********************************/
void main()
{
s=m=h=0;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
intr_();
while(time0>10)
{
P2=con[i];
P0=hello_[i];
i++;
if(i>=6)i=0;
delay();
}
i=0;
while(1)
{
P2=con[i];
switch(i)
{
case 0:P0=seg[h/10];break;
case 1:P0=seg[h%10]+0x80;break;
case 2:P0=seg[m/10];break;
case 3:P0=seg[m%10]+0x80;break;
case 4:P0=seg[s/10];break;
case 5:P0=seg[s%10];break;
}
i++;
if(i>=6)i=0;
delay();
}
}
/****************************
T0
****************************/
void isr_time0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
time0--;
if(!time0)
{
time0=20;
s++;
if(s>=60)
{
s=0;
m++;
if(m>=60)
{
m=0;
h++;
if(h>=24)
{
h=0;
}
}
}
}
}
/*************************
外中斷初始化
*************************/
void intr_()
{
IT0=1;IT1=1;EX0=1;EX1=1;
}
/**************************
for延時
**************************/
void delay() //大約延時0.3秒
{
unsigned char delay0,delay1;
for(delay0=0;delay0<5;delay0++)
for(delay1=0;delay1<255;delay1++);
}
/*********************************************
INT0
*********************************************/
void intr_0() interrupt 0
{
m++;
if(m>=60)m=0;
}
/*********************************************
INT1
*********************************************/
void intr_1() interrupt 2
{
h++;
if(h>=24)h=0;
}

『叄』 51單片機做數字電子鍾

這么復雜的東西給這么少分 暈死了 你也太小氣了吧,分多的話還可能幫你動動腦

『肆』 用單片機做一個電子時鍾

這個很簡單啊,兩種思路:1,用單片機定時器來做,優點是外圍電路簡單,只需要一個單片機最小系統,和一個顯示模塊(1602液晶比較好);缺點是:定時不是很准,跑的時間長了會有誤差,而且主要是程序,要寫很多,不過程序不是很難。2,用時鍾晶元,一般都用ds1302,還需要單片機最小系統和顯示模塊,優點是:定時准確,誤差很小,在有備用電池的情況下,即使單片機掉電,也可以維持很長時間,程序相對簡單。缺點是:外圍電路比前者相對復雜一點。如果想做個實際的東西拿來用,建議使用第二種方法,如果是想鍛煉自己的編程能力的話,選第一種吧。祝成功!

『伍』 51單片機簡單電子時鍾程序,通過按鍵設置時間,有圖,有解析!

#include<reg52.h>
#include<stddef.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD1602_FLAG
#defineLCD1602_PORTP0

sbitlcd1602_rs=P2^0;
sbitlcd1602_e=P2^2;
sbitlcd1602_rw=P2^1;
sbitlcd1602_busy=P0^7;
sbitkey_ch=P3^5;
sbitkey_add=P3^6;
sbitkey_minus=P3^7;

uchari,sec,min,h,date,month,flag;
uintyear;
uchar*chgstr[7]={"","sec","min","hour","date","min","year"};
ucharj,k,m,n,o,p;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchartimestr[10],datestr[10];
voidinit();
voiddelay(uint);
voidtime_display();
voiddate_display();
voidcontrol();
voidtime();
/*
************************************
*函數名稱:lcd1602_CheckBusy()
*函數功能:狀態查詢
************************************
*/

voidlcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}

/*
***************************************
*函數名稱:lcd1602_WriteCmd()
*函數功能:寫命令
*入口參數:命令字
*出口參數:無
***************************************
*/

voidlcd1602_WriteCmd(constucharcmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}

/*
*******************************************
*函數名稱:lcd1602_WriteData()
*函數功能:寫數據
*入口參數:c--待寫數據
*出口參數:無
*********************************************
*/

voidlcd1602_WriteData(constucharc)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}

/*
***********************************************
*函數名稱:lcd1602_Init()
*函數功能:初始化LCD
*入口參數:無
*出口參數:無
***********************************************
*/

voidlcd1602_Init()
{
lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣
lcd1602_WriteCmd(0x0c);//displayenable,flagenable,flashenable,
lcd1602_WriteCmd(0x06);//flagmovetoright,screendon'tmove
lcd1602_WriteCmd(0x01);//clearscreen
}

/*
************************************************
*函數名稱: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);
************************************************
*/

voidlcd1602_Display(constuchar*ptr,ucharline,ucharxaddr)
{
uchardatai=0;
uchar*dataq;

q=ptr;
switch(line)
{
case0:
lcd1602_WriteCmd(0x80+xaddr);
while(q!=NULL&&(*q!='')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
case1:
lcd1602_WriteCmd(0xc0+xaddr);
while(q!=NULL&&(*q!='')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
}
}


voidmain()
{
lcd1602_Init();
init();
while(1)
{
time_display();
date_display();
control();
}
}
voidinit()
{
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;
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidtime_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);
}
voiddate_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);
}
voidcontrol()
{
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;
}
}

voidT0_rpt()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
time();
}

voidtime()
{
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++;
}
}
}
}
}
}
}

『陸』 如何用51單片機製作簡易電子鍾

我自己做的一個課程設計,程序運行已經成功了:

匯編程序如下:

ORG0000H

AJMPmain

ORG000BH;定時器0的中斷向量地址

AJMPTIME0;跳轉到真正的定時器程序處

ORG30H

main:

movdptr,#k1;

start:

MOVP0,#00H;中斷預處理程序

MOVP1,#00H

MOVP3,#00H;關所有燈

MOVR0,#00H;軟體計數器預清0

MOVR7,#00H

MOVR6,#00H

MOVTMOD,#00000001B;定時/計數器0工作於方式1

MOVTH0,#3CH

MOVTL0,#0B0H;即數15536

SETBEA;開總中斷允許

SETBET0;開定時/計數器0允許

SETBTR0;定時/計數器0開始運行

LOOP:;判斷時鍾進位程序

MOVA,R1

CJNEA,#60,LOOP1;R1等於60嗎?

MOVR1,#0

INCR2;R1等於60那麼R2加一,R1清0

MOVA,R2

CJNEA,#60,LOOP1;R2等於60嗎?

MOVR2,#0

INCR3;R2等於60那麼R3加一,R2清0

MOVA,R3

CJNEA,#24,LOOP1;R3等於24嗎?

MOVR3,#0

;R3等於24那麼R3清0

LOOP1:

mova,r2;如果分鍾顯示為0,報警

cjnea,#01H,LOOP2

mova,r1

cjnea,#00H,LOOP3

clrp2.0

LOOP3:

mova,r1;如果秒鍾顯示為1,取消報警

cjnea,#05H,LOOP2

setbp2.0

LOOP2:;顯示數據處理

MOVA,R1;取來8位二進制數

MOVB,#100

DIVAB;除以100

MOVA,B;取回余數

MOVB,#10

DIVAB;再除以10

MOVR4,A;商是十位數,存放到R4

MOVR5,B;余數是個位,存放到R5

MOV42H,R4

mOV41H,R5

;R1的BCD碼放入41-42H單元

MOVA,R2;取來8位二進制數

MOVB,#100

DIVAB;除以100

MOVA,B;取回余數

MOVB,#10

DIVAB;再除以10

MOVR4,A;商是十位數,存放到R4

MOVR5,B;余數是個位,存放到R5

MOV44H,R4

MOV43H,R5

;R2的BCD碼放入43-44H單元

MOVA,R3;取來8位二進制數

MOVB,#100

DIVAB;除以100

MOVA,B;取回余數

MOVB,#10

DIVAB;再除以10

MOVR4,A;商是十位數,存放到R4

MOVR5,B;余數是個位,存放到R5

MOV46H,R4

mov45H,R5

;R3的BCD碼放入45-46H單元

L1:

mova,41h

movca,@a+dptr

mov51h,a

mova,42h

movca,@a+dptr

mov52h,a

mova,43h

movca,@a+dptr

mov53h,a

mova,44h

movca,@a+dptr

mov54h,a

mova,45h

movca,@a+dptr

mov55h,a

mova,46h

movca,@a+dptr

mov56h,a;將顯示代碼送入51H--56H

display:;顯示程序

movp0,#0ffH;一

movp0,51H

movP1,#0feH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;二

movp0,52h

movP1,#0fdH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;三

movp0,53h

movP1,#0fbH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;四

movp0,54h

movP1,#0f7H

acalldelay1S

movp1,#0ffH

movp0,#0ffH;五

movp0,55h

movP1,#0efH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;六

movp0,56h

movP1,#0dfH

acalldelay1S

movp1,#0ffH

;將51H-56H數據顯示,

AJMPLOOP;工作處理程序

TIME0:;定時器0的中斷處理程序

INCR7

MOVA,R7

CJNEA,#20,T_RET;R7單元中的值到了20了嗎?

T_L1:

INCR1;到了20那麼R1+1

MOVR7,#0;清軟體計數器

T_RET:;二十分之一秒時的程序

incr6

mova,r6

cjner6,#3,T_over;調節時間的延遲時間

movr6,#0

jbp2.1,T_over1

mova,r2

adda,#1

cjnea,#60,T_tiao1

mova,#0

T_tiao1:

movr2,a

T_over1:

jbp2.2,T_over

mova,r3

adda,#1

cjnea,#24,T_tiao2

mova,#0

T_tiao2:

movr3,a

T_over:

MOVTH0,#3CH

MOVTL0,#0B0H;如果沒到一秒重置定時常數

reti

delay1s:MOV31H,#100

D1:MOV32H,#30

D2:DJNZ32H,D2

DJNZ31H,D1

RET

delay2s:MOV33H,#255

D3:MOV34H,#255

D4:DJNZ34H,D4

DJNZ33H,D3

RET

K1:db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

『柒』 利用單片機製作簡易時鍾

#include<reg52.h>
#define uchar unsigned char
uchar hhs,hhg,mms,mmg,sss,ssg;
unsigned int hh=10,ss=00,mm=05;
unsigned char code table[]={0x3f,0x03,0x6d,0x67,0x53,0x76,0x7e,0x23,0x7f,0x77,};
disp(hh,mm,ss);
unsigned char m=1;
*************/
main()
{
TMOD=0x01;
TH0=0x0b; //0bf5每小時快.7秒
TL0=0xe9;
ET0=1;
TR0=1;
EA=1;
while(1);
disp(hh,mm,ss);
}
**********************************************************************/
void time() interrupt 1
{ uchar a;
TH0=0x0b;
TL0=0xe9;
a++;
if(a==8)
P0=0xff;
if(a==16)
{a=0;
P0=0x00;
hhs=hh/10;
hhg=hh%10;
mms=mm/10;
mmg=mm%10;
sss=ss/10;
ssg=ss%10;

ss++;
if(ss==60)
{ ss=0;
mm++;}
if(mm==60)
{mm=0;
hh++;}
if(hh==24)
hh=0;

}
}
/*******************************************************************
顯示函數:使用選擇語句進行循環掃描數碼管
*******************************************************************/

disp(hh,mm,ss)
{
P1=0x00;
if(m==1){P2=table[hhs];P1=0X01;}//時十位
if(m==2){P2=table[hhg];P1=0X02;}//時個位
if(m==3){P2=table[mms];P1=0X04;}//分十位
if(m==4){P2=table[mmg];P1=0X08;}//分個位
if(m==5){P2=table[sss];P1=0X10;}//秒十位
if(m==6){P2=table[ssg];P1=0X20;}//秒個位

m++;
if(m>=7)m=1;

}

『捌』 單片機課程設計:簡易數字鍾

20. 數字鍾[★]
1. 實驗任務

(1. 開機時,顯示12:00:00的時間開始計時;

(2. P0.0/AD0控制「秒」的調整,每按一次加1秒;

(3. P0.1/AD1控制「分」的調整,每按一次加1分;

(4. P0.2/AD2控制「時」的調整,每按一次加1個小時;

#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};
unsigned char dispbitcnt;

unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char mstcnt;

unsigned char i,j;

void main(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;

while(1)
{
if(P0_0==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==8)
{
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;

}

}

『玖』 如何做一個單片機電子時鍾

這個很簡單啊,兩種思路:1,用單片機定時器來做,優點是外圍電路簡單,只需要一個單片機最小系統,和一個顯示模塊(1602液晶比較好);缺點是:定時不是很准,跑的時間長了會有誤差,而且主要是程序,要寫很多,不過程序不是很難。2,用時鍾晶元,一般都用DS1302,還需要單片機最小系統和顯示模塊,優點是:定時准確,誤差很小,在有備用電池的情況下,即使單片機掉電,也可以維持很長時間,程序相對簡單。缺點是:外圍電路比前者相對復雜一點。如果想做個實際的東西拿來用,建議使用第二種方法,如果是想鍛煉自己的編程能力的話,選第一種吧。祝成功!

『拾』 C51單片機設計一個電子時鍾

的確是,沒有注釋的程序,我想除了編寫者本人能夠知道其中的邏輯關系,一般人是很難看得明白,有時一個程序因為時間長了就算是編寫本人,在沒有注釋的情況下,也難得一時弄明白。

其實用單片機做電子鍾,很簡單,關鍵是延時部分,最好嵌入匯編程序進行精確延時。

閱讀全文

與單片機簡易時鍾實驗相關的資料

熱點內容
程序員上海與北京 瀏覽:404
安卓手機的動態照片為什麼卡 瀏覽:538
ad編譯集成庫時最常見的問題 瀏覽:845
matlab微分方程編程 瀏覽:700
安卓手機如何打開esp文件 瀏覽:545
什麼app能安裝應用 瀏覽:199
手機用什麼app看電視劇電影好 瀏覽:603
導入原理圖為什麼文件夾不顯示 瀏覽:653
androidapp風格 瀏覽:209
php取伺服器url地址 瀏覽:293
linux時間調度演算法 瀏覽:769
單片機最小電路詳解 瀏覽:185
請求要求命令 瀏覽:806
電腦文件夾發微信顯示被佔用 瀏覽:295
手機怎麼看加密視頻 瀏覽:206
怎樣解壓手機es文件包 瀏覽:661
2017年學什麼編程 瀏覽:935
金融期貨pdf 瀏覽:694
程序員客棧的信息保密嗎 瀏覽:507
編程顯示器什麼意思 瀏覽:147