?? ds1302.c
字號:
#include <stdio.h>
#include <reg5000.h>
#define uchar unsigned char
sbit SCLK = P1^3;
sbit IO = P1^4;
sbit RSTB = P1^5;
/**************************** 函數原型說明 ****************************/
void clkwritebyte(); // 時鐘字節寫入函數
void ramwritebyte(); // RAM字節寫入函數
uchar rbyte_3w(); // 字節讀取函數
void reset_3w(); // 復位函數
void wbyte_3w(uchar); // 字節寫入函數
void initialize_DS1302(); // DS1302初始化函數
void disp_clk_regs(uchar); // 顯示時鐘寄存器內容函數
void burstramrd(); // 多字節突發方式讀取RAM函數
void burstramwr(); // 多字節突發方式寫入RAM函數
/***************************** 復位函數 ******************************/
void reset_3w() {
SCLK = 0;
RSTB = 0;
RSTB = 1;
}
/****************************** 字節寫入函數 ***************************/
void wbyte_3w(uchar W_Byte) {
uchar i;
for(i = 0; i < 8; ++i) {
IO = 0;
if(W_Byte & 0x01) IO = 1;
SCLK = 0;
SCLK = 1;
W_Byte >>= 1;
}
}
/****************************** 字節讀取函數 ****************************/
uchar rbyte_3w() {
uchar i;
uchar R_Byte;
uchar TmpByte;
R_Byte = 0x00;
IO = 1;
for(i=0; i<8; ++i) {
SCLK = 1;
SCLK = 0;
TmpByte = (uchar)IO;
TmpByte <<= 7;
R_Byte >>= 1;
R_Byte |= TmpByte;
}
return R_Byte;
}
/**************************** 時鐘字節寫入函數 *************************/
void clkwritebyte() {
uchar ClkAdd;
uchar ClkData;
printf("\nWrite Clock ADDRESS:");
scanf("%bu", &ClkAdd); // 輸入時鐘地址
printf("\nWrite Clock DATA:");
scanf("%bx", &ClkData); // 輸入時鐘數據
ClkAdd = ((ClkAdd * 2) | 0x80); // 時鐘數據寫入命令
reset_3w();
wbyte_3w(ClkAdd);
wbyte_3w(ClkData);
reset_3w();
}
/* ************************** RAM字節寫入函數 **************************/
void ramwritebyte() {
uchar ramadd;
uchar ramdata;
printf("\nWrite Ram ADDRESS (HEX):");
scanf("%bx", &ramadd); // 輸入RAM地址
printf("\nWrite Ram DATA (HEX):");
scanf("%bx", &ramdata); // 輸入RAM數據
ramadd = ((ramadd * 2) | 0xC0); // RAM數據寫入命令
reset_3w();
wbyte_3w(ramadd);
wbyte_3w(ramdata);
reset_3w();
}
/************************* 顯示時鐘寄存器內容函數 ***********************/
void disp_clk_regs(uchar loop) {
uchar lsec = 99, sec, min, hrs, dte, mon, day, yr;
do { // 讀取并顯示時鐘寄存器的內容
reset_3w();
wbyte_3w(0xBF); // 以多字節突發方式讀取時鐘數據
sec = rbyte_3w(); // 秒
min = rbyte_3w(); // 分
hrs = rbyte_3w(); // 小時
dte = rbyte_3w(); // 日期
mon = rbyte_3w(); // 月份
day = rbyte_3w(); // 星期
yr = rbyte_3w(); // 年
reset_3w();
if(sec != lsec || !loop) { // 每秒顯示一次
printf("\nYr Day Mon Dte Hrs Min Sec");
printf("\n%2.bX %2.bX %2.bX %2.bX", yr, day, mon, dte);
printf(" %2.bX %2.bX %2.bX", hrs, min, sec);
lsec = sec;
}
if(!loop) break;
} while(!RI);
if(loop) _getkey();
}
/************************ 多字節突發方式讀取RAM函數 *********************/
void burstramrd() {
uchar rmary[31];
uchar i;
reset_3w();
wbyte_3w(0xFF); // 以多字節突發方式讀取RAM
for (i=0; i<31; ++i) {
rmary[i] = rbyte_3w();
}
reset_3w();
printf("\nDS1302 Ram");
printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
rmary[0], rmary[1], rmary[2], rmary[3],
rmary[4], rmary[5], rmary[6], rmary[7]);
printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
rmary[8], rmary[9], rmary[10], rmary[11],
rmary[12], rmary[13], rmary[14], rmary[15]);
printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
rmary[16], rmary[17], rmary[18], rmary[19],
rmary[20], rmary[21], rmary[22], rmary[23]);
printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
rmary[24], rmary[25], rmary[26], rmary[27],
rmary[28], rmary[29], rmary[30]);
}
/************************ 多字節突發方式寫入RAM函數 *********************/
void burstramwr() {
uchar ramdata;
uchar i;
printf("\nWrite Ram DATA (HEX):");
scanf("%bx", &ramdata); // 輸入RAM數據
reset_3w();
wbyte_3w(0xfe); // 以多字節突發方式寫入RAM
for (i=0; i<31; ++i) {
wbyte_3w(ramdata);
}
reset_3w();
}
/**************************** DS1302初始化函數 **************************/
void initialize_DS1302() {
uchar yr, mn, date, dy, hr, min, sec;
printf("\nEnter the year (0-99): ");
scanf("%bx", &yr);
printf("\nEnter the month (1-12): ");
scanf("%bx", &mn);
printf("\nEnter the date (1-31): ");
scanf("%bx", &date);
printf("\nEnter the day (1-7): ");
scanf("%bx", &dy);
printf("\nEnter the hour (1-24): ");
scanf("%bx", &hr);
hr = hr & 0x3f; // 設置時鐘為24小時方式
printf("\nEnter the minute (0-59): ");
scanf("%bx", &min);
printf("\nEnter the second (0-59): ");
scanf("%bx", &sec);
reset_3w();
wbyte_3w(0x8e); // 寫保護控制寄存器
wbyte_3w(0); // 允許寫入
reset_3w();
wbyte_3w(0x90); // 涓流充電控制寄存器
wbyte_3w(0xab); // 允許充電, 雙二極管, 8K 電阻
reset_3w();
wbyte_3w(0xbe); // 以多字節突發方式寫入時鐘數據(8個字節)
wbyte_3w(sec);
wbyte_3w(min);
wbyte_3w(hr);
wbyte_3w(date);
wbyte_3w(mn);
wbyte_3w(dy);
wbyte_3w(yr);
wbyte_3w(0); // 以多字節突發方式寫入時鐘數據時
// 必須對寫保護控制寄存器寫入0值
reset_3w();
}
/****************************** 主函數 *********************************/
main (void) {
uchar M, M1;
SCON = 0x50; // 設置串行口: 方式 1, 8位UART, 允許接收
TMOD |= 0x20; // 設置定時器T1, 方式 2, 8位自動重裝
TH1 = 221; // 設置串行口波特率: 1200 @ 16MHz
TR1 = 1;
TI = 1;
while (1) {
printf("***********C51 PROGRAM FOR DS1302***********\n\n");
printf("I. initialize DS1302\n");
printf("CW. Write Byte CR. Read Time\n");
printf("RW. Write RAM RR. Read RAM\n");
printf("\nEnter Menu Selection:");
M = _getkey();
switch(M) {
case 'C':
case 'c':
printf("\rEnter Clock Routine to run:C");
M1 = _getkey();
switch(M1) {
case 'R':
case 'r': disp_clk_regs(1); break;
case 'W':
case 'w': clkwritebyte(); break;
}
break;
case 'I':
case 'i': initialize_DS1302(); break;
case 'R':
case 'r':
printf("\rEnter Ram Routine to run:R");
M1 = _getkey();
switch(M1) {
case 'B':
case 'b': ramwritebyte(); break;
case 'R':
case 'r': burstramrd(); break;
case 'W':
case 'w': burstramwr(); break;
}
break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -