标题:
用数码管显示电子钟,程序简单,适合初学者(内含代码及注解及仿真)
[打印本页]
作者:
1007915414·
时间:
2019-12-8 19:04
标题:
用数码管显示电子钟,程序简单,适合初学者(内含代码及注解及仿真)
#include <reg51.h>
unsigned char code smg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00}; //字形代码,分别为0-9,a-f,-,全灭
unsigned char num[8]={0,0,16,0,0,16,0,0}; //显示缓冲区
unsigned char w;// 移位控制
unsigned char miao,fen,shi; //时间
unsigned char t,i;// 记录定时器中断次数
bit qd=1; //时钟启停控制位
sbit wei =P3^0; //定义P3.0端口为移位按键
sbit tiao=P3^1; //定义P.1端口为调整按键
void delay(unsigned int T) //延时子函数
{
unsigned char b,c;
for(c=T;c>0;c--)
for(b=90;b>0;b--);
}
/*=======================================================
------- 主程序 ------
=======================================================*/
void main()
{ // 定时器1,外部中断0的初始化
TMOD=0x10; //设置定时器T1为方式1模式
ET1=1; //允许定时器T1中断
TL1=0xE0; //设定定时器T1初值
TH1=0xB1; //设定定时器T1初值
EX0=1; //使能外部中断
IT0=1; //指定外部中断0下降沿触发
EX1=1; //开外部中断1
IT1=1; //外部中断1下降沿触发方式
PT1=1;
EA=1; //总中断允许
TR1=1; //启动定时器T1
miao=0,fen=0,shi=0;
num[0]=shi/10;//时高位
num[1]=shi%10;//时低位
num[3]=fen/10;//分高位
num[4]=fen%10;//分地位
num[6]=miao/10;//秒高位
num[7]=miao%10;//秒地位
t=0; //定时器中断次数初始化
w=0; //闪烁控制位,初始无闪烁位
qd=1; //时钟启停标志位
while(1)
{ if(t==50) // 时间的控制
{ t=0;
miao++; //秒自增
if(miao==60) //如果秒等于60
{miao=0;fen++; //0赋值给秒,分自增
if(fen==60) //如果分等于60
{fen=0;shi++; //把0赋值给分,时自增
if(shi==24) shi=0;} //如果时等于24,把0赋值给时
} // 下面是显示缓冲区内容的计算
num[0]=shi/10;num[1]=shi%10;
num[3]=fen/10;num[4]=fen%10;
num[6]=miao/10;num[7]=miao%10;
}
}
}
/*=======================================================
------- 定时器1中断程序 ------
=======================================================*/
void timer1() interrupt 3
{ static unsigned char ss,g;
TL1=0xE0;
TH1=0xB1; //定时20Ms 循环
if(qd) t++;//-----时钟计时
if(w==1||w==2||w==3||w==4||w==5||w==6)
{ ss++;//调位闪烁
if(ss<30)//显示灭
{
switch(w) //选择灭的显示位
{
case 1:g=0;break;//时高位
case 2:g=1;break;//时地位
case 3:g=3;break;//分高位
case 4:g=4;break;//分低位
case 5:g=6;break;//秒高位
case 6:g=7;break;//秒低位
}
for(i=0;i<8;i++)//输出显示
{
P2=i;
if(i==g)P0=0X00;//需要调整的位灭
else P0=smg[num[i]];//正常显示
delay(4);
}
}
else if(ss>=30)//+++++++++++++亮
{
for(i=0;i<8;i++)
{
P2=i;
P0=smg[num[i]];//正常显示
delay(3);
}
if(ss==60) ss=0;
}
}
else//-------不调整时正常显示
{
for(i=0;i<8;i++)
{
P2=i; //把i赋值给P2
P0=smg[num[i]];//正常显示
delay(3);
}
}
}
/*=======================================================
------- 外部中断1中断程序 ------
说明:调整时分秒的每一位
=======================================================*/
void shezhi() interrupt 2
{ if(wei==0) //调整位的按键按下了
{w++;
if(w==7) //如果w等于7
w=0; //把0赋值给w
if(w==0) qd=1; //如果w等于0,把1赋值给qd
else qd=0; //否则把0赋值给qd
}
else if(tiao==0&& w!=0)//调整数据的按键按下了
{
if(w==1) //如果w等于1,调整时的十位
{
num[0]++; //时高位增加
if(num[0]==3) num[0]=0;
}
else if (w==2)//如果w等于2,调整时的个位
{
num[1]++; //时低位增加
if( (num[0]==2 && num[1]==4 ) ||
(num[0]==1 && num[1]==10) ||
(num[0]==0 && num[1]==10) )
num[1]=0;
}
else if (w==3)//如果w等于3,调整分的十位
{
num[3]++; //分高位增加
if(num[3]==6) num[3]=0; //分高位等于6,把0赋值给分高位
}
else if (w==4)//如果w等于4,调整分的个位
{
num[4]++; //分低位增加
if(num[4]==10) num[4]=0; //分低位等于10,把0赋值给分低位
}
else if (w==5)//如果w等于5,调整秒的十位
{
num[6]++; //秒高位增加
if(num[6]==6) num[6]=0; //秒高位等于6,把0赋值给秒高位
}
else if (w==6)//如果w等于6,调整秒的个位
{
num[7]++; //秒低位增加
if(num[7]==10) num[7]=0; //秒低位等于10,把0赋值给秒低位
}
miao=num[7]+num[6]*10;
fen =num[4]+num[3]*10;
shi =num[1]+num[0]*10;
}
}
复制代码
Desktop.zip
(70.58 KB, 下载次数: 48)
2019-12-8 19:04 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
chenqi04431066
时间:
2021-11-11 15:53
原理图在哪
作者:
heicad
时间:
2021-11-11 16:25
chenqi04431066 发表于 2021-11-11 15:53
原理图在哪
在下载的压缩包里面有仿真原理图
51hei.gif
(304.71 KB, 下载次数: 40)
下载附件
2021-11-11 16:25 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1