本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
为什么秒的时间就是显示不出来 秒的位置显示是00的 不会动的
时间是在加的 不知道错哪了
/***************************************/
/* 利用单片机的定时器做一个时钟; */
/* 在利用这个时钟,约有时间,让他 */
/* 控制继电器,在控制用其他电器工作 */
/* */
/* 目标器件:AT89S51 */
/* 晶振:11.0592MHZ */
/* */
/* KEY1调时,KEY2调分, KEY4调秒 */
/* */
/* KEY3选择显示的模式 */
/* 模式一显示时钟 模式2调节预约时间
/*
电路时间段位也由P0送出 P2.0--p2.6提供驱动电流*/
/*程序 void mode ();可以设置N组模式 可以有N组预约时间
/*你们可以为程序稍作修改就可以完成其他的功能了哦!
/***************************************/
#include <reg51.h>
void display (int k);
void repetitiontime ();
void check_R ();
void mode ();
void check2_k ();
void check1_k ();
void check_k ();
sbit KEY4=P3^0;
sbit KEY1=P3^1;
sbit KEY2=P3^2;
sbit KEY3=P3^3;
sbit RELAY=P1^3;
unsigned char code tab1 [10]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
unsigned char code tab2 [10]={0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
int i=0,k1=0,k2=0,k3=0;
unsigned char min=0,hour=0,sec=0,clock_h=0,clock_m=0,clock_s=0;clock3_h=0,clock3_m=0,count=0,second=0; //定义全局变量
static unsigned char state=0;
/******************1ms延时函数************/
delay1ms(int t)
{
int i;unsigned j;
for(i=0;i<t;i++)
for(j=0;j<120;j++) ;
}
/*****************************************
×××××××××××××××××××××
主循环
×××××××××××××××××××××
******************************************/
void main()
{
int t=0;
EA=1;
ET0=1;
TMOD=0X01;
TH0=0x4c;
TL0=0x00;
TR0=1; //开定时器
while(1)
{
check_R (); //查看是否满足继电器吸和条件
mode ();
repetitiontime (); //循环时间60分 24时制
}
}
/************************************************
LED数码管(显示)功能子函数
*************************************************/
void display (int k)
{
if((second%2==0&&state==0)||(state==1))
{
P2|=0X3F;
P0=tab1[k%10/1]; //秒针的十位
P2&=~(1<<1); //P2口二进制代码是11111110
delay1ms(2);
P2|=0X0F;
P0=tab1[k%1]; //秒针的个位
P2&=~(1<<0); //P2口二进制代码是11111101
delay1ms(2);
P2|=0X3F;
P0=tab1[k%100/10]; //分针的十位
P2&=~(1<<3); //P2口二进制代码是11111011
delay1ms(2);
P2|=0X0F;
P0=tab1[k%10]; //分针的个位
P2&=~(1<<2); //P2口二进制代码是11110111
delay1ms(2);
P2|=0X3F;
P0=tab1[k/1000]; //的小时十位
P2&=~(1<<5);
delay1ms(2);
P2|=0X3F;
P0=tab1[k%1000/100]; //小时的个位
P2&=~(1<<4);
delay1ms(2);
}
else
{
P2|=0X3F;
P0=tab2[k%100/10]; //秒针的十位
P2&=~(1<<1); //P2口二进制代码是11111110
delay1ms(2);
P2|=0X3F;
P0=tab2[k%10]; //秒分针的个位
P2&=~(1<<0); //P2口二进制代码是11111101
delay1ms(2);
P2|=0X3F;
P0=tab2[k%100/10]; //分针的十位
P2&=~(1<<3); //P2口二进制代码是11111110
delay1ms(2);
P2|=0X3F;
P0=tab2[k%10]; //分针的个位
P2&=~(1<<2); //P2口二进制代码是11111101
delay1ms(2);
P2|=0X3F;
P0=tab2[k/1000]; //的小时十位
P2&=~(1<<5);
delay1ms(2);
P2|=0X3F;
P0=tab2[k%1000/100]; //小时的个位
P2&=~(1<<4);
delay1ms(2);
}
}
/************************************************
调节预约时间程序 使用KEY3调节分钟 KEY4调时钟
*************************************************/
void mode ()
{
if(KEY3==0) //选择模式
{ delay1ms(10);
if(KEY3==0)
while(KEY3==0) ;
if(state==0)
{
state=1;
}
else if(state==1)
{
state=0;
}
}
if(state==0) //执行模式,并且调用显示函数
{
check_k (); //查看有无KEY调节时间动作
display(k1);
}
else if(state==1)
{
check1_k ();
display(k2);
}
}
/************************************************
调节时间程序 使用KEY1调节分钟 KEY2调时钟
*************************************************/
void check_k ()
{
if(KEY4==0)
{
delay1ms(200);
sec++;
}
if(KEY1==0)
{
delay1ms(200);
min++;
}
if(KEY2==0)
{
delay1ms(200);
hour++;
}
}
void check1_k ()
{
if(KEY4==0)
{
delay1ms(200);
clock_s++;
}
if(KEY1==0)
{
delay1ms(200);
clock_m++;
}
if(KEY2==0)
{
delay1ms(200);
clock_h++;
}
}
void check2_k ()
{
if(KEY1==0)
{
delay1ms(200);
clock3_m++;
}
if(KEY2==0)
{
delay1ms(200);
clock3_h++;
}
}
/************************************************
循环时分秒程序 repetition n. 重复
*************************************************/
void repetitiontime ()
{
if(second>=60) //秒针至零,分钟加1
{
second=0;
min++;
}
if(min>59) //分钟至零, 时钟加1
{
min=0;
hour++;
}
if(hour>23)
{
hour=0;
}
if(clock_s>59) //分钟至零, 时钟加1
{
clock_s=0;
clock_s++;
}
if(clock_m>59) //分钟至零, 时钟加1
{
clock_m=0;
clock_h++;
}
if(clock_h>23)
{
clock_h=0;
}
k1=hour*100+min; //计算换算之后的值,并给显示函数调用
k2=clock_h*100+clock_m;
}
/************************************************
调整继电器吸和控制程序
*************************************************/
void check_R ()
{
if((hour==clock_h)&&(min==clock_m)&&(sec==clock_s))
{
RELAY=0;
}
}
/*******************************************
中断子函数
*********************************************/
void to (void) interrupt 1 using 1
{
TR0=0;
count++;
TH0=0x4c;
TL0=0x00;
if(count>20)
{
count=0;
second++;
}
TR0=1;
}
/************************************************
函数结束
*************************************************/ |