DS1302实时时钟模块显示到数码管(共阳极)


/************************************************************************************
*
* 文件名称: main.c 

* 摘 要:    DS1302实时时钟模块显示到数码管

* CPU芯片:  STC12C5A16S2   instruction mode:1T
*晶振:        11.0592M
* 作 者:    XCY
* 修改日期: 2012年3月10日
*
*************************************************************************************/


//由于数码管只有4个,只显示分钟和秒数
#include      
#include 
#define uchar unsigned char
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
 
sbit w1 = P1^0;
sbit w2 = P1^1;
sbit w3 = P1^2; 
sbit w4 = P1^3;
//位寻址寄存器定义
sbit ACC_7 = ACC^7;
//管脚定义
sbit SCLK = P2^6;
sbit DIO= P2^7;
sbit CE = P3^2; 
uchar data time_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned int count=0;
unsigned char table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void InitTimer0(void)
{
    TMOD = TMOD|0x01;
 TMOD = TMOD&0xf1;

 TH0 = 0xf1;
    TL0 = 0x00;   //18.432
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void Write1302 ( unsigned char addr,unsigned char dat )
{
 unsigned char i,temp;
 CE=0; //CE引脚为低,数据传送中止
 SCLK=0; //清零时钟总线
 CE = 1; //CE引脚为高,逻辑控制有效
 //发送地址
 for ( i=8; i>0; i-- ) //循环8次移位
 {
  SCLK = 0;
  temp = addr;
  DIO = (bit)(temp&0x01); //每次传输低字节
  addr >>= 1; //右移一位
  SCLK = 1;
 }
//发送数据
 for ( i=8; i>0; i-- )
 {
  SCLK = 0;
  temp = dat;
  DIO = (bit)(temp&0x01);
  dat >>= 1;
  SCLK = 1;
 }
 CE = 0;
}
//数据读取子程序
unsigned char Read1302 ( unsigned char addr )
{
 unsigned char i,temp,dat1,dat2;
 CE=0;
 SCLK=0;
 CE = 1;
 //发送地址
 for ( i=8; i>0; i-- ) //循环8次移位
 {
  SCLK = 0;
  temp = addr;
  DIO = (bit)(temp&0x01); //每次传输低字节
  addr >>= 1; //右移一位
  SCLK = 1;
 }
//读取数据
 for ( i=8; i>0; i-- )
 {
  ACC_7=DIO;
  SCLK = 1;
  ACC>>=1;
  SCLK = 0;
 }
 CE=0;
 dat1=ACC;
 dat2=dat1/16; //数据进制转换
 dat1=dat1%16; //十六进制转十进制
 dat1=dat1+dat2*10;
 return (dat1);
}
//初始化DS1302
void Initial(void)
{
 //Write1302 (WRITE_PROTECT,0X00); //禁止写保护
 //Write1302 (WRITE_SECOND,0x00); //秒位初始化
 //Write1302 (WRITE_MINUTE,0x02); //分钟初始化
 //Write1302 (WRITE_HOUR,0x00); //小时初始化
 //Write1302 (WRITE_PROTECT,0x80); //允许写保护
}

void Get1302 (uchar time_data[])   /*获取DS1302时间*/
{
 time_data[2] = Read1302 ( READ_SECOND );
 time_data[1] = Read1302 ( READ_MINUTE );
 time_data[0] = Read1302 ( READ_HOUR );
}
void delay(void){  
 unsigned char m=10;
 while(m--);
}
void main()
{
InitTimer0();
 Initial();/*DS1302初始化*/
 while(1)
 {
 if(count % 200 == 0)
  Get1302(time_data);
 w1=0;  //选择千位数码管
 P0=table[time_data[1]/10]; //查找定义好的数码管段值与P0口输出
 delay();  //加入短暂延时
 P0=0XFF;  //清除数码管显示,因是共阳型,所以不是0
 w1=1;  //关闭千位数码管
 w2=0;  //选择百位数码管
 P0=table[time_data[1]%10]; //查找定义好的数码管段值与P0口输出
 delay();  //加入短暂延时
 P0=0XFF;  //清除数码管显示,因是共阳型,所以不是0
 w2=1;  //关闭百位数码管
 
 w3=0;  //选择十位数码管
 P0=table[time_data[2]/10]; //查找定义好的数码管段值与P0口输出
 delay();  //加入短暂延时
 P0=0XFF;  //清除数码管显示,因是共阳型,所以不是0
 w3=1;  //关闭十位数码管
 w4=0;  //选择个位数码管
 P0=table[time_data[2]/10]; //查找定义好的数码管段值与P0口输出
 delay();  //加入短暂延时
 P0=0XFF;  //清除数码管显示,因是共阳型,所以不是0
 w4=1;  //关闭个位数码
 }
  
}
void Timer0Interrupt(void) interrupt 1   //2.5毫秒,误差0;
{
 TH0 = 0xf1;
    TL0 = 0x00;    //18.432
   
 count+=1;
 if(count >= 400)
 {
  count = 0; 
 }
}


你可能感兴趣的:(单片机)