找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6291|回复: 5
打印 上一主题 下一主题
收起左侧

关于DS1302的数据处理问题

[复制链接]
跳转到指定楼层
楼主
程序是读DS1302,数码管显示
现在遇到的问题是读取的数据在数码管显示的时候只要前一个数据是双数,后一个数据就会变乱码


例如aa-bb-cc,如果AA是双数,BB就会乱码
上个图




二楼贴程序,是我数据处理错了吗?为什么我一直找不出来= =
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:73669 发表于 2015-2-15 16:13 | 只看该作者
这是DS1302的驱动文件


#include "ds1302.h"


unsigned char time_buf1[8] = {20,15,3,27,18,15,00,5};//空年月日时分秒周
unsigned char time_buf[8]; //空年月日时分秒周
/*------------------------------------------------
向DS1302写入一字节数据
------------------------------------------------*/
void Ds1302_Write_Byte(unsigned char addr, unsigned char d)
{


unsigned char i;
RST_SET;

//写入目标地址:addr
addr = addr & 0xFE; //最低位置零
for (i = 0; i < 8; i ++)
{
if (addr & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}

//写入数据:d
for (i = 0; i < 8; i ++)
{
if (d & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
d = d >> 1;
}
RST_CLR;//停止DS1302总线
}
/*------------------------------------------------
从DS1302读出一字节数据
------------------------------------------------*/


unsigned char Ds1302_Read_Byte(unsigned char addr)
{


unsigned char i;
unsigned char temp;
RST_SET;


//写入目标地址:addr
addr = addr | 0x01;//最低位置高
for (i = 0; i < 8; i ++)
{

if (addr & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}

//输出数据:temp
for (i = 0; i < 8; i ++)
{
temp = temp >> 1;
if (IO_R)
{
temp |= 0x80;
}
else
{
temp &= 0x7F;
}
SCK_SET;
SCK_CLR;
}

RST_CLR;//停止DS1302总线
return temp;
}


/*------------------------------------------------
向DS1302写入时钟数据
------------------------------------------------*/
void Ds1302_Write_Time(void)
{

unsigned char i,tmp;
for(i=0;i<8;i++)
{ //BCD处理
tmp=time_buf1[i]/10;
time_buf[i]=time_buf1[i]%10;
time_buf[i]=time_buf[i]+tmp*16;
}
Ds1302_Write_Byte(ds1302_control_add,0x00);//关闭写保护
Ds1302_Write_Byte(ds1302_sec_add,0x80);//暂停
//Ds1302_Write_Byte(ds1302_charger_add,0xa9);//涓流充电
Ds1302_Write_Byte(ds1302_year_add,time_buf[1]);//年
Ds1302_Write_Byte(ds1302_month_add,time_buf[2]);//月
Ds1302_Write_Byte(ds1302_date_add,time_buf[3]);//日
Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周
Ds1302_Write_Byte(ds1302_hr_add,time_buf[4]);//时
Ds1302_Write_Byte(ds1302_min_add,time_buf[5]);//分
Ds1302_Write_Byte(ds1302_sec_add,time_buf[6]);//秒
Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周
Ds1302_Write_Byte(ds1302_control_add,0x80);//打开写保护
}


/*------------------------------------------------
从DS1302读出时钟数据
------------------------------------------------*/
void Ds1302_Read_Time(void)
{
unsigned char i,tmp;
time_buf[1]=Ds1302_Read_Byte(ds1302_year_add);//年
time_buf[2]=Ds1302_Read_Byte(ds1302_month_add);//月
time_buf[3]=(Ds1302_Read_Byte(ds1302_date_add)); //日
time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add);//时
time_buf[5]=Ds1302_Read_Byte(ds1302_min_add);//分
time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒
time_buf[7]=Ds1302_Read_Byte(ds1302_day_add);//周




for(i=0;i<8;i++)
{ //BCD处理
tmp=time_buf[i]/16;
time_buf1[i]=time_buf[i]%16;
time_buf1[i]=time_buf1[i]+tmp*10;
}
}


/*------------------------------------------------
DS1302初始化
------------------------------------------------*/
void Ds1302_Init(void)
{

RST_CLR;//RST脚置低
SCK_CLR;//SCK脚置低
Ds1302_Write_Byte(ds1302_sec_add,0x00);
}
回复

使用道具 举报

板凳
ID:73669 发表于 2015-2-15 16:14 | 只看该作者
main函数在这
#include"stc15f2k60s2.h"
#include"ds1302.h"
#include"intrins.h"


#define uchar unsigned char
#define uint unsigned int


sbit Wr=P3^6;


#define rst573 P2&=0x1f//关闭选中
#define smgY6C P2|=0xc0 //位选
#define smgY7C P2|=0xe0 //段选
#define ledY4C P2|=0x80 //选中LED
#define beeY5C P2|=0xa0 //选中蜂鸣器+继电器


sbit k0=P3^0;
sbit k1=P3^1;
sbit k2=P3^2;
sbit k3=P3^3;
//行线
sbit k4=P3^4;
sbit k5=P3^5;
sbit k6=P4^2;
sbit k7=P4^4;
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
// 全灭+ 1~8wei
uchar code wei[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码


uchar num=0,time;
void CHS_BEEP_close() //关闭蜂鸣器继电器
{ Wr=0;
P2=0x5;
P06=1;
P04=0;
Wr=1;
}


void delay(uint z)//ms延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=1100;y>0;y--);
}


void display(uchar adt1,uchar adt2,uchar adt3)
{




P0=0x00; //消影
delay(1);
Wr=0; //位选
smgY6C;
P0=wei[1];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=duan[adt1/10];
P2=0x1f;
Wr=1;


delay(1);
Wr=0; //位选
smgY6C;
P0=wei[2];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=duan[adt1%10];
P2=0x1f;
Wr=1;


delay(1);
Wr=0; //位选
smgY6C;
P0=wei[3];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=0xbf;
P2=0x1f;
Wr=1;


delay(1);
Wr=0; //位选
smgY6C;
P0=wei[4];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=duan[adt2/10];
P2=0x1f;
Wr=1;


delay(1);
Wr=0; //位选
smgY6C;
P0=wei[5];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=duan[adt2%10];
P2=0x1f;
Wr=1;


delay(1);
Wr=0; //位选
smgY6C;
P0=wei[6];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=0xbf;
P2=0x1f;
Wr=1;


delay(1);
Wr=0; //位选
smgY6C;
P0=wei[7];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=duan[adt3/10];
P2=0x1f;
Wr=1;


delay(1);
Wr=0; //位选
smgY6C;
P0=wei[8];
P2=0x1f;


Wr=0;
smgY7C; //段选
P0=duan[adt3%10];
P2=0x1f;
Wr=1;


}
void keyscan()
{
if(k0==0){delay(50);if(k0==0)num=0;while(!k0);}
if(k1==0){delay(50);if(k1==0)num=1;while(!k1);}
}
void init_time()
{
TMOD=0x00; //16位自动重装定时器
TH0=0xec; //定时5MS
TL0=0x78;
ET0=1;
EA=1;
TR0=1;
}
void main()


{
init_time();
CHS_BEEP_close();
Ds1302_Init();
Ds1302_Write_Time();
Ds1302_Read_Time();
while(1)
{
keyscan();
if(num)display(time_buf1[1],time_buf1[2],time_buf1[3]);//显示年月日
else display(time_buf1[4],time_buf1[5],time_buf1[6]);//显示时分秒
}
}


void timer_0() interrupt 1
{
time++;
if(time==20) //定时读数据
{
Ds1302_Read_Time();
time=0;
}


}
回复

使用道具 举报

地板
ID:73669 发表于 2015-2-15 19:04 | 只看该作者
自顶一下
回复

使用道具 举报

5#
ID:73669 发表于 2015-2-16 12:11 | 只看该作者
人工置顶
回复

使用道具 举报

6#
ID:508281 发表于 2019-4-9 21:27 | 只看该作者
#include <REGX52.H> #include "LCD1602.h" #include "DS1302.h"  void Delay1ms(unsigned int count) {         unsigned int i,j;         for(i=0;i<count;i++)         for(j=0;j<120;j++); }  main() {         SYSTEMTIME CurrentTime;         LCD_Initial();         Initial_DS1302();          GotoXY(0,0);         Print(" tian ma dian zi");         GotoXY(0,1);         Print("Time: ");                  while(1)         {                 DS1302_GetTime(&CurrentTime);                 TimeToStr(&CurrentTime);                 GotoXY(6,1);                 Print(CurrentTime.TimeString);                  Delay1ms(400);         } }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表