【无标题】

#include<reg51.h>
#include<ds1302.c>
unsigned char month,year,date,sec,min,hour,i,f,d;
unsigned char cp1,cp2,cp3;													
sbit P1_0 = P1^0;															
code unsigned char seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
										0x92,0x82,0xf8,0x80,0x90};			
bit conv;
void get_ds1302_time(void)													
{
	d = read_ds1302_add(0x81);												
	sec = BCD_DEC_conv(d);												
	d = read_ds1302_add(0x83);										
	min = BCD_DEC_conv(d);												
	d = read_ds1302_add(0x85);											
	hour = BCD_DEC_conv(d);													
	d = read_ds1302_add(0x87);											
	date = BCD_DEC_conv(d);												
   	d = read_ds1302_add(0x89);												
	month = BCD_DEC_conv(d);																							
	d = read_ds1302_add(0x8d);											
	year = BCD_DEC_conv(d);															
}
void time0_isr(void) interrupt 1											
{
	TH0 = (65536 - 2000) / 256;	
	TL0 = (65536 - 2000) % 256;
	cp1++;
	if(cp1 >= 250)															
	{
		cp1 = 0;
		f = ~f;																
		cp2++;
		if(cp2 >= 5)
		{  
			cp2 = 0;
			conv = !conv;													
		}	
	}
	if(conv == 1)
	{
		P0 = 0xff;
		switch(cp3)
		{
				case 0:	P1_0 = 0;P0 = 0x01;P1_0 = 1;P1_0 = 0;				
			        	P0 = seven_seg[sec%10];break;						
				case 1:	
						P1_0 = 0;P0 = 0x02;P1_0 = 1;P1_0 = 0;
						P0 = seven_seg[sec/10];break;						
				case 2:	
						P1_0 = 0;P0 = 0x04;P1_0 = 1;P1_0 = 0;		
						P0 = seven_seg[min%10] & (0x7f | f);break;		
				case 3:	
						P1_0 = 0;P0 = 0x08;P1_0 = 1;P1_0 = 0;
						P0 = seven_seg[min/10];break;						
				case 4:	
						P1_0 = 0;P0 = 0x10;P1_0 = 1;P1_0 = 0;			
						P0 = seven_seg[hour%10] & (0x7f | f);break;			
				case 5:	
						P1_0 = 0;P0 = 0x20;P1_0 = 1;P1_0 = 0;
						P0 = seven_seg[hour/10];break;						
				case 6:	
						P1_0 = 0;P0 = 0x40;P1_0 = 1;P1_0 = 0;			
						P0 = 0xbf;break;									
				case 7:	
						P1_0 = 0;P0 = 0x80;P1_0 = 1;P1_0 = 0;
						P0 = 0xbf;break;									
		}
	}
	else
	{	
		P0 = 0xff;
		switch(cp3)
		{
			case 0:	
					P1_0 = 0;P0 = 0x01;P1_0 = 1;P1_0 = 0;				
					P0 = seven_seg[date%10];break;							
		 	case 1:	
					P1_0 = 0;P0 = 0x02;P1_0 = 1;P1_0 = 0;
					P0 = seven_seg[date/10];break;							
			case 2:	
					P1_0 = 0;P0 = 0x04;P1_0 = 1;P1_0 = 0;		
					P0 = seven_seg[month%10] & (0x7f | f);break;			
			case 3:	
					P1_0 = 0;P0 = 0x08;P1_0 = 1;P1_0 = 0;
					P0 = seven_seg[month/10];break;							
			case 4:	
					P1_0 = 0;P0 = 0x10;P1_0 = 1;P1_0 = 0;			
					P0 = seven_seg[year%10] & (0x7f | f);break;			
			case 5:	
					P1_0 = 0;P0 = 0x20;P1_0 = 1;P1_0 = 0;
					P0 = seven_seg[year/10];break;							
			case 6:	
					P1_0 = 0;P0 = 0x40;P1_0 = 1;P1_0 = 0;			
					P0 = seven_seg[0];break;								
			case 7:	
					P1_0 = 0;P0 = 0x80;P1_0 = 1;P1_0 = 0;
					P0 = seven_seg[2];break;								
		}
	}
	cp3++;
	if(cp3 >= 8)cp3 = 0;			
}
void timer0_init(void)														
{
	TMOD = 0x01;
	TH0 = (65536 - 2000) / 256;	
	TL0 = (65536 - 2000) % 256;
	TR0 = 1;
	ET0 = 1;
	EA  = 1;
}
void main(void)
{
	uchar i = 13;														
	i = DEC_BCD_conv(i);
	

	write_ds1302_add_dat(0x8e,0x00);										
	write_ds1302_add_dat(0x80,0x30);										
	write_ds1302_add_dat(0x82,i);											
	write_ds1302_add_dat(0x84,0x11);										
	write_ds1302_add_dat(0x86,0x28);										
	write_ds1302_add_dat(0x88,0x05);										
	write_ds1302_add_dat(0x8a,0x03);										
	write_ds1302_add_dat(0x8c,0x24);										
	write_ds1302_add_dat(0x8e,0x80); 
	timer0_init();										
	while(1)
	{
		get_ds1302_time();
	}

}




#include <reg51.h>
#define uchar unsigned char								//把 unsigned char 宏定义为 uchar
#define uint unsigned int								//把 unsigned int 宏定义为 uint
sbit rst = P3^4;										//定义复位/片选线接P3.4
sbit scl = P3^7;										//定义串行时钟引脚接P3.7
sbit sda = P3^5;										//定义串行数据输入输出端接P3.5
/*对DS1302初始化*/
void ds1302_init(void)
{
	rst = 0;
	scl = 0;
	rst = 1;
}
/*对DS1302写1字节函数*/
void write_ds1302_onebyte(unsigned char dat)	   
{
	unsigned char i;
	for(i = 0;i < 8;i++)
	{
		sda = (bit)(dat & 0x01);
		scl = 0;
		scl = 1;
		dat = dat >> 1;
	}
}
/*从DS1302读一字节函数*/
uchar read_ds1302_onebyte(void)		
{
	unsigned char i,dat;
	for(i = 0;i < 8;i++)
	{
		scl = 1;
		scl = 0;
		dat = dat >> 1;
		if(sda)dat = dat | 0x80;
	}
	return(dat);	
}
/*对DS1302的某一地址写一字节函数*/
void write_ds1302_add_dat(unsigned char add,unsigned char dat)
{
	ds1302_init();
	write_ds1302_onebyte(add);
	write_ds1302_onebyte(dat);
	scl = 1;
	rst = 0;
}
/*从DS1302的某一地址读一字节函数*/
uchar read_ds1302_add(unsigned char add)									
{
   unsigned char dat_temp;
	ds1302_init();
	write_ds1302_onebyte(add);
	dat_temp = read_ds1302_onebyte();
	scl = 1;
	rst = 0;
	return(dat_temp);
}
/*8421BCD码到十进制转换*/
uchar BCD_DEC_conv(unsigned char x)
{
	unsigned char dec;
	dec =  0x0f & x;
	x = x >> 4;
	dec	= dec + x * 10;
	return(dec);
}
uchar DEC_BCD_conv(unsigned char x)
{
	unsigned char bcd;
	bcd =  x % 10;
	x = x / 10;
	x = x << 4;
	bcd	= bcd | x ;
	return(bcd);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初看心无意,在看已动心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值