#include <reg51.h>
#include <intrins.h>
#include "ds1302.h"
extern uchar time_data[7];
extern uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //資料的地址
extern uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
sbit sck=P2^5; //時鐘埠
sbit io=P2^6; //時鐘埠
sbit rst=P2^7; //時鐘埠
extern float Year,Month,Day,Hour,Minute,Second; //時間設定值
extern uchar Week;
extern float Hour_H,Minute_H,Second_H; //設定開始時間
extern float Hour_L,Minute_L,Second_L; //設定結束時間
void write_ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
io=dat&0x01; //準備資料,從最低位開始
dat=dat>>1;
sck=1;
}
}
void write_ds1302(uchar add,uchar dat)
{
rst=0;
_nop_(); //CPU原地踏步
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add); //傳地址
write_ds1302_byte(dat); //傳資料
rst=0; //不受其他影響
_nop_();
io=1; //釋放
sck=1;
}
uchar read_ds1302(uchar add)
{
uchar i,value;
rst=0;
_nop_(); //CPU原地踏步
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=https://bbs.csdn.net/topics/value>>1;
sck=0;
if(io)
value=https://bbs.csdn.net/topics/value|0x80;
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
return value;
}
void set_rtc() //設定時間
{
uchar i,j;
for(i=0;i<7;i++) //轉換BCD碼
{
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00); //去除寫保護
for(i=0;i<7;i++)
{
write_ds1302(write_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(read_add[i]); //最終讀出來的數 16進制
}
}
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
extern 只是參考,再不能定義了uj5u.com熱心網友回復:
第5行和第六行把=后面,分號前面的內容的刪掉uj5u.com熱心網友回復:
洗掉的話將出現新的問題L118,但是包含了參考了?
uj5u.com熱心網友回復:
解決了因為其他位置還包含了這塊內容,謝謝大佬
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/154016.html
標籤:單片機/工控
上一篇:求各位大佬指點下
