标题:
8位数码管1302显示时间的单片机仿真与代码
[打印本页]
作者:
liut_text
时间:
2017-11-6 19:36
标题:
8位数码管1302显示时间的单片机仿真与代码
1、注意时序图时要连续,不能中间突然加一个高电平或者低电平,上一个为高,下一时序则为低,不能变化,直到程序完成
2、注意秒分时等寄存器的数据范围,要使CE=1不能直接改变time[0],这样会超出范围
3、定义全局变量在.h文件里定义extern,但不可在前加code
8位数码管1302显示时间仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(24.33 KB, 下载次数: 59)
下载附件
2017-11-7 03:15 上传
0.png
(54.5 KB, 下载次数: 46)
下载附件
2017-11-7 03:16 上传
单片机源程序如下:
#include<reg51.h>
#include<DS1302.h>
#define u8 unsigned char
sbit KEY1=P3^0; //定义功能按键
sbit KEY2=P3^1; //定义加按键
sbit KEY3=P3^2; //定义减按键
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段显示0~9
u8 code smgwei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//行显示
//********延时函数***********//
void delay(unsigned int i)
{
while(i--);
}
//******显示函数*********//
void display_all()
{
int k;
for(k=0;k<8;k++)
{
switch(k)
{
case 0: P1=smgduan[time[2]/16];break;
case 1: P1=smgduan[time[2]%16];break;
case 2: P1=0x40;break;
case 3: P1=smgduan[time[1]/16];break;
case 4: P1=smgduan[time[1]%16];break;
case 5: P1=0x40;break;
case 6: P1=smgduan[time[0]/16];break;
case 7: P1=smgduan[time[0]%16];break;
}
P2=smgwei[k];
delay(100);
P1=0x00;
}
}
//*********显示分*********//
void display_fen()
{
int k;
for(k=2;k<5;k++)
{
switch(k)
{
case 2: P1=0x40;break;
case 3: P1=smgduan[time[1]/16];break;
case 4: P1=smgduan[time[1]%16];break;
}
P2=smgwei[k];
delay(100);
P1=0x00;
}
}
//***********显示秒**********//
void display_miao()
{
int k;
for(k=5;k<8;k++)
{
switch(k)
{
case 5: P1=0x40;break;
case 6: P1=smgduan[time[0]/16];break;
case 7: P1=smgduan[time[0]%16];break;
}
P2=smgwei[k];
delay(100);
P1=0x00;
}
}
//**********显示时***********//
void display_shi()
{
int k;
for(k=0;k<3;k++)
{
switch(k)
{
case 0: P1=smgduan[time[2]/16];break;
case 1: P1=smgduan[time[2]%16];break;
case 2: P1=0x40;break;
}
P2=smgwei[k];
delay(100);
P1=0x00;
}
}
//*********按键判断处理函数****************//
void anjian()
{
int b=1; //设置变量b,判断当为0时按下减按键变为最大值
delay(100);
if(!KEY1)
{
while(!KEY1); //判断按键是否松开
DS1302_Writer(0x8e,0x00);
DS1302_Writer(0x80,time[0]|0x80);//暂停DS1302计时
while(KEY1) //秒加减
{
if(!KEY2){time[0]++;if((time[0]&0x0f)>0x09) time[0]=time[0]+6;while(!KEY2);} //因为是BCD码,所以要加6
if(!KEY3){if(time[0]==0)b--;time[0]--;if((time[0]&0x0f)>0x09) time[0]=time[0]-6;while(!KEY3);} //因为是BCD码,所以要减6
if(time[0]>0x59) time[0]=0; //不能超过最大值和最小值
if(!b) {time[0]=0x59;b=1;}
display_miao(); //显示秒
}
while(!KEY1);
while(KEY1)
{
if(!KEY2){time[1]++;if((time[1]&0x0f)>0x09) time[1]=time[1]+6;while(!KEY2);}
if(!KEY3){if(time[1]==0)b--;time[1]--;if((time[1]&0x0f)>0x09) time[1]=time[1]-6;while(!KEY3);}
if(time[1]>0x59) time[1]=0;
if(!b) {time[1]=0x59;b=1;}
display_fen();
}
while(!KEY1);
while(KEY1)
{
if(!KEY2){time[2]++;if((time[2]&0x0f)>0x09) time[2]=time[2]+6;while(!KEY2);}
if(!KEY3){if(time[2]==0)b--;time[2]--;if((time[2]&0x0f)>0x09) time[2]=time[2]-6;while(!KEY3);}
if(time[2]>0x24) time[2]=0;
if(!b) {time[2]=0x24;b=1;}
display_shi();
}
while(!KEY1)
{
DS1302_STOP(); //DS1302获取改变后的值
}
while(KEY1)
{
display_all(); //显示改变后的值,等待按键KEY1按下确认时间
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
DS1302时间显示.zip
(74.3 KB, 下载次数: 17)
2017-11-6 19:36 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1