?? 源程序.txt
字號:
#include<reg51.h>
/*************************ds1302與at89s52引腳連接********************/
sbit T_RST=P3^5;
sbit T_CLK=P3^6;
sbit T_IO=P3^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
unsigned char seg[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //0~~9段碼
/******************DS1302:寫入操作(上升沿)*********************/
void write_byte(unsigned char da)
{
unsigned char i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}
/******************DS1302:讀取操作(下降沿)*****************/
unsigned char read_byte(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);
}
/******************DS1302:寫入數據(先送地址,再寫數據)***************************/
void write_1302(unsigned char addr,unsigned char da)
{
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //寫入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}
/******************DS1302:讀取數據(先送地址,再讀數據)**************************/
unsigned char read_1302(unsigned char addr)
{
unsigned char temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //寫入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}
/***********************延時程序=a*1ms**************************************/
void delay(unsigned char a)
{
unsigned char i;
while(a-- !=0)
{
for(i=0;i<125;i++);
}
}
/***********************顯示程序**********************************************/
/* 動態掃描條件(單個LED在1秒內): count >=50次 //點亮次數 */
/* time >=2ms //持續時間 */
/* DS1302秒,分,時寄存器是BCD碼形式: 用16求商和余進行"高4位"和"低4位"分離 */
/* 0x00,0x10,0x30,0x40,0x60,0x70 : 位選 */
/****************************************************************************/
void led_disp(unsigned char *poi)
{
P0=seg[*poi % 16]; //第1個數碼管:顯示秒(個位);
delay(2); //持續2ms
P0=0xff; //消影
P0=seg[*poi /16]^0x10; //第2個數碼管:顯示秒(十位);
delay(2);
P0=0xff;
poi++;
P0=seg[*poi % 16]^0x30; //第4個數碼管:顯示分(個位)
delay(2);
P0=0xff;
P0=seg[*poi / 16]^0x40; //第5個數碼管:顯示分(十位)
delay(2);
poi++;
P0=0xff;
P0=seg[*poi % 16]^0x60; //第7個數碼管:顯示時(個位)
delay(2);
P0=0xff;
P0=seg[*poi /16]^0x70; //第8個數碼管:顯示時(十位)
delay(2);
P0=0xff;
}
/************************主程序**********************************************/
void main(void)
{
unsigned char clk_time[3]={0x00,0x00,0x12}; //秒,分,時寄存器初始值
unsigned char temp=0x80;
unsigned char i;
write_1302(0x8e,0x00); //WP=0 寫操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time[i]);
temp+=2;
}
write_1302(0x8e,0x80); //WP=1 寫保護
while(1)
{
led_disp(clk_time);
temp=0x81;
for(i=0;i<3;i++)
{
clk_time[i]=read_1302(temp);
temp+=2;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -