📄 8.c
字号:
#include <reg51.h>
#include <stdio.h>
sbit P00 = P0 ^ 0;
sbit P01 = P0 ^ 1;
sbit P02 = P0 ^ 2;
sbit P03 = P0 ^ 3;
//sbit ACC1=ACC^1;
sbit P17 = P1 ^ 7;
//#include <REGX51.H>
typedef unsigned char uchar;
typedef unsigned int uint;
//定义DS1302引脚
//sbit TIME_CLK=P1^4;
//sbit TIME_IO =P1^5;
//sbit TIME_RST=P1^6;
sbit DS_CLK = P1^1; //定义DS1302 时钟输入端口
sbit DS_DAT = P1^0; //定义DS1302 串行数据输入输出端口(双向)
sbit DS_RST = P1^2; //定义DS1302 复位/片选端口
void delay(int m) //延时程序,延时m*0.5毫秒
{
unsigned int i;
unsigned int j;
for (i = 0; i < m; i++)
{
for (j = 0; j < 500; j++){}
}
}
//uchar code led[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//uchar code tab[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0XBF,0X7F};
int DATA_LED[11] =
{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void led(int n)
//数码管显示及数据处理程序
{
P2 = 0xFF;
P2 = DATA_LED[n % 10]; //个位
P00 = 0;
delay(1);
P00 = 1;
P2 = 0xFF;
P2 = DATA_LED[n / 10 % 10]; //十位
P01 = 0;
delay(1);
P01 = 1;
P2 = 0xFF;
P2 = DATA_LED[n / 100 % 10]; //百位
P02 = 0;
delay(1);
P02 = 1;
P2 = 0xFF;
P2 = DATA_LED[n / 1000 % 10]; //千位
P03 = 0;
delay(1);
P03 = 1;
}
uchar led_buf[8]; /*定义LED显示缓冲区*/
uchar DS1302Read(uchar address);
void DS1302Write(uchar address,uchar number);
//extern void config();
//void stop_1302(void) //停止1302时钟
//{
// uchar i;
//i = DS1302Read(0x80);
//i |= 0x80;
// DS1302Write(0x80,i);
//}
//启动1302时钟
void start_1302(void)
{
uchar i;
i = DS1302Read(0x80);
i &= 0x7f;
DS1302Write(0x80,i);
}
/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:ZHCE
版 本:1.0
说 明:
********************************************************/
uchar DS1302Read(uchar address)
{
uchar i;
DS_CLK=0; // 复位各脚
DS_DAT=0;
DS_RST=0;
DS_RST=1; // 允许读写数据
for (i=8;i>0;i--) // 地址输入,8位
{
DS_CLK=0; // 上升沿数据输入
DS_DAT=address&0x01; // 送出一位数据
address>>=1; // 右移一位
DS_CLK=1; // 上升沿
}
for (i=8;i>0;i--) // 数据读出
{
DS_CLK=0; // 下降沿数据读出
address>>=1; // 把数据右移
if (DS_DAT)
address=address|0x80; // 读取数据
DS_CLK=1;
DS_CLK=0;//
}
DS_CLK=1; // 时钟置高位
DS_RST=0; // 片选无效
return(address);
}
/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:ZHCE
版 本:1.0
说 明:
********************************************************/
void DS1302Write(uchar address,uchar number)
{
uchar i;
DS_CLK=0;
DS_DAT=0;
DS_RST=0;
DS_RST=1;
/*地址输入*/
for (i=16;i>0;i--)
{
DS_CLK=0;
if (i>8)
{
DS_DAT=address&0x01;
address=address>>1;
}
else
{
DS_DAT=number&0x01;
number>>=1;
}
DS_CLK=1;
}
DS_CLK=1;
DS_RST=0;
}
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
DS1302Write(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
DS1302Write(0x82,0x59);
DS1302Write(0x84,0x10); //时
//for(i =7;i>0;i--)
//{
//DS1302Write(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
//pSecDa++;
//ucAddr +=2;
//}
DS1302Write(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
main()
{ uint s; // 循环计数器
uint k;
EA=1;
//v_Set1302(0x83);
start_1302();
if ((DS1302Read(0x83)==0x00)&(DS1302Read(0x81)==0x00))
{
DS1302Write(0x8E,0x00);//取消写保护
//dS1302Write(0x81,0x00);
DS1302Write(0x82,0x32);
DS1302Write(0x84,0x12);
DS1302Write(0x86,0x21);
DS1302Write(0x88,0x02);
DS1302Write(0x8a,0x02);
DS1302Write(0x8c,0x06);
DS1302Write(0x80,0x00);
DS1302Write(0x8E,0x80);//写保护
}
//else{
//led(k);
//break;
//}
//}
while(1)
{
if (P17==0x00)
{
//EA=1;
DS1302Write(0x8E,0x00);//取消写保护
//led_buf[0]=DS1302Read(0x82);
DS1302Write(0x84,0x13);
k=led_buf[0]+1;
DS1302Write(0x82,k);
//led(k);
DS1302Write(0x8E,0x80);//写保
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -