久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3422|回復: 7
收起左側

關于時鐘芯片DS1302全部RAM讀寫方法!

[復制鏈接]
ID:963743 發表于 2021-9-3 23:01 | 顯示全部樓層 |閱讀模式
各位前輩師傅們好!
       我是初學者請多包涵!這里懇請前輩們能否指導我寫一個利用c51單片機掛接DS1302時鐘芯片 然后設計按一下k1 單片機一次性讀出DS1302內部全部RAM的數據 然后再按一下k2 再一次性寫入DS1302內部全部RAM寄存器。手里有一套普中A4-1開發板套裝,利用這個套裝讀寫 感謝前輩指導!
回復

使用道具 舉報

ID:624769 發表于 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 為 你自己聲明的數組變量
回復

使用道具 舉報

ID:963743 發表于 2021-9-4 07:12 | 顯示全部樓層
感謝指導,我試一下!
回復

使用道具 舉報

ID:584814 發表于 2021-9-4 08:43 | 顯示全部樓層
用A4-1開發板套裝自帶的DEMO就可以,隨機光盤上有,光盤丟失可以去官網下載。
回復

使用道具 舉報

ID:963743 發表于 2021-9-4 11:17 | 顯示全部樓層
我下載的光盤資料里面是DS1302+LCD1602程序只是時鐘寄存器我就是想麻煩您 能寫一個簡單的讀取DS1302時鐘寄存器和31個RAM寄存器的數據 比如 按k1 一次批量讀取所以寄存器數據 按k2一次批量寫入所以寄存器數據!這樣程序小一點好理解些!感謝!
回復

使用道具 舉報

ID:624769 發表于 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 就可以了。
回復

使用道具 舉報

