導航:首頁 > 操作系統 > 單片機點動改變時間

單片機點動改變時間

發布時間:2022-11-22 06:37:30

Ⅰ 51單片機 用按鍵設定時鍾時間的原理

給你個思路。程序自己寫
void intterupt0(void) interrupt 0
{ while(k4==1)
{
if(k1==0)
{
delay(10);
while(k1==0);
p++;
}
else if(k2==0)
{
delay(10);
while(k2==0);
*p=*p++;
}
else if(k3==0)
{
delay(10);
while(k3==0);
*p=*p--;
}
DISPLAY(); //顯示b[]中的內容
if(*p=='\0')
p=b;
}
p=b;
}

簡單和你說下。
p定義一個指向數組b的指針
數組b為從時鍾晶元中讀取的時間內容,格式,秒,分,時,日,月,星期,年
用了5個按鍵。一個按鍵控制中斷,一個按鍵退出修改(K4)。進入中斷後,若K4不按下,則在WHILE(K4)里一直循環,K1,指針地址+1,K2指針值+1,K3,指針值-1; 改完了後,將修改好的B里的值顯示出來。由於DISPLAY()是在循環中的,所以每修改一個鍵,他就會被調用顯示一次,就實現了實時修改顯示的目的。修改完後,按下K4,跳出循環。最後將b[]中的值存入時鍾晶元,OK了

不知道你懂沒。
時鍾晶元用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單片機怎樣用按鍵設定定時時間

//下例供參考。

#include<reg51.h>

#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,min=0,hour=12,scanled;
unsigned char key,mode,time;
unsigned char disdat[8];
sbit key1=P1^4;
sbit key2=P1^5;

void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;

disdat[2]=min%10;
disdat[3]=min/10;

disdat[4]=hour%10;
disdat[5]=hour/10;
}
void t0isr() interrupt 1//秒計時
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3//顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P3=0x04;
P2=~ledtab[disdat[5]];
break;
case 1:
P3=0x08;
P2=~ledtab[disdat[4]]&0x7f;
break;
case 2:
P3=0x10;
P2=~ledtab[disdat[3]];
break;
case 3:
P3=0x20;
P2=~ledtab[disdat[2]]&0x7f;
break;
case 4:
P3=0x40;
P2=~ledtab[disdat[1]];
break;
case 5:
P3=0x80;
P2=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
if(key1==0)
{
while(key1==0);
TR0=1;
}
if(key2==0)
{
while(key2==0);
TR0=0;
}
}
}

Ⅳ 單片機定時的時間怎麼改變

51單片機,根據晶振頻率,計算指令周期,設置定時器的分頻,然後設置定時器的工作方式tmod,最後設置初值th0
tl0
比如用的x
hz的晶振,stc的單片機有3種模式(x/12)x/6,還有單周期指令,
選擇12分頻的,t=1/(x/12)就是一個指令周期
,如果定時沒有分頻,(65536-z(初值))*t就是定時的時間
比如是12m的晶振那麼
設置tmod=0x01;16位定時器模式
th0=(65536-20000)/256;
tl0=(65536-20000)%256;就是設置了20ms的定時

Ⅳ 51單片機電子鍾 通過按鍵調整時間 這塊程序怎麼寫(方法)

ORG 0000H ;主程序入口
LJMP MAIN ;跳轉到標號MAIN執行
ORG 000BH ;定時器T0中斷入口
AJMP PTF0 ;跳轉到標號PTF0執行
HOUR EQU 4AH ;賦值偽指令
MIN EQU 4BH
SEC EQU 4CH
BUFF EQU 4DH
;*************************************************************************************
;主程序
MAIN: MOV HOUR,#00H ;時,分,秒,標記清零
MOV MIN,#00H
MOV SEC,#00H
MOV BUFF,#00H
MOV SP,#60H ;設堆棧指針
MOV TH0,#3CH ;定時器賦初值
MOV TL0,#0B0H
MOV 40H,#14H ;設循環次數20次
MOV TMOD,#1 ;寫TMOD
MOV IP,#2 ;寫IP
MOV IE,#82H ;開中斷
SETB TR0 ;啟動定時器
LOOP: ACALL DISPLAY ;調用顯示程序
JNB P3.0,FEN ;校時鍵按否?否,跳轉到FEN
ZX: ACALL DISPLAY
JB P3.0,ZX
MOV A,HOUR ;時加1
ADD A,#1
DA A
CJNE A,#24H,BI ;時加到24時否?是,清零
CLR A
BI: MOV HOUR,A
MOV SEC,#00H ;秒清零
FEN: JNB P3.1,YY ;校分鍵按下否?否,跳轉到YY
ZC: ACALL DISPLAY
JB P3.1,ZC
MOV A,MIN ;分加1
ADD A,#1
DA A
CJNE A,#60H,CI ;分加到60否?是,清零
CLR A
CI: MOV MIN,A
MOV SEC,#00H ;秒清零
YY: AJMP LOOP
;***************************************************************************************
;中斷服務程序
PTF0: MOV TH0,#3CH ;初值重裝
MOV TL0,#0B0H
CLR TR0 ;關定時器
CLR A ;清A
DJNZ 40H,XX ;1秒到否?否,跳轉到XX
MOV 40H,#14H ;重寫循環次數
MOV A,SEC ;秒單元加1
ADD A,#1
DA A
MOV SEC,A
CJNE A,#60H,PTF0R ;60秒到否?否,跳轉到PTF0R
JMIN: MOV SEC,#00H ;秒清零
MOV A,MIN ;分單元加1
ADD A,#1
DA A
MOV MIN,A
CJNE A,#60H, PTF0R ;60分到否?否,跳轉到PTF0R
MOV MIN,#00H ;分清零
JHOUR: MOV SEC,#00H ;秒清零
MOV A,HOUR ;時單元加1
ADD A,#1
DA A
MOV HOUR,A
CJNE A,#24H, PTF0R ;24時到否?否,跳轉到PTF0R
MOV HOUR,#00H ;時清零
AJMP PTF0R ;跳轉到PTF0R
XX: MOV R7,40H ;給小數點做標記,1和0
CJNE R7,#0AH,NEQ
EQ: NOP
AJMP PTF0R
NEQ: JC YEQ
MOV BUFF,#00H
AJMP PTF0R
YEQ: MOV BUFF,#0FFH
AJMP PTF0R
PTF0R: SETB TR0
RETI
;***************************************************************************************
;顯示子程序
DISPLAY: MOV R5,BUFF ;根據標記輸出帶點和不帶點的數字
CJNE R5,#00H,CVB ;根據標記查不同的表
MOV DPTR,#TAB1
LJMP TYU
CVB: MOV DPTR,#TAB
TYU: MOV A,MIN ;顯示分鍾的個位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0h
CLR P2.4
ACALL DELAY
MOV A,MIN ;顯示分鍾的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.5
ACALL DELAY
MOV A,HOUR ;顯示時鍾的個位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.6
ACALL DELAY
MOV A,HOUR ;顯示時鍾的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.7
ACALL DELAY
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;不帶小數點的字型碼
TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;帶小數點的字型碼
;****************************************************************************************
;延時子程序
DELAY: MOV R4,#20
YAN: MOV R5,#10
SHI: DJNZ R5,SHI
DJNZ R4,YAN
RET
END

