跪求:在51单片机中编写用中断程序的时钟程序

如题所述

你这个提问还是不太清楚,中断时钟,有两种,一个是不利用DS1302,一个是利用它。还有,你到底用什么显示呢?所以,紧密点,恩,我现在有两个,一个是不利用DS1302用数码管显示,一个是利用DS1302用1602显示,希望对你有帮助……
如果你要,就联系我吧!
先给你一个数码管的显示的:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char table[]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};
sbit led1=P1^0;sbit led2=P1^1;
uchar num=0,num1=0,i=0,j=0,k=0;
void dsande (long int t1,uchar t2)//显示t1和延时t2函数de:delay,an:and,ds:display
{
uchar t3;
long int y=t1;
for(;t2>0;t2--,y=t1)
for(t3=7;y!=0;t3--,y/=10)
{
P0=0;
P2=(P2&0xf8)|t3;//择位
P0=table[y%10];//这种从低位开始扫描,就只需求关于十的余数,前面的for自然的降位给它,丢最后一个数字
}
}
void main()
{ long int a;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//为第一次做准备,赋值
TH1=(65536-50000)/256;//这是为数码管显示做的准备
TL1=(65536-50000)%256;
EA=1; //开启总中断
ET0=1;//开启定时器0
ET1=1;
TR1=1;
TR0=1;//启动定时器0 //始终执行中断与主函数无关了
while(1)
{ if(i==60)//写在中断里面也行,但这个本身的误差来自程序执行的时间误差
{i=0;
j++;
if(j==60)
{j=0,k++;
if(k==24)
k=0;
}
}
a=k*10000+j*100+i;
dsande(a,1);
}
}
void T1_time() interrupt 3
{
TH1=(65536-50000)/256;
TL0=(65536-50000)%256;
num1++;
if(num1==20)
{
num1=0;
i++;
/*if(i==60)
{i=0;
j++;
if(j==60)
{j=0,k++;
if(k==24)
k=0;
}
}*/
}

}
void T0_time() interrupt 1 //隔50ms跑过来到中断程序里来,
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)//50ms*20为1s
{
num=0;
led1=~led1;//实现灯的闪动
led2=~led2;
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-18
#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();
}

}
第2个回答  2010-10-18
邮箱发过来我给你

用51单片机实现时钟功能程序???
AJMPMAIN;绝对转移指令,2kb范围(11位)内跳转LJMP16位64kb范围内跳转 ;短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,是一条双字节双周期指令 ORG0030H;指明后面的程序从程序存储器的0030H单元开...

用单片机中断控制的电子时钟程序怎么写?
1.时钟肯定要由按键了,个数看个人设计,有了按键肯定要外部中断了~2.计时则会用到定时中断以确定最小精度单位 3.最小精度单位依次进位的换算微妙、秒、分、时、日、星期、月、年……的函数 4.结果要显示出来,显示函数必不可少,看个人用哪种硬件了 ...

51单片机中的定时器中断是怎么用的 ?
void main(){ TMOD=0x01;\/\/设置定时器0为工作方式1(M1 M0为01)TH0=(65536-45872)\/256;\/\/装初值11.0582晶振定时50ms数为45872 TL0=(65536-45872)%256;EA=1;\/\/开总中断 ET0=1;\/\/开定时器0中断 TR0=1;\/\/启动定时器0 while(1);\/\/程序停止在这里等待中断发生 } void T0_time() i...

单片机外部中断控制数码管电子时钟。
TH0 =0x3C; \/\/单片机晶振频率=12M,定时50ms,时间常数=3CB0 TL0 =0xB0;IE =0x82; \/\/开定时器T0中断 TR0 =1; \/\/启动定时器T0 IT0 =1; \/\/设置外部中断为下降沿有效 IT1 =1;while(1){ display(dis); \/\/调显示子程序 if(k1==0) \/\/选择设置 { dis++; \/\/停...

急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言...
\/\/外部中断INT1中断处理程序,停止报警声音void int1() interrupt 2{if(TR1)TR1=0;} 实验说明:按K1按键进入设定状态按K2,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态按K3,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字LCD第二排中间...

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开...
共阳数码管中断程序:include<reg52.h> define uint unsigned int define uchar unsigned char uchar code table[]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uint num,a;uchar bai,shi,ge;void init();void delay(uint);void ...

以中断方法设计单片机秒、分脉冲发生器。设P1.0每秒钟产生一个机器周期...
;51单片机,12MHZ时钟,正脉冲宽度10MS T1S data 30h ;秒 T60S data 31h ;分 org 000h sjmp do ;跳初始化程序 org 000bh ajmp F50HZ ;10毫秒定时中断 do:mov T1S,#100 mov T60S,#60 mov tmod,#00010001b ;双定时T0,T1 setb et0 ;开中断 setb ea ;开中断 MOV TH0,#217...

编一个51单片机外部中断测频率的程序,急求!!
void timers() interrupt 0 {count++;TR0=1;} void timer0() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;t++;} 每一个下降沿到达时conut自加1。开启一个定时器,计算一定时间t内的count值,主程序就好写了,再写一个H=count\/t语句,H就是频率了。总体思路就是这样...

求一个51单片机定时闹钟程序。要C语言。能够调时间
我来发一个C语言51单片机时钟程序,希望能帮到你 \/* 程序功能:带定时闹铃时钟 *\/ \/*---*\/ include <AT89X51.H> \/*包含器件配置文件*\/ define uchar unsigned char define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};\/*...

51单片机设计数码管显示时钟的程序怎么写
include<reg51.h>#define uchar unsigned charuchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};\/\/0-9unsigned char sec=0,min=0,hour=12,scanled;unsigned char key,flashbit,mode,time; unsigned char disdat[8];sbit led=P1^0;void delay(...

相似回答