ID:155507 發表于 2021-9-4 16:33 | 顯示全部樓層
程序分享出來給需要的人作參考

  1. /*****************************************************************************************/
  2. /****************************************main.c********************************************/
  3. /*****************************************************************************************/

  4. #include "reg52.h"
  5. #include "DS1302.h"
  6. #include "LCD1602.h"

  7. sbit K1 = P3^1;
  8. sbit K2 = P3^0;
  9. sbit K3 = P3^2;

  10. uchar TIMEtemp1[7];
  11. uchar TIMEtemp2[7];
  12. uchar code RAMreadaddr[7] = {0xc1,0xc3,0xc5,0xc7,0xc9,0xcb,0xcd};
  13. uchar code RAMwriteaddr[7] = {0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc};

  14. void LCD1602display();
  15. void delay10ms(void);
  16. void keypress();

  17. void main()
  18. {
  19.         LCD1602Init();
  20.         DS1302Init();
  21.         while(1)
  22.         {
  23.                 DS1302readtime();
  24.                 LCD1602display();
  25.                 keypress();
  26.         }
  27. }

  28. void LCD1602display()
  29. {
  30.         LCDwriteorder(0x80);
  31.         LCDwritedata('2');
  32.         LCDwritedata('0');
  33.         LCDwritedata('0'+TIME[6]/16);    //year
  34.         LCDwritedata('0'+(TIME[6]&0x0f));
  35.         LCDwritedata('-');
  36.         LCDwritedata('0'+TIME[4]/16);         //month
  37.         LCDwritedata('0'+(TIME[4]&0x0f));
  38.         LCDwritedata('-');
  39.         LCDwritedata('0'+TIME[3]/16);         //day
  40.         LCDwritedata('0'+(TIME[3]&0x0f));
  41.         LCDwriteorder(0x8D);
  42.         LCDwritedata('0'+(TIME[5]&0x07));//week

  43.         LCDwriteorder(0x80+0x40);
  44.         LCDwritedata('0'+TIME[2]/16);    //hour
  45.         LCDwritedata('0'+(TIME[2]&0x0f));
  46.         LCDwritedata('-');
  47.         LCDwritedata('0'+TIME[1]/16);         //minute
  48.         LCDwritedata('0'+(TIME[1]&0x0f));
  49.         LCDwritedata('-');
  50.         LCDwritedata('0'+TIME[0]/16);         //second
  51.         LCDwritedata('0'+(TIME[0]&0x0f));
  52. }

  53. void delay10ms(void)   //10  ms 0  mission
  54. {
  55.         unsigned char a,b,c;
  56.         for(c=1;c>0;c--)
  57.         for(b=38;b>0;b--)
  58.         for(a=130;a>0;a--);
  59. }

  60. void keypress()
  61. {
  62.         uchar n;
  63.         if(K1==0)
  64.         {
  65.                 delay10ms();
  66.                 if(K1==0)
  67.                 {
  68.                         for (n=0; n<7; n++)//讀取七個字節的時鐘信號:分秒時日月周年
  69.                         {
  70.                                 TIMEtemp1[n] = DS1302read(RTCreadaddr[n]);
  71.                         }
  72.                         DS1302write(0x8E,0x00);
  73.                         for(n=0;n<7;n++)
  74.                         {
  75.                                 DS1302write(RAMwriteaddr[n],TIMEtemp1[n]);
  76.                         }
  77.                         DS1302write(0x8E,0x80);               
  78.                 }
  79.                 while(!K1);      
  80.         }

  81.         if(K2==0)
  82.         {
  83.                 delay10ms();
  84.                 if(K2==0)
  85.                 {
  86.                         for(n=0;n<7;n++)
  87.                         {
  88.                                 TIMEtemp2[n]=DS1302read(RAMreadaddr[n]);
  89.                         }


  90.                         while(1)
  91.                         {
  92.                                 LCDwriteorder(0x80);
  93.                                 LCDwritedata('2');
  94.                                 LCDwritedata('0');
  95.                                 LCDwritedata('0'+TIMEtemp2[6]/16);    //year
  96.                                 LCDwritedata('0'+(TIMEtemp2[6]&0x0f));
  97.                                 LCDwritedata('-');
  98.                                 LCDwritedata('0'+TIMEtemp2[4]/16);         //month
  99.                                 LCDwritedata('0'+(TIMEtemp2[4]&0x0f));
  100.                                 LCDwritedata('-');
  101.                                 LCDwritedata('0'+TIMEtemp2[3]/16);         //day
  102.                                 LCDwritedata('0'+(TIMEtemp2[3]&0x0f));
  103.                                 LCDwriteorder(0x8D);
  104.                                 LCDwritedata('0'+(TIMEtemp2[5]&0x07));//week

  105.                                 LCDwriteorder(0x80+0x40);
  106.                                 LCDwritedata('0'+TIMEtemp2[2]/16);    //hour
  107.                                 LCDwritedata('0'+(TIMEtemp2[2]&0x0f));
  108.                                 LCDwritedata('-');
  109.                                 LCDwritedata('0'+TIMEtemp2[1]/16);         //minute
  110.                                 LCDwritedata('0'+(TIMEtemp2[1]&0x0f));
  111.                                 LCDwritedata('-');
  112.                                 LCDwritedata('0'+TIMEtemp2[0]/16);         //second
  113.                                 LCDwritedata('0'+(TIMEtemp2[0]&0x0f));


  114.                                 if(K3==0)
  115.                                 {
  116.                                         delay10ms();
  117.                                         if(K3==0)
  118.                                         {
  119.                                                 LCD1602display();
  120.                                                 break;
  121.                                         }
  122.                                 }         
  123.                         }
  124.                 }               
  125.         }
  126. }

  127. /*****************************************************************************************/
  128. /****************************************DS1302.h*****************************************/
  129. /*****************************************************************************************/


  130. #define __DS1302_H_

  131. #include "reg52.h"
  132. #include "intrins.h"

  133. #ifndef uchar
  134. #define uchar unsigned char
  135. #endif

  136. #ifndef uint
  137. #define uint unsigned int
  138. #endif

  139. sbit DSIO = P3^4;
  140. sbit RST = P3^5;
  141. sbit SCLK = P3^6;

  142. void DS1302write(uchar addr,uchar dat);
  143. uchar DS1302read(uchar addr);
  144. void DS1302Init();
  145. void DS1302readtime();

  146. extern uchar TIME[7];
  147. extern uchar code RTCreadaddr[7];
  148. extern uchar code RTCwriteaddr[7];

  149. #endif

  150. /*****************************************************************************************/
  151. /****************************************DS1302.c*****************************************/
  152. /*****************************************************************************************/
  153. #include "DS1302.h"

  154. uchar code RTCreadaddr[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
  155. uchar code RTCwriteaddr[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

  156. uchar TIME[7]={0,0,0,0x14,0x02,0x04,0x19};// 00:00:00   14-2-19

  157. void DS1302write(uchar addr,uchar dat)
  158. {
  159.         uchar n;
  160.         RST = 0;    //CE
  161.         _nop_();

  162.         SCLK = 0 ;
  163.         _nop_();
  164.         RST = 1;
  165.         _nop_();

  166.         for(n=0;n<8;n++)            //address
  167.         {
  168.                 DSIO = addr & 0x01;                  //低位開始傳送
  169.                 addr >>= 1;
  170.                 SCLK = 1;
  171.                 _nop_();
  172.                 SCLK = 0;
  173.                 _nop_();
  174.         }

  175.         for(n=0;n<8;n++)                  //order
  176.         {
  177.                 DSIO = dat & 0x01;
  178.                 dat >>= 1;
  179.                 SCLK = 1;
  180.                 _nop_();
  181.                 SCLK = 0;
  182.                 _nop_();
  183.         }

  184.         RST = 0;
  185.         _nop_();
  186. }

  187. uchar DS1302read(uchar addr)
  188. {
  189.         uchar n,dat,dat1;
  190.         RST = 0;
  191.         _nop_();

  192.         SCLK = 0;
  193.         _nop_();
  194.         RST = 1;
  195.         _nop_();

  196.         for(n=0;n<8;n++)
  197.         {
  198.                 DSIO = addr & 0x01;
  199.                 addr >>= 1;
  200.                 SCLK = 1;
  201.                 _nop_();
  202.                 SCLK = 0;
  203.                 _nop_();
  204.         }

  205.         _nop_();

  206.         for(n=0;n<8;n++)
  207.         {
  208.                 dat1 = DSIO;
  209.                 dat = (dat>>1)|(dat1<<7);
  210.                 //data1讀入數據只有2個值,0x01和0x00,只看0x01那么<<7后變成0x80,
  211.                 //再看dat假如dat=0x80,>>1后變成0x40, 0x40. /0x80=1100 0000B.
  212.                 //簡單說就是一位一位讀入串行數據。
  213.                 SCLK = 1;
  214.                 _nop_();
  215.                 SCLK = 0;
  216.                 _nop_();
  217.         }

  218.         RST = 0;
  219.         _nop_();

  220.         SCLK = 1;
  221.         _nop_();
  222.         DSIO = 0;
  223.         _nop_();
  224.         DSIO = 1;
  225.         _nop_();

  226.         return dat;
  227. }

  228. void DS1302Init()
  229. {
  230.         uchar n;
  231.         DS1302write(0x8E,0x00); //禁止寫保護
  232.         for(n=0;n<7;n++)
  233.         {
  234.                 DS1302write(RTCwriteaddr[n],TIME[n]);      
  235.         }
  236.         DS1302write(0x8E,0x80); //開啟寫保護
  237. }

  238. void DS1302readtime()
  239. {
  240.         uchar n;
  241.         for(n=0;n<7;n++)
  242.         {
  243.                 TIME[n] = DS1302read(RTCreadaddr[n]);
  244.         }
  245. }


  246. /*****************************************************************************************/
  247. /****************************************LCD1602.h*****************************************/
  248. /*****************************************************************************************/
  249. #ifndef __LCD_H_
  250. #define __LCD_H_

  251. #include "reg52.h"

  252. #ifndef uchar
  253. #define uchar unsigned char
  254. #endif

  255. #ifndef uint
  256. #define uint unsigned int
  257. #endif

  258. #define LCD1602_DATAPINS P0
  259. sbit LCD1602_E = P2^7;
  260. sbit LCD1602_RW = P2^5;
  261. sbit LCD1602_RS = P2^6;

  262. void LCD1602_delay1ms(uint c);
  263. void LCDwriteorder(uchar order);
  264. void LCDwritedata(uchar dat);
  265. void LCD1602Init();

  266. #endif

  267. /*****************************************************************************************/
  268. /****************************************LCD1602.c*****************************************/
  269. /*****************************************************************************************/

  270. #include "LCD1602.h"

  271. void LCD1602_delay1ms(uint c)   //1ms , 0 mission      
  272. {
  273.         uchar a,b;
  274.         for (; c>0; c--)
  275.         {
  276.                 for (b=199;b>0;b--)
  277.                 {
  278.                         for(a=1;a>0;a--);
  279.                 }      
  280.         }         
  281. }

  282. void LCDwriteorder(uchar order)
  283. {
  284.         LCD1602_E = 0;             //power  open
  285.         LCD1602_RS = 0;            //send order
  286.         LCD1602_RW = 0;            //choose write

  287.         LCD1602_DATAPINS = order;
  288.         LCD1602_delay1ms(1);   

  289.         LCD1602_E = 1;
  290.         LCD1602_delay1ms(5);
  291.         LCD1602_E = 0;
  292. }

  293. void LCDwritedata(uchar dat)
  294. {
  295.         LCD1602_E = 0;
  296.         LCD1602_RS = 1; //send data
  297.         LCD1602_RW = 0;

  298.         LCD1602_DATAPINS = dat;
  299.         LCD1602_delay1ms(1);

  300.         LCD1602_E = 1;
  301.         LCD1602_delay1ms(5);
  302.         LCD1602_E = 0;
  303. }

  304. void LCD1602Init()
  305. {
  306.         LCDwriteorder(0x38); //display open
  307.         LCDwriteorder(0x0c); // no flash sign
  308.         LCDwriteorder(0x06); // one date one point
  309.         LCDwriteorder(0x01); // rush screen
  310.         LCDwriteorder(0x80); // set point start space
  311. }

  312. /*****************************************************************************************/
  313. /****end********end*********end******end*****end****end*****end********end**********end****/
  314. /*****************************************************************************************/
復制代碼
回復

使用道具 舉報

ID:963743 發表于 2021-9-4 18:16 | 顯示全部樓層
謝謝指導,我再測試一下看看!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区欧美一区 | 欧美久久久久久久久 | 精品一区久久 | 日韩欧美专区 | 国产成人福利视频 | 国产成人精品一区二区三 | 国产午夜精品久久久久免费视高清 | 国产精品自拍视频 | 美女爽到呻吟久久久久 | 日韩免费一区二区 | 成人国产精品免费观看视频 | 国产精品99久久久久久动医院 | 国产精品乱码一区二区三区 | 国产综合av | 久久久免费电影 | 久久久久久天堂 | 国产精品自拍av | 国产精品久久久久久久岛一牛影视 | 久久久久久国产精品久久 | 欧美视频一区 | 日韩电影免费在线观看中文字幕 | 日韩一区二区三区视频在线观看 | 超碰97人人人人人蜜桃 | 一级午夜aaa免费看三区 | 九九久久精品 | 亚洲欧洲精品成人久久奇米网 | 99精品99 | 小早川怜子xxxxaⅴ在线 | 欧洲精品久久久久毛片完整版 | 亚洲精品欧美 | 91n成人 | 亚洲一区二区三区在线观看免费 | 国产一区中文字幕 | av国产精品 | 久久33| 亚洲精品视频免费 | 日韩精品一区二区三区中文在线 | 91精品国产高清久久久久久久久 | 国产91在线播放 | 久久噜噜噜精品国产亚洲综合 | 伊人中文字幕 |