欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關于時鐘芯片DS1302全部RAM讀寫方法!
[打印本頁]
作者:
skcheng
時間:
2021-9-3 23:01
標題:
關于時鐘芯片DS1302全部RAM讀寫方法!
各位前輩師傅們好!
我是初學者請多包涵!這里懇請前輩們能否指導我寫一個利用c51單片機掛接DS1302時鐘芯片 然后設計按一下k1 單片機一次性讀出DS1302內部全部RAM的數據 然后再按一下k2 再一次性寫入DS1302內部全部RAM寄存器。手里有一套普中A4-1開發板套裝,利用這個套裝讀寫 感謝前輩指導!
作者:
188610329
時間:
2021-9-3 23:45
sbit RST = P3^0;
sbit SCLK = P3^1;
sbit IO = P3^2;
/**************************************
從DS1302讀1字節數據
**************************************/
unsigned char DS1302_ReadByte()
{
unsigned char i;
unsigned char dat = 0;
for (i=0; i<8; i++) //8位計數器
{
SCLK = 0; //時鐘線拉低
delay(us1); //延時等待
dat >>= 1; //數據右移一位
if(IO) dat |= 0x80; //讀取數據
SCLK = 1; //時鐘線拉高
delay(us1); //延時等待
}
return dat;
}
/**************************************
向DS1302寫1字節數據
**************************************/
void DS1302_WriteByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++) //8位計數器
{
SCLK = 0; //時鐘線拉低
dat >>= 1; //移出數據
IO = CY; //送出到端口
delay(us1); //延時等待
SCLK = 1; //時鐘線拉高
delay(us1); //延時等待
}
}
/**************************************
開關DS1302寫保護
**************************************/
void DS1302_WriteProtect(bit sw)
{
SCLK = 0;
delay(us1);
RST = 1;
delay(us2); //延時等待
DS1302_WriteByte(0x8e); //寫保護地址
if(sw) DS1302_WriteByte(0x80); //寫保護開
else DS1302_WriteByte(0x00); //寫保護關
RST = 0;
delay(us2); //延時等待
}
/**************************************
從 DS2302 中批量讀取數據
**************************************/
void DS1302_BurstRead(unsigned char addr, unsigned char n, unsigned char *p)
{
DS1302_WriteProtect(1); //讀取穩定作用(避免FF,還防誤操作)
SCLK = 0;
delay(us1);
RST = 1;
delay(us1); //延時等待
DS1302_WriteByte(addr); //寫地址
delay(us2);
while (n--)
{
*p++ = DS1302_ReadByte();
}
RST = 0;
delay(us1); //延時等待
}
/**************************************
往 DS1302 中批量寫入數據
**************************************/
void DS1302_BurstWrite(unsigned char addr, unsigned char n, unsigned char *p)
{
DS1302_WriteProtect(0); //開寫保護
SCLK = 0;
delay(us1);
RST = 1;
delay(us2); //延時等待
DS1302_WriteByte(addr); //寫地址
while (n--)
{
DS1302_WriteByte(*p++);
}
RST = 0;
delay(us2); //延時等待
DS1302_WriteProtect(1); //開寫保護
}
調用的時候:
DS1302_BurstWrite(0xFE, 31, &Buff); // Buff 為 你自己聲明的數組變量
DS1302_BurstRead(0xFF, 31, &Buff); // Buff 為 你自己聲明的數組變量
作者:
skcheng
時間:
2021-9-4 07:12
感謝指導,我試一下!
作者:
man1234567
時間:
2021-9-4 08:43
用A4-1開發板套裝自帶的DEMO就可以,隨機光盤上有,光盤丟失可以去官網下載。
作者:
skcheng
時間:
2021-9-4 11:17
我下載的光盤資料里面是DS1302+LCD1602程序只是時鐘寄存器我就是想麻煩您 能寫一個簡單的讀取DS1302時鐘寄存器和31個RAM寄存器的數據 比如 按k1 一次批量讀取所以寄存器數據 按k2一次批量寫入所以寄存器數據!這樣程序小一點好理解些!感謝!
作者:
188610329
時間:
2021-9-4 14:12
skcheng 發表于 2021-9-4 11:17
我下載的光盤資料里面是DS1302+LCD1602程序只是時鐘寄存器我就是想麻煩您 能寫一個簡單的讀取DS1302時鐘寄 ...
你要簡單得一鍵讀寫,我給你留的那個就是最簡單的了.
無非就是判斷 K1 了調用 BurstRead 判斷 K2了就是調用 BurstWrite
學要保存數據的變量數組你自己聲明了后 替換 &Buff
需要讀 RAM 就是 0xff 讀 時鐘就是 0xbf
需要寫 RAM 就是 0xfe 寫 時鐘就是 0xbe
RAM 的變量數組長度 31 , 時鐘數組 變量長度 8
剩下的你自己搞,延時函數沒貼,你自己寫一個就好。按手冊要求DS1302的時鐘間隔需要1us, CE間隔需要4us,實測CE間隔2us足夠了,時鐘間隔 0.5us也足夠了。你看著替換我代碼里的 delayus 就可以了。
作者:
angmall
時間:
2021-9-4 16:33
程序分享出來給需要的人作參考
/*****************************************************************************************/
/****************************************main.c********************************************/
/*****************************************************************************************/
#include "reg52.h"
#include "DS1302.h"
#include "LCD1602.h"
sbit K1 = P3^1;
sbit K2 = P3^0;
sbit K3 = P3^2;
uchar TIMEtemp1[7];
uchar TIMEtemp2[7];
uchar code RAMreadaddr[7] = {0xc1,0xc3,0xc5,0xc7,0xc9,0xcb,0xcd};
uchar code RAMwriteaddr[7] = {0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc};
void LCD1602display();
void delay10ms(void);
void keypress();
void main()
{
LCD1602Init();
DS1302Init();
while(1)
{
DS1302readtime();
LCD1602display();
keypress();
}
}
void LCD1602display()
{
LCDwriteorder(0x80);
LCDwritedata('2');
LCDwritedata('0');
LCDwritedata('0'+TIME[6]/16); //year
LCDwritedata('0'+(TIME[6]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIME[4]/16); //month
LCDwritedata('0'+(TIME[4]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIME[3]/16); //day
LCDwritedata('0'+(TIME[3]&0x0f));
LCDwriteorder(0x8D);
LCDwritedata('0'+(TIME[5]&0x07));//week
LCDwriteorder(0x80+0x40);
LCDwritedata('0'+TIME[2]/16); //hour
LCDwritedata('0'+(TIME[2]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIME[1]/16); //minute
LCDwritedata('0'+(TIME[1]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIME[0]/16); //second
LCDwritedata('0'+(TIME[0]&0x0f));
}
void delay10ms(void) //10 ms 0 mission
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void keypress()
{
uchar n;
if(K1==0)
{
delay10ms();
if(K1==0)
{
for (n=0; n<7; n++)//讀取七個字節的時鐘信號:分秒時日月周年
{
TIMEtemp1[n] = DS1302read(RTCreadaddr[n]);
}
DS1302write(0x8E,0x00);
for(n=0;n<7;n++)
{
DS1302write(RAMwriteaddr[n],TIMEtemp1[n]);
}
DS1302write(0x8E,0x80);
}
while(!K1);
}
if(K2==0)
{
delay10ms();
if(K2==0)
{
for(n=0;n<7;n++)
{
TIMEtemp2[n]=DS1302read(RAMreadaddr[n]);
}
while(1)
{
LCDwriteorder(0x80);
LCDwritedata('2');
LCDwritedata('0');
LCDwritedata('0'+TIMEtemp2[6]/16); //year
LCDwritedata('0'+(TIMEtemp2[6]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIMEtemp2[4]/16); //month
LCDwritedata('0'+(TIMEtemp2[4]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIMEtemp2[3]/16); //day
LCDwritedata('0'+(TIMEtemp2[3]&0x0f));
LCDwriteorder(0x8D);
LCDwritedata('0'+(TIMEtemp2[5]&0x07));//week
LCDwriteorder(0x80+0x40);
LCDwritedata('0'+TIMEtemp2[2]/16); //hour
LCDwritedata('0'+(TIMEtemp2[2]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIMEtemp2[1]/16); //minute
LCDwritedata('0'+(TIMEtemp2[1]&0x0f));
LCDwritedata('-');
LCDwritedata('0'+TIMEtemp2[0]/16); //second
LCDwritedata('0'+(TIMEtemp2[0]&0x0f));
if(K3==0)
{
delay10ms();
if(K3==0)
{
LCD1602display();
break;
}
}
}
}
}
}
/*****************************************************************************************/
/****************************************DS1302.h*****************************************/
/*****************************************************************************************/
#define __DS1302_H_
#include "reg52.h"
#include "intrins.h"
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
sbit DSIO = P3^4;
sbit RST = P3^5;
sbit SCLK = P3^6;
void DS1302write(uchar addr,uchar dat);
uchar DS1302read(uchar addr);
void DS1302Init();
void DS1302readtime();
extern uchar TIME[7];
extern uchar code RTCreadaddr[7];
extern uchar code RTCwriteaddr[7];
#endif
/*****************************************************************************************/
/****************************************DS1302.c*****************************************/
/*****************************************************************************************/
#include "DS1302.h"
uchar code RTCreadaddr[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
uchar code RTCwriteaddr[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
uchar TIME[7]={0,0,0,0x14,0x02,0x04,0x19};// 00:00:00 14-2-19
void DS1302write(uchar addr,uchar dat)
{
uchar n;
RST = 0; //CE
_nop_();
SCLK = 0 ;
_nop_();
RST = 1;
_nop_();
for(n=0;n<8;n++) //address
{
DSIO = addr & 0x01; //低位開始傳送
addr >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
}
for(n=0;n<8;n++) //order
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;
_nop_();
}
uchar DS1302read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;
_nop_();
RST = 1;
_nop_();
for(n=0;n<8;n++)
{
DSIO = addr & 0x01;
addr >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)
{
dat1 = DSIO;
dat = (dat>>1)|(dat1<<7);
//data1讀入數據只有2個值,0x01和0x00,只看0x01那么<<7后變成0x80,
//再看dat假如dat=0x80,>>1后變成0x40, 0x40. /0x80=1100 0000B.
//簡單說就是一位一位讀入串行數據。
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;
_nop_();
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
void DS1302Init()
{
uchar n;
DS1302write(0x8E,0x00); //禁止寫保護
for(n=0;n<7;n++)
{
DS1302write(RTCwriteaddr[n],TIME[n]);
}
DS1302write(0x8E,0x80); //開啟寫保護
}
void DS1302readtime()
{
uchar n;
for(n=0;n<7;n++)
{
TIME[n] = DS1302read(RTCreadaddr[n]);
}
}
/*****************************************************************************************/
/****************************************LCD1602.h*****************************************/
/*****************************************************************************************/
#ifndef __LCD_H_
#define __LCD_H_
#include "reg52.h"
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define LCD1602_DATAPINS P0
sbit LCD1602_E = P2^7;
sbit LCD1602_RW = P2^5;
sbit LCD1602_RS = P2^6;
void LCD1602_delay1ms(uint c);
void LCDwriteorder(uchar order);
void LCDwritedata(uchar dat);
void LCD1602Init();
#endif
/*****************************************************************************************/
/****************************************LCD1602.c*****************************************/
/*****************************************************************************************/
#include "LCD1602.h"
void LCD1602_delay1ms(uint c) //1ms , 0 mission
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void LCDwriteorder(uchar order)
{
LCD1602_E = 0; //power open
LCD1602_RS = 0; //send order
LCD1602_RW = 0; //choose write
LCD1602_DATAPINS = order;
LCD1602_delay1ms(1);
LCD1602_E = 1;
LCD1602_delay1ms(5);
LCD1602_E = 0;
}
void LCDwritedata(uchar dat)
{
LCD1602_E = 0;
LCD1602_RS = 1; //send data
LCD1602_RW = 0;
LCD1602_DATAPINS = dat;
LCD1602_delay1ms(1);
LCD1602_E = 1;
LCD1602_delay1ms(5);
LCD1602_E = 0;
}
void LCD1602Init()
{
LCDwriteorder(0x38); //display open
LCDwriteorder(0x0c); // no flash sign
LCDwriteorder(0x06); // one date one point
LCDwriteorder(0x01); // rush screen
LCDwriteorder(0x80); // set point start space
}
/*****************************************************************************************/
/****end********end*********end******end*****end****end*****end********end**********end****/
/*****************************************************************************************/
復制代碼
作者:
skcheng
時間:
2021-9-4 18:16
謝謝指導,我再測試一下看看!
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1