以前我的單片機課程設計,提供給你參考參考,不過只有調分和調時的。。。

Ⅵ 你好 就單片機按鍵修改定時器時間問題。

恩!按鍵修改定時器時間的意思就是說!

按鍵控制定時器的的定時時間的改變!
定時器的定時時間是由TH和TL這倆個控制的!如果你改變了這倆個寄存器的值。那麼你就實現了定時器定時時間的修改!

剩下的就是按鍵的控制了!如果你按下按鍵定時器的時間TH和TL增加或者是減少!你就實現了按鍵控制的功能!
//下面的這個程序是一個很好的說明!不過這個程序不是我寫的!如果你想加分就給程序的主人加分吧!我只對程序做一個解釋
#include <reg51.h>
sbit key = P3 ^ 0;

unsigned char Mode = 0;//在程序中有倆個定時時間的模式0和1
//通過按鍵來控制選擇的是那種模式

void delayms( unsigned int t );
void main( void )
{
TMOD = 0x01;
TH0 = 0XFF;
TL0 = 0XFF;
ET0 = 1;
TR0 = 1;
EA = 1;
while(1)
{
if( !key )//按鍵的判斷是否有按鍵按下,並且每次按下後實現模式1和模式0的相互轉換
{
delayms(30);// 延時我就不寫了,你自己寫
if( !key )
{
Mode++;
if( Mode == 3 ) Mode = 0;
}
}
}
}
void timer0_isr( void ) interrupt 1
{
switch( Mode)
{
//下面case 0:是模式0時候的定時器的定時時間
case 0: TH0 = 0XF0;TL0 = 0X01;break; // 我隨意賦值的
//下面case 1:是模式1時候的定時器的定時時間
case 1: TH0 = 0XFd;TL0 = 0X01;break; // 我隨意賦值的
// 自己加

}
希望你能明白
}

Ⅶ 單片機定時的時間怎麼改變

輸出頻率信號用定時器就可以了。定時器溢出中斷程序中改變頻率輸出口電壓反向。如此往復就產生了周期性的脈沖。改變頻率只要改變定時器初值改變溢出時間就可以了。
大體過程是,檢測電壓之後AD轉換之後得到AD值,根據電壓AD值動態調整定時器溢出的時間就可以改變輸出的脈沖信號頻率。

Ⅷ 51單片機製作一個具有鬧鍾功能的24小時的電子鍾,利用按鍵可以調整時間。

有一個4*4矩陣鍵盤的時鍾:

Ⅸ 51單片機做的時鍾 ds1302 通過按鍵改變時間,寫了個按鍵程序,但下進去不好用,求大神指點!

我覺得這種思想 適合寫 匯編,寫C語言的話,還是先練習下數學規律吧。

主函數中 肯定調用了 keyscan 函數,keyscan 函數裡面對 K1按鍵進行了掃描,除去10ms去抖延時,對K1按鍵進行次數記錄(有效值2個,分別是1 和2);
返回 keyscan 函數,如果按鍵沒松開,那麼不執行內容,則退出 keyscan 函數,返回主函數;
主函數肯定是 循環調用 keyscan 函數,重新對 K1按鍵進行掃描計數,
可是 ……可是……這段時間 對 人類來講,太短了,最大不過ms級(除去消抖時間,都是us級),LZ的手甚至都來不及 松開,就 重復發生了;所以,按鍵又被 計算了 一次,緊接著 又被計算了一次,再接著又計算了一次………………也不知道計算了多少次,終於LZ的手鬆開了,可是K1的計算值,到底是 奇數次(1) 還是 偶數次(2) 呢???????沒有人知道。
LZ:沒有人,K1num 到底是 1 還是 2啊?
沒有人:我不知道啊,誰跟你說我知道的?
我不 (和) 誰跟你說我 (一起說):我不知道啊!

閱讀全文

與單片機點動改變時間相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163