51单片机做可调时钟(带秒表)另附proteus仿真图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;//毫秒级
min++;
if(min==60)
{
min=0;//秒
sbit LATCH1=P2^2;//定义锁存使能端口段锁存
sbit LATCH2=P2^3;//位锁存
uint a,b,j;
uchar TempData[8];
hour,min,sec, //时钟
hour0,min0,sec0,//秒表
k;//状态转换标志
uchar code weima[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void timer1_int() interrupt 3//控制时钟工作
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
b++;
if(b==20)
{
b=0;
sec0++;
if(sec0==60)
{
sec0=0;
min0++;
if(min0==60)
{
min0=0;
void init();
void delay(uchar z);
void display(uchar hour,uchar min,uchar sec);
/*****************主函数*************************/
void main()
{
init();
while(TR1)
/*********************单片机课程设计**************************/
/*********************信息学院09级电一***********************/
/**************************柳剑*******************************/
TL1=(65536-50000)%256;
EA=1;
EX0=1;//秒表中断
ET0=1;
ET1=1;
IT0=1;//边沿触发方式
IT1=1;
PX0=1;
PX1=1;
TR0=0;//初始,秒表不工作
TR1=1;//时钟一开始工作
}
/*****************定时器0中断*************/
TempData[4]=duanma[min%10];
TempData[5]=0x40;
TempData[6]=duanma[sec/10];//用于显示秒
TempData[7]=duanma[sec%10];
for(i=0;i<8;i++)
{
P0=weima[i];//取位码
LATCH2=1;//位锁存
void init()
{
a=0;
b=0;
k=0;
hour0=12;
min0=0;
sec0=0;
hour=0;
min=0;
sec=0;
TMOD=0x11;//定时器0,1工作于方式1;赋初值
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
LATCH2=0;
P0=TempData[7-i]; //取显示数据,段码
LATCH1=1;//段锁存
LATCH1=0;
delay(2);//扫描间隙延时,时间太长会闪烁,
//太短会造成重影
}
}
/*************延时函数****************/
void delay(uchar z)
hour++;
if(hour==60)//分
{
hour=0;
}
}
}
}
}
/*************外部中断0中断函数************/
void ex0_int() interrupt 0
{
k++;
if(k==3)//状态变换1(时)〉〉2(秒表)〉〉3(调时)〉〉1
k=0;
}
/*************定时器1中断****************/
if(add_hour==0)
{
hour0++;
if(hour0==24)
{
hour0=0;
}
}
while(!add_hour)
{
display(hour0,min0,sec0);
}
}
}
/*****************按键扫描2***************/
void keyscan2()
{
if(reset==0)
{
int x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
Proteus仿真电路连接图:
{
delay(10);
if(reset==0)
{
hour=0;
min=0;
sec=0;
}
}
if(add_hour==0)
{
delay(10);
if(add_hour==0)
{
TR0=~TR0;
}
while(!add_hour)
{
display(hour,min,sec);
}
}
}
/*************扫描显示函数****************/
{
display(hour0,min0,sec0);//时钟表显示
while(k)
{
if(k==1)
{
TR0=0;
keyscan2();
display(hour,min,sec);
}
if(k==2)
{
keyscan1();
display(hour0,min0,sec0);
}
}
}
}
/*****************初始化函数***********************/
minБайду номын сангаас=0;
hour0=12;
}
}
if(add_min==0)
{
delay(10);
if(add_min==0)
{
min0++;
if(min0==60)
{
min0=0;
}
while(!add_min)
{
display(hour0,min0,sec0);
}
}
}
if(add_hour==0)
{
delay(10);
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/*************按键扫描1****************/
void keyscan1()
{
//display(hour0,min0,sec0);
if(reset==0)
{
delay(10);
if(reset==0)
{
sec0=0;
void display(uchar hour,uchar min,uchar sec)
{
unsigned char i;
TempData[0]=duanma[hour/10];
TempData[1]=duanma[hour%10];
TempData[2]=0x40;
TempData[3]=duanma[min/10];//用于显示分
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit menu=P3^2;
sbit reset=P1^0;//清零,秒表状态下也是清零
sbit add_min=P1^1;//调分时加一
sbit add_hour=P1^2;//调时时加一,秒表时按下不动跑表,松开暂停,再次按下继续跑表
uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*****************函数声明***********************/
void keyscan1();
void keyscan2();
相关文档
最新文档