采用内部定时做的简单炫彩电子表(定时不精准原因?)
时间:10-02
整理:3721RD
点击:
显示效果
自己做的一个彩色led显示器
焊接的很难看,很不好意思
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LE1=P3^0;
sbit LE2=P3^1;
sbit LE3=P3^2;
sbit K1=P3^3;
sbit K2=P3^4;
sbit K3=P3^5;
sbit K4=P3^5;
sbit W0=P1^0;
sbit W1=P1^1;
sbit W2=P1^2;
sbit W3=P1^3;
sbit W4=P1^4;
sbit W5=P1^5;
/*函数声明*************************************************************/
void s_jian_z();
void xian_s();
void delay_xms(uint);
void key_scan();
void chu_s();
/********************************************************************/
uchar code dH_ma[]={0xdf,0x99,0xef,0x6f,0x7d,0x3f,0xbf,0x47,0xff,0x7f};
uchar code dL_ma[]={0xf8,0x20,0xb8,0xf8,0xc8,0xf8,0xf8,0xc8,0xf8,0xf8};
uchar num=00;f_num=00;s_num=00;
uchar num0;
uchar m_shi,m_ge,f_shi,f_ge,s_shi,s_ge;
uint s_f_k1=0;
uint s_f_k2=0;
/*初始化函数*********************************************************/
void chu_s()
{
TMOD=0x10;
EA=1;
ET1=1;
TR1=1;
}
/*延时函数*************************************************************/
void delay_xms(uint xms)
{ uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*键盘扫描函数*********************************************************/
void key_scan()
{
if(K1==0&&s_f_k1==2) //按下三次k1时间设定完成
{
delay_xms(2);
if(K1==0)
s_f_k1=0;
while (!K1);
}
if(K1==0&&s_f_k1==1)
{
delay_xms(2);
if(K1==0)
s_f_k1=2; //表示k1按下两次 ,可以改变时间的分钟设定新值
while(!K1);
}
if(K1==0)
{
delay_xms(2);
if(K1==0)
s_f_k1=1; //表示k1按下一次 ,可以改变时间的小时设定新值
while(!K1);
}
if(s_f_k1==1)
{
if(K2==0) //表示k1按下之后,按下k2,小时加1
{
delay_xms(2);
if(K2==0)
{
s_num++;
if(s_num==24)
s_num=0;
}
while(!K2);
}
else if (K3==0) //表示按下k1之后,按下k3,小时减1
{
delay_xms(2);
if(K3==0)
{
if(s_num==0)
s_num=24;
s_num--;
}
while(!K3);
}
}
if(s_f_k1==2)
if(K2==0) //表示按下k1两次,按下k2分钟加1
{
delay_xms(2);
if(K2==0)
{
f_num++;
if(f_num==60)
f_num=0;
while(!K2);
}
}
else if (K3==0) //表示k1按下两次,这次按下k3分钟减1
{
delay_xms(2);
if(K3==0)
{
if(f_num==0)
f_num=60;
f_num--;
while(!K3);
}
}
}
/*时间附值函数*********************************************************/
void s_jian_z()
{
if(num0==20)//定时20ms
{
num0=0;
num++;
}
if(num==60)
{
num=0;
f_num++;
}
if(f_num==60)
{
f_num=0;
s_num++;
}
if(s_num==24)
s_num=0;
}
/*键盘扫描函数*********************************************************/
/*扫描显示函数**********************************************************/
void xian_s( )
{
s_jian_z();
m_shi = num/10;
m_ge =num%10;
f_shi =f_num/10;
f_ge =f_num%10;
s_shi =s_num/10;
s_ge =s_num%10;
/**小时十位的显示************************************************/
LE3=1;LE2=1;LE1=1;
W0=0;
P0=dH_ma[s_shi];
P2=dL_ma[s_shi];
delay_xms(5);
P0=0x00;
P2=0x00;
W0=1;
/***小时个位的显示***************************************************/
W1=0;
P0=dH_ma[s_ge];
P2=dL_ma[s_ge];
delay_xms(5);
P0=0x00;
P2=0x00;
W1=1;
/***分钟十位显示******************/
W2=0;
P0=dH_ma[f_shi];
P2=dL_ma[f_shi];
delay_xms(5);
P0=0x00;
P2=0x00;
W2=1;
/**分钟个位显示****************/
W3=0;
P0=dH_ma[f_ge];
P2=dL_ma[f_ge];
delay_xms(5);
P0=0x00;
P2=0x00;
W3=1;
/**秒钟十位显示******/
W4=0;
P0=dH_ma[m_shi];
P2=dL_ma[m_shi];
delay_xms(5);
P0=0x00;
P2=0x00;
W4=1;
/*秒钟个位显示*/
W5=0;
P0=dH_ma[m_ge];
P2=dL_ma[m_ge];
delay_xms(5);
P0=0x00;
P2=0x00;
W5=1;
}
/****主函数*******************************************************/
void main()
{
s_jian_z();
chu_s();
while(1)
{
key_scan(); //检测键盘
if(!s_f_k1) //当调节时间的时候数码管处于闪烁状态
xian_s(); //显示内容
else
while(1)
{
xian_s(); //显示内容
delay_xms(200);
delay_xms(200);
delay_xms(200);
delay_xms(200);
delay_xms(200);
delay_xms(200);
delay_xms(200);
delay_xms(200);
break;
}
xian_s();
}
}
/*中断函数******************************************************/
void T1_time() interrupt 3
{
TH1=0x3c;
TL1=0xb0;
num0++;
}
原理图被我弄丢了,实在不好意思。
现在是采用单片机内部定时,使用中断方式定时,但是出现走时不精准,请问各位大侠这是由于什么原因呢
和晶振有关,所以要走时准确最好用专门的时钟芯片。比如1302
好东西
手工活
谢谢
见笑了
厉害 学习
我是小白,正在学习中