
AJMP STRAT
ORG 0003H ;中断0入口地址
ACALL DEL
AJMP INTA ;跳转到中断0服务程序
ORG 0013H ;中断1入口地址
ACALL DEL
AJMP INTB ;跳转到中断1服务程序
STRAT:SETB EA
SETB EX0
SETB EX1
SETB IT0
SETB IT1
;
A8:MOV R6,#0 ;24进制计数器
MOV R5,#0
MOV 25H,#3FH ;时十位
A7:MOV R4,#0
MOV 24H,#3FH ;时个位
A6:MOV R3,#0
MOV 23H,#3FH ;分十位
A5:MOV R2,#0
MOV 22H,#3FH ;分个位
A4:MOV R1 ,#0
;MOV 21H,#3FH; ;秒十位
SETB 21H0
SETB 21H1
SETB 21H2
SETB 21H3
SETB 21H4
SETB 21H5
CLR 21H6
CLR 21H7
A3:MOV R0,#0
MOV 20H,#3FH ;秒个位
;
A2:MOV A,R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 20H,A
MOV A,R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 21H,A
MOV A,R2
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 22H,A
MOV A,R3
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 23H,A
MOV A,R4
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 24H,A
MOV A,R5
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 25H,A
;
MOV 31H,#21
B1:MOV 30H ,#0F0H
A1:MOV P0,20H ;点亮秒个位数码管
CLR P13
ACALL DEL
SETB P13
MOV P0,21H ;点亮秒十位数码管
CLR P12
ACALL DEL
SETB P12
MOV P0,22H ;点亮分个位数码管
CLR P11
ACALL DEL
SETB P11
MOV P0,23H ;点亮分十位数码管
CLR P10
ACALL DEL
SETB P10
MOV P0,24H ;点亮时个位数码管
CLR P27
ACALL DEL
SETB P27
MOV P0,25H ;点亮时十位数码管
CLR P26
ACALL DEL
SETB P26
DJNZ 30H,A1
DJNZ 31H,B1
;
INC R0
CJNE R0,#10,A2
INC R1
CJNE R1,#6,A3
INC R2
;
SETB P14 ;1分钟后关定时
CJNE R2,#0,A11;分个位定时
CJNE R3,#0,A11;分十位定时
CJNE R6,#19,A11;时位定时
CLR P14 ;开定时
;
A11:CJNE R2,#10,A44
INC R3
A12:CJNE R3,#6,A55
INC R6
CJNE R6,#24,A9
AJMP A8
A9:INC R4
CJNE R4,#10,A66
INC R5
CJNE R5,#3,A77
AJMP A8
A44:AJMP A4
A55:AJMP A5
A66:AJMP A6
A77:AJMP A7
;
DEL:MOV R7,#0AH ;延时子程序
AA:DJNZ R7,AA
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
INTA: INC R2 ;中断0服务程序
CJNE R2, #10,B2
MOV R2,#0
INC R3
CJNE R3,#6,B2
MOV R3,#0
B2:RETI
INTB:INC R6 ;中断1服务程序
CJNE R6,#24,B4
MOV R6,#0
MOV R4,#0
MOV R5,#0
AJMP B3
B4:INC R4
CJNE R4, #10,B3
MOV R4,#0
INC R5
CJNE R5,#3,B3
MOV R5,#0
B3:RETI
END
如果你有TC,可以试一试。
VC 的 kbhit() 不能返回 键名。
23:59:59 -- 86400 秒
#include <stdioh>
#include <windowsh>
#include <conioh>
void main()
{
long int t;
int flag =0;
t = 86400;
printf("press S start, press E stop\n");
while(1)
{
if (kbhit() == 'S' || kbhit() == 's') flag =1;
if (kbhit() == 'E' || kbhit() == 'e') flag =0;
Sleep(1000);
if (flag == 1) t = t -1;
if (t <= 0) break;
printf("%d ",t);
}
#include<reg52h>
#include<absacch>
#include<intrinsh>
#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) //到一秒 10ms100
{
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();
}
}
//
/数字电子钟/
//
#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit qingling=P1^0; //清零
sbit tiaofen=P1^1; //调分
sbit tiaoshi=P1^2; //调时
sbit sounder=P1^7; //naozhong
sbit ds = P3^5; // 595
sbit st_cp = P3^7;
sbit sh_cp = P3^4;
uint a,b;
uchar hour,minu,sec, //时钟
hour0,minu0,sec0, //秒表
hour1,minu1,sec1;
h1,h2,m1,m2,s1,s2,//显示位
k,s; //状态转换标志
uchar j,datah,datal;
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/函数声明/
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
void disp595();
/主函数/
void main()
{
init();
while(1)
{
while(TR1)
{
keyscan(); //扫描函数
while(s==1) //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间
{ //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响
keyscan(); //s状态切换(0-》1-》2-》0)通过外部中断1实现。
display(hour1,minu1,sec1); //闹钟时刻显示
}
display(hour0,minu0,sec0);//时钟表显示
while(k) /k是秒表状态(0-》1-》2-》0)通过外部中断0实现。/
{
display(hour,minu,sec); //秒表显示
}
}
}
}
/初始化函数/
void init()
{
a=0;
b=0;
k=0;
s=0;
hour0=0;
minu0=0;
sec0=0;
hour=0;
minu=0;
sec=0;
hour1=0;
minu1=0;
sec1=0;
TMOD=0x11; //定时器0,1工作于方式1;赋初值
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
EX0=1; //秒表中断
EX1=1; //闹钟设定中断
ET0=1;
ET1=1;
IT0=1; //边沿触发方式
IT1=1;
PX0=1;
PX1=1;
TR0=0; //初始,秒表不工作
TR1=1; //时钟一开始工作
}
/定时器0中断/
void timer0_int() interrupt 1 //秒表
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
a++;
if(a==2)
{
a=0;
sec++;
if(sec==100)
{
sec=0; //毫秒级
minu++;
if(minu==60)
{
minu=0; //秒
hour++;
if(hour==60) //分
{
hour=0;
}
}
}
}
}
/外部中断0中断函数/
void ex0_int() interrupt 0
{
k++;
if(k==3)
k=0;
if(k==1)
{
TR0=~TR0;
if(TR0==1)
{
hour=0;
minu=0;
sec=0;
}
}
if(k==2)
{
TR0=~TR0;
}
}
/外部中断1中断函数/
void ex1_int() interrupt 2
{
s++;
if(s==3)
s=0;
}
/定时器1中断/
void timer1_int() interrupt 3 //控制时钟工作
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0 && minu0==minu1)
sounde();
}
b++;
if(b==20)
{
b=0;
sec0++;
if(sec0==60)
{
sec0=0;
minu0++;
if(minu0==60)
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/键盘扫描/
void keyscan()
{
if(s==1)
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec1=0;
minu1=0;
hour1=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu1++;
if(minu1==60)
{
minu1=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour1++;
if(hour1==24)
{
hour1=0;
}
while(!tiaoshi);
}
}
else //调整时钟时间
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec0=0;
minu0=0;
hour0=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu0++;
if(minu0==60)
{
minu0=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour0++;
if(hour0==24)
{
hour0=0;
}
while(!tiaoshi);
}
}
}
/显示函数/
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=sec%10;
datah=table[h1];
datal=select[7];
disp595();
delay(5);
datah=table[h2];
datal=select[6];
disp595();
delay(5);
datah=0x40;
datal=select[5];
disp595();
delay(5);
datah=table[m1];
datal=select[4];
disp595();
delay(5);
datah=table[m2];
datal=select[3];
disp595();
delay(5);
datah=0x40;
datal=select[2];
disp595();
delay(5);
datah=table[s1];
datal=select[1];
disp595();
delay(5);
datah=table[s2];
datal=select[0];
disp595();
delay(5);
}
/disp595()函数/
void disp595()
{
for(j=0;j<8;j++)
{
sh_cp=0;
datal<<=1;
ds=CY;
sh_cp=1;//sh_cp上升沿 移位
}
for(j=0;j<8;j++)
{
sh_cp=0;
datah<<=1;
ds=CY;
sh_cp=1;//sh_cp上升沿 移位
}
st_cp=0;
st_cp=1;//st_cp上升沿 存储
}
/闹钟函数/
void sounde()
{
sounder=~sounder;
}
/延时函数/
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
以上就是关于单片机时钟程序全部的内容,包括:单片机时钟程序、c语言 倒计时时钟程序、求一个关于用C语言编写的电子时钟的程序,内容要有闹钟,可以调整时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)