找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

關(guān)于DS1302的數(shù)據(jù)處理問題

查看數(shù): 6812 | 評論數(shù): 5 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2015-2-15 16:13

正文摘要:

程序是讀DS1302,數(shù)碼管顯示 現(xiàn)在遇到的問題是讀取的數(shù)據(jù)在數(shù)碼管顯示的時候只要前一個數(shù)據(jù)是雙數(shù),后一個數(shù)據(jù)就會變亂碼 例如aa-bb-cc,如果AA是雙數(shù),BB就會亂碼 上個圖 二樓貼程序,是我數(shù)據(jù) ...

回復(fù)

ID:508281 發(fā)表于 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);         } }
ID:73669 發(fā)表于 2015-2-16 12:11
人工置頂
ID:73669 發(fā)表于 2015-2-15 19:04
自頂一下
ID:73669 發(fā)表于 2015-2-15 16:14
main函數(shù)在這
#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//關(guān)閉選中
#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() //關(guān)閉蜂鳴器繼電器
{ Wr=0;
P2=0x5;
P06=1;
P04=0;
Wr=1;
}


void delay(uint z)//ms延時函數(shù)
{
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) //定時讀數(shù)據(jù)
{
Ds1302_Read_Time();
time=0;
}


}
ID:73669 發(fā)表于 2015-2-15 16:13
這是DS1302的驅(qū)動文件


#include "ds1302.h"


unsigned char time_buf1[8] = {20,15,3,27,18,15,00,5};//空年月日時分秒周
unsigned char time_buf[8]; //空年月日時分秒周
/*------------------------------------------------
向DS1302寫入一字節(jié)數(shù)據(jù)
------------------------------------------------*/
void Ds1302_Write_Byte(unsigned char addr, unsigned char d)
{


unsigned char i;
RST_SET;

//寫入目標(biāo)地址: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;
}

//寫入數(shù)據(jù):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讀出一字節(jié)數(shù)據(jù)
------------------------------------------------*/


unsigned char Ds1302_Read_Byte(unsigned char addr)
{


unsigned char i;
unsigned char temp;
RST_SET;


//寫入目標(biāo)地址: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;
}

//輸出數(shù)據(jù):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寫入時鐘數(shù)據(jù)
------------------------------------------------*/
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);//關(guān)閉寫保護(hù)
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);//打開寫保護(hù)
}


/*------------------------------------------------
從DS1302讀出時鐘數(shù)據(jù)
------------------------------------------------*/
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);
}

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表