导航:首页 > 操作系统 > 单片机点动改变时间

单片机点动改变时间

发布时间: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