51单片机试验板-sch-pcb-4.0M.zip
源代码在线查看: 数码管显示时钟演示程序.c
/*********************************************************************
公司名称:
模块名称:数码管显示时钟演示程序
功 能:利用实时时钟 时钟芯片型号:DS1302
说 明:
程序设计:朱雷
设计时间:2008.01.19
版 本 号: V1.0
*********************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^6;//
sbit aa=P2^0; //74hc138
sbit bb=P2^1;
sbit cc=P2^2;
sbit LE1=P2^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
sbit ds1302_RST=P1^1;
sbit ds1302_IO=P1^2;
sbit ds1302_SCLK=P1^0;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void init();
void delay_50us(uint t);
void display();
uchar read_Byte();
void write_Byte(uchar tdata);
void write_data_ds1302(uchar taddr,uchar tdata);
uchar read_data_ds1302(uchar taddr);
void set_ds1302(uchar *P1302);
void get_ds1302() ;
void init_ds1302();
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar initial_time[]={0x00,0x00,0x12};
// 秒 分 时 日 月 周 年
uchar data now_time[3];
void main()
{
init();
init_ds1302();
set_ds1302(initial_time);
while(1)
{
get_ds1302();
display();
}
}
/********************************************************************
*函 数 名:delay_50us(uchar )
*功能描述:延时
*函数说明:延时50us
*调用函数:
*全局变量:
*输 入:
*返 回:
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/********************************************************************
*函 数 名:delay_50us(uchar )
*功能描述:延时
*函数说明:延时50us
*调用函数:
*全局变量:
*输 入:
*返 回:
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void init()
{
P0=0xff;
P2=0xff;
P1=0xff;
}
/*数码管显示模块部分*/
/********************************************************************
*函 数 名:display()
*功能描述:数码管显示
*函数说明:显示格式为:
*调用函数:
*全局变量:
*输 入:
*返 回:
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void display()
{
uchar i;
LE1=1;//选通hc573
//分别依次选通数码管的位选端
aa=1;
bb=1;
cc=1;
i=now_time[0]%16; //显示秒个
P0=table[i];
delay_50us(20);
aa=0;
bb=1;
cc=1;
i=now_time[0]/16; //显示秒十
P0=table[i];
delay_50us(20);
aa=1;
bb=0;
cc=1;
P0=table[10];//显示"-"
delay_50us(20);
aa=0;
bb=0;
cc=1;
i=now_time[1]%16; //显示分个
P0=table[i];
delay_50us(20);
aa=1;
bb=1;
cc=0;
i=now_time[1]/16; //显示分十
P0=table[i];
delay_50us(20);
aa=0;
bb=1;
cc=0;
P0=table[10]; //显示"-"
delay_50us(20);
aa=1;
bb=0;
cc=0;
i=now_time[2]%16; //显示时个
P0=table[i];
delay_50us(20);
aa=0;
bb=0;
cc=0;
i=now_time[2]/16; //显示时十
P0=table[i];
delay_50us(10);
}
/*ds1302模块部分*/
/********************************************************************
*函 数 名:read_Byte()
*功能描述:实时时钟读一字节
*函数说明:读DS13021Byte数据 下降沿输出一位数据
*调用函数:
*全局变量:
*输 入:ds1302_SCLK=0;
*返 回:ACC
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
uchar read_Byte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=ds1302_IO;//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿
ds1302_SCLK=1;
ds1302_SCLK=0;//产生下降沿输出一位数据
}
return(ACC);
}
/********************************************************************
*函 数 名:write_Byte()
*功能描述:实时时钟写一字节
*函数说明:往DS1302写入1Byte数据 上升沿输入数据
*调用函数:
*全局变量:
*输 入:ds1302_SCLK=0;tdata
*返 回:
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void write_Byte(uchar tdata)
{
uchar i;
ACC=tdata;
for(i=8;i>0;i--)
{
ds1302_IO=ACC0;
ds1302_SCLK=1;
ds1302_SCLK=0;//产生上升沿输入数据
ACC=ACC>>1;
}
}
/********************************************************************
*函 数 名:write_data_ds1302(uchar taddr,uchar tdata)
*功能描述:实时时钟写数据
*函数说明:先写地址,后写命令/数据
*调用函数:write_Byte(uchar tdata)
*全局变量:
*输 入:taddr;tdata
*返 回:
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void write_data_ds1302(uchar taddr,uchar tdata)
{
ds1302_RST=0;
ds1302_SCLK=0;
ds1302_RST=1;
write_Byte(taddr);
write_Byte(tdata);
ds1302_RST=0;
ds1302_SCLK=1;
}
/********************************************************************
*函 数 名:read_data_ds1302(uchar taddr,uchar tdata)
*功能描述:读实时时钟地址里的数据
*函数说明:先写地址,后读命令/数据
*调用函数:write_Byte(uchar tdata);read_Byte()
*全局变量:
*输 入:taddr;
*返 回:tdata
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
uchar read_data_ds1302(uchar taddr)
{
uchar tdata;
ds1302_RST=0;
ds1302_SCLK=0;
ds1302_RST=1;
write_Byte(taddr);
tdata=read_Byte();
ds1302_RST=0;
ds1302_SCLK=1;
return(tdata);
}
/********************************************************************
*函 数 名:set_ds1302()
*功能描述:设置初始时间
*函数说明:先写地址,后读命令/数据
*调用函数:
*全局变量:
*输 入:taddr;
*返 回:tdata
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void set_ds1302(uchar *P1302)
{
uchar i;
uchar taddr = 0x80;
write_data_ds1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
for(i =3; i>0; i--)
{
write_data_ds1302(taddr,*P1302); /* 秒 分 时 日 月 星期 年 */
P1302++;
taddr+=2;
}
write_data_ds1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}
/********************************************************************
*函 数 名:get_ds1302()
*功能描述:设置初始时间
*函数说明:先写地址,后读命令/数据
*调用函数:
*全局变量:
*输 入:now_time[];
*返 回:
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void get_ds1302()
{
uchar k;
uchar taddr = 0x81;
for (k=0; k {
now_time[k] = read_data_ds1302(taddr);/*格式为: 秒 分 时 日 月 星期 年 */
taddr+= 2;
}
}
/********************************************************************
*函 数 名:init_ds1302()
*功能描述:初始化ds1302
*函数说明:先写地址,后读命令/数据
*调用函数:
*全局变量:
*输 入:
*返 回:
*设 计:朱雷 日 期:2008-01-19
*修 改: 日 期:
*版 本:
***********************************************************************/
void init_ds1302()
{
ds1302_RST=0;
ds1302_SCLK=0;
write_data_ds1302(0x8e,0x00);
write_data_ds1302(0x90,0xa5);//打开充电二级管 一个二级管串联一个2K电阻
}