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; }}