这次想做个ds1302的时钟用lcd1602来显示,可是在写完程序之后发现模拟的电路运行不正常,我觉得电路应该没问题,1302已经给他置了初值进去便能计时,现在lcd1602不能显示出正确的时间,我估计是读取1302哪里的问题,要么就是转换为bcd码 再转换为十进制错了 这里的转换我一直不理解 我用的是模块化编程 贴上一部分代码 我是小白 望大神指教。谢谢了。
这个是1302的程序
#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rst=P3^4;
sbit sclk=P3^5;
sbit io=P3^6;
uchar time_data[7]={13,1,5,6,20,47,32} ;//年 星期 月 日 小时 分 秒
uchar time_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81} ;
void write_ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0;
io=dat&0x01; //从低位开始传输
dat=dat>>1;
sclk=1; //数据在上升沿有效 开始写入
}
}
uchar read_ds1302_byte(uchar add)
{
uchar i;
uchar dat;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
write_ds1302_byte(add); //由于写时sclk为高电平
for(i=0;i<8;i++)
{
sclk=0; //读下降沿有效
dat=dat>>1; //只移7位
if(io)
{
dat=dat|0x80;
sclk=1;
}
}
rst=0;
_nop_();
sclk=0;
_nop_();
sclk=1;
_nop_();
io=1;
return(dat);
}
void write_ds1302(uchar add,uchar dat)
{
rst=0;
_nop_();
rst=1;
_nop_();
sclk=0;
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sclk=1;
}
void set_rtc()
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_data[i]/10; //十位
time_data[i]=time_data[i]%10; //个位
time_data[i]=j*16+time_data[i]; //转换为十六进制
}
write_ds1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write_ds1302(time_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80); //加写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302_byte(read_add[i]); //读取的是16进制数 需转换
}
}
这是1602的代码
#include"LCD1602.H"
#include<reg52.h>
#include"DELAY.H"
#include"dds1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^1;
sbit rw=P1^2;
sbit en=P1^3;
unsigned char digital[10]={"0123456789"} ;
void write_data(unsigned char dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delay_50us(6);
en=1;
delay_50us(20);
en=0;
}
void write_command(unsigned char com) /***lcd1602写指令***/
{
rs=0;
rw=0;
en=0; //先拉低使能端,因为初始化默认为高电平
P0=com;
delay_50us(6);
en=1;
delay_50us(20);
en=0;
}
void disp_year()
{
uint i ,j; //十位 个位
i=time_data[0]/16; //十位
j=time_data[0]%16; //个位
write_command(0x80+5);
write_data(digital[i]);
write_command(0x80+6);
write_data(digital[j]);
delay_50us(200); //延时1ms
}
void disp_month()
{
uchar i ,j; //十位 个位
i=time_data[2]/16; //十位
j=time_data[2]%16; //个位
write_command(0x80+8);
write_data(digital[i]);
write_command(0x80+9);
write_data(digital[j]);
delay_50us(200); //延时1ms
}
void disp_date() //日
{
uchar i ,j; //十位 个位
i=time_data[3]/16; //十位
j=time_data[3]%16; //个位
write_command(0x80+11);
write_data(digital[i]);
write_command(0x80+12);
write_data(digital[j]);
delay_50us(200); //延时1ms
}
void disp_day() /***星期***/
{
uchar i ,j; //十位 个位
i=time_data[1]/16; //十位
j=time_data[1]%16; //个位
write_command(0x80+14); //第一列 14行
write_data(digital[i]);
write_command(0x80+15);
write_data(digital[j]);
delay_50us(200); //延时1ms
}
void disp_hour()
{
uchar i ,j; //十位 个位
i=time_data[4]/16; //十位
j=time_data[4]%16; //个位
write_command(0xc0+5); //第一列 14行
write_data(digital[i]);
write_command(0xc0+6);
write_data(digital[j]);
delay_50us(200); //延时1ms
}
void disp_minute()
{
uchar i ,j; //十位 个位
i=time_data[5]/16; //十位
j=time_data[5]%16; //个位
write_command(0xc0+8); //第一列 14行
write_data(digital[i]);
write_command(0xc0+9);
write_data(digital[j]);
delay_50us(200); //延时1ms
}
void disp_second()
{
uint i ,j; //十位 个位
i=time_data[4]/16; //十位
j=time_data[4]%16; //个位
write_command(0xc0+11); //第一列 14行
write_data(digital[i]);
write_command(0xc0+12);
write_data(digital[j]);
delay_50us(200); //延时1ms
}
void disp_all_date()
{
disp_year() ;
disp_month();
disp_day() ; //星期
disp_date(); //日
disp_hour();
disp_minute();
disp_second();
}
void init_lcd1602(void)
{
write_command(0x38);
delay(20);
write_command(0x38);
delay(20);
write_command(0x38);
write_command(0x0c);
delay(20);
write_command(0x06);
delay(20);
write_command(0x01);
delay(20);
}
这是主函数main()
#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#include"DELAY.H"
#include"LCD1602.H"
void main()
{
set_rtc();
init_lcd1602();
write_command(0x80);
write_data('D');
write_data('a');
write_data('t');
write_data('e');
write_data(':');
while(1)
{
read_rtc();
disp_all_date();
}
}
附上模拟电路图片
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
已经解决了 ,折腾了几个小时 谢谢
呵呵,加油吧,以后经常都会遇到这种事.
一周热门 更多>