当前位置:
文档之家› 51单片机1302实时时钟1602显示程序
51单片机1302实时时钟1602显示程序
_nop_();
}
}
}
//判忙
void lcd_mang()
{
rs=0;
rw=1;
e=1;
_nop_();
_nop_();
_nop_();
_nop_();
while(P0&0x80);
e=0;
}
//1602的写
void write_lcd1602(uchar cmd,uchar i)
{
lcd_mang();
write_lcd1602(table[l_tmpdate[2]&0x0f],1);
write_lcd1602(':',1);
write_lcd1602(table[(l_tmpdate[1]>>4)&0x0f],1);
write_lcd1602(table[l_tmpdate[1]&0x0f],1);
void Read_RTC(void)//读取日历
{
unsigned char i,*p;
p=read_rtc_address;//地址传递
for(i=0;i<7;i++)//分7次读取秒分时日月周年
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
}
}
/******************************************************************/
/*设定时钟数据*/
/******************************************************************/
void Set_RTC(void)//设定日历
{
unsigned char i,*p,tmp;
for(i=0;i<7;i++){ //BCD处理
//l_tmpdate[7]用于初始值的设定,设定后,就不用每次上电再次修改了
unsigned char l_tmpdate[7]={0,17,19,16,3,6,12};//秒分时日月周年08-05-15 12:00:00 ,初值
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位
/*******************************************************************************
*标题:试验数码管显示时钟*
**
*通过本例程了解DS1302时钟芯片的基本原理和使用,理解并掌握DS1302时钟芯片*
*驱动程序的编写以及实现数字字符在数码管中的显示。*
void delay(uchar a);//1602分函数声明
void lcd_mang();
void write_lcd1602(uchar cmd,uchar i);
void ini_lcd1602();
/************************************************************
write_lcd1602('0',1);
write_lcd1602(table[(l_tmpdate[6]>>4)&0x0f],1);
write_lcd1602(table[l_tmpdate[6]&0x0f],1);
write_lcd1602('-',1);
write_lcd1602(table[(l_tmpdate[4]>>4)&0x0f],1);
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
while(1)
{
Read_RTC();
display();
}
}
/******************************************************************/
/*写一个字节*/
/******************************************************************/
write_lcd1602(':',1);
write_lcd1602(table[(l_tmpdate[0]>>4)&0x0f],1);
write_lcd1602(table[l_tmpdate[0]&0x0f],1);
}
//1602的初始化
void ini_lcd1602()
{
write_lcd1602(0x38,0);
temp>>=1;//右移一位
_nop_();
_nop_();
_nop_();
SCK=1;
}
RST=0;
_nop_();//以下为DS1302复位的稳定时间
_nop_();
RST=0;
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
*注意:JP1302跳线冒要短接。*
*请学员认真消化本例程,懂DS1302在C语言中的操作*
********************************************************************************/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
rs=i;
rw=0;
e=0;
_nop_();
_nop_();
e=1;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
e=0;
}
void display(void)
{
write_lcd1602(0x80+0x01,0);
write_lcd1602('2',1);
/*主函数*/
/******************************************************************/
void main(void)
{
ini_lcd1602();// 1602初始化
Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽
RST=0;
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
RST=1;
_nop_();
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)//循环8次读取数据
{
if(SDA)
temp|=0x80;//每次传输低字节
SCK=0;
以下是1602显示模块
*************************************************************/
void delay(uchar a)
{
uchar i;
while(a--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
#define uint unsigned int
uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar *p,TIM;
code unsigned char table[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
/******************************************************************/
/*函数声明*/
/******************************************************************/
void Write_Ds1302_byte(unsigned char temp);
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//注意,根据需要修改
sbit SCK=P1^0;//时钟
sbit SDA=P1^1;//数据
sbit RST = P1^2;// DS1302复位
write_lcd1602(table[l_tmpdate[4]&0x0f],1);
write_lcd1602('-',1);
write_lcd1602(table[(l_tmpdate[3]>>4)&0x0f],1);
write_lcd1602(table[l_tmpdate[3]&0x0f],1);