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

来源:互联网 发布:minecraft编程 编辑:程序博客网 时间:2024/04/27 21:53


/************************************************************************************** 文件名称: main.c * 摘 要:    DS1302实时时钟模块显示到数码管* CPU芯片:  STC12C5A16S2   instruction mode:1T*晶振:        11.0592M* 作 者:    XCY* 修改日期: 2012年3月10日**************************************************************************************///由于数码管只有4个,只显示分钟和秒数#include <reg52.h>     #include <intrins.h>#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);}//初始化DS1302void 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;  }}


原创粉丝点击