#include <reg51.h>
#define uint unsigned int //
宏定义
#define uchar unsigned char //
宏定义
uchar i=0,j=0,k=0, s=0,f=0,m=0,lbbz=0,a[7]; //
定义变量
sbit tz=P3^0; //
位定义
sbit sz1=P3^1; //
位定义
sbit fz1 =P3^2; //
位定义
sbit mz1 =P3^3; //
位定义
sbit ss =P3^4; //
位定义
sbit lb =P3^5; //
位定义
sbit dula=P1^6;sbit wela=P1^7;
uchar code sz[]={0x3f,0x06,0xdb,0x4f, //
数字编码表
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71} ;
uchar code xw[]={ 0xff,0xfe,0xfd,0xfb,0xf7, //
选位编码表
0xef,0xdf,0xbf,0x7f
};
void pf() //
区分出个位和十位
{
a[1]=s/10;
a[2]=s%10;
a[3]=f/10;
a[4]=f%10;
a[5]=m/10;
a[6]=m%10;
}
void ys ( int d ) //
延时函数
{
int b ,c ;
for (b = d;b>0;b--)
for (c=110;c>0;c--) ;
}
void xs() //
显视函数
{
pf() ;
for (k=1;k<=6;k++)
{
P0=sz[a[k]]; dula=1; dula=0;
P2=xw[k]; wela=1; wela=0;
ys(3);
}
基于times New Roman">C语言的51单片机可调数字钟的设计
}
void dczd() interrupt 1 //
定时中断
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
i++;
if (i==4)
{
ss=1;
if (lbbz==1)
{
lbbz=0;
lb=0;
}
}
if (i==20)
{
i=0;
ss=0;
m++;
if (m==60)
{
m=0;
f++;
if (f==60)
{
f=0;
s++;
lbbz=1;
if (s==24)
s=0;
}
}
}
}
void cs() //
初始函数
{
TMOD=0x01; //
设置为定时工作方式
TH0=(65535-50000)/256; //
定时器装初值
TL0=(65535-50000)%256; //
定时器装初值
EA=1; //
打开总中断
ET0=1; //
打开定时中断
TR0=1; //
起用定时器
P3=0X0f;
基于C语言的51单片机可调数字钟的设计
}
void main ()
{
cs();
lb=0;
while (1)
{
xs();
if (lbbz==1)
lb=~lb;
if( tz==0)
{
j++;
while (!tz) ;
TR0=0;
while (j>0)
{
xs();
if( tz==0)
{
ys(5);
if( tz==0)
j=0;
while (!tz);
}
if( sz1==0)
{
ys(5);
if( sz1==0)
{
while (!sz1);
s++;
if (s==24)
s=0;
}
}
if( fz1==0)
{
ys(5);
if( fz1==0)
{
while (!fz1);
f++;
if (f==60)
基于C语言的51单片机可调数字钟的设计
f=0;
}
}
if( mz1==0)
{
ys(5);
if( mz1==0)
{
while (!mz1);
m++;
if (m==60)
m=0;
}
}
}
if (j==0)
TR0=1;
}
}
}
这个程序本是没有用锁存器的,完全可以正常工作,但是当我加上那点锁存器的程序就不行了,
简单时钟,第一个按键选择调整时间,第二三四个就是调整时分秒的
没错,是这样的
算了,我干脆就用三极管驱动得了
仿真里面出的问题是秒的个位变,十位也跟着变,但是都不是正确的码,类推,秒的十位变分的个位就变,但是当我把按键一直按下,显示就正常了,但是不是延时的问题
一周热门 更多>