📄 max1302.c
字号:
#include<absacc.h>
#include<stdlib.h>
#include <reg52.h>
#include <intrins.h> /*used for _nop_() function*/
#define uchar unsigned char
#define uint unsigned int
#define NOP _nop_()
sbit SDA = P1^0;
sbit SHIFT_CP = P1^1;
sbit ST_CP = P1^2;
sbit YELLOW=P2^0; //黄色
sbit ALARM=P2^1; //报警
sbit RED=P2^2; //红色
sbit CS=P2^6;
sbit SCLK =P0^6;//时钟输入.
sbit IO=P0^7;//读写数据.
sbit RST =P0^5;//芯片复位.
bit b_flash,b_disp;
uchar ucDa;
int counter,i;
uchar bdata dat;//
sbit dat0=dat^0;//
sbit dat7=dat^7;
//#define t 3.1416
unsigned char scan;
unsigned char Temp;
unsigned char Dis_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*0~9的共阴极段码表*/
unsigned char Dis_Date[5];
uchar arr_RTC[7];
void delay(int i,int j)
{
int m;
for(;i>0;i--)
{
m=j;
for(;m>0;m--);
}
}
//响蜂鸣器
void beep(uchar t)
{
uchar i;
uint j;
for(j=0;j<t*256;j++)
{
for(i=50;i>0;i--);//给i赋的初值决定输出的频率
// BB=~BB;
}
}
/*****************************
功能:往DS1302写入1Byte数据
输入:wr_data写入的数据
返回值:无
*******************************/
void wr_1302(uchar wr_data)
{
uchar i;
RST=1;//启动数据传送.
SCLK=0;
_nop_(); _nop_();_nop_();
dat=wr_data;//读数据.
for(i=8;i>0;i--)//循环8次,写入数据.从低位到高位.
{
IO=dat0;//将dat0的值赋给时钟数据线.
_nop_();
_nop_();
SCLK=1;//时钟上升沿写入数据.
_nop_();
SCLK=0;
dat=dat>>1;//将高位数据移至dat0;
}
}
/*****************************
功能:从DS1302读出1Byte数据
返回值:dat
*******************************/
uchar rd_1302(void)
{
uchar i;//
RST=1;//启动数据传送.
_nop_();
for(i=8;i>0;i--)// //循环8次,读出数据.从低位到高位.
{
dat=dat>>1;//右移一位
dat7=IO;//读时钟数据总线
_nop_();
SCLK=1;
_nop_();
SCLK=0;//时钟下降沿读出数据
_nop_();
}
return (dat);
}
/********************************************************************
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
RST = 0;
SCLK = 0;
RST = 1;
wr_1302 (ucAddr); // 地址,命令
ucDa=rd_1302 (); //读1Byte数据
SCLK = 1;
RST =0;
return (ucDa);
}
/********************************************************************
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
RST = 0;
SCLK = 0;
RST = 1;
wr_1302(ucAddr); // 地址,命令
wr_1302(ucDa); // 写1Byte数据
SCLK = 1;
RST =0;
}
void RTC_RD_Time ()
{
uchar i,add = 0x81;
for (i=0;i<7;i++)
{
arr_RTC[i] = uc_R1302(add); //读秒
add += 2;
}
/*
arr_RTC[0] 秒
arr_RTC[1] 分
arr_RTC[2] 时
arr_RTC[3] 日
arr_RTC[4] 月
arr_RTC[5] 星期
arr_RTC[6] 年
*/
}
Updat()
{
// float data temp2;//定义存放计算得到的速度值
//temp2=3.6*t*0.6*counter;
//Temp=(unsigned int)temp2;//强制转型
Temp=29;
//Dis_Date[0]=(((ucCurtime[0]&0x70)>>4)*10 + (ucCurtime[0]&0x0F))/10;
// WR_595(Dis_Tab[Dis_Date[0]]); Out_595();
//Dis_Date[1]=(((ucCurtime[0]&0x70)>>4)*10 + (ucCurtime[0]&0x0F))%10;
// WR_595(Dis_Tab[Dis_Date[1]]); Out_595();
//Dis_Date[2]= (((ucCurtime[2]&0x70)>>4)*10 + (ucCurtime[2]&0x0F))/10;
// WR_595(Dis_Tab[Dis_Date[2]]); Out_595();
//Dis_Date[3]=(((ucCurtime[2]&0x70)>>4)*10 + (ucCurtime[2]&0x0F))%10;
// WR_595(Dis_Tab[Dis_Date[3]]); Out_595();
Dis_Date[0]=(arr_RTC[0])/10;
//WR_595(Dis_Tab[Dis_Date[0]]); Out_595();
Dis_Date[1]=(arr_RTC[0])%16;
// WR_595(Dis_Tab[Dis_Date[1]]); Out_595();
Dis_Date[2]= (arr_RTC[2])/10;
// WR_595(Dis_Tab[Dis_Date[2]]); Out_595();
Dis_Date[3]= (arr_RTC[2])%10;
//WR_595(Dis_Tab[Dis_Date[3]]); Out_595();
Dis_Date[4]=Temp/10;
Dis_Date[5]=Temp%10;
}
void RTC_initial ()
{
v_W1302(0x8e,0x00); //使能
v_W1302(0x80,0x80); //停止晶振
v_W1302(0x90,0x00); //关闭充电
v_W1302(0x8c,0x07); //设置年
v_W1302(0x8a,0x06); //设置周
v_W1302(0x88,0x01); //设置月
v_W1302(0x86,0x13); //设置日
v_W1302(0x84,0x18); //设置小时
v_W1302(0x82,0x05); //设置分
v_W1302(0x80,0x00); //启动晶振,设置秒
v_W1302(0x8e,0x80); //使能
}
void RTC_set_time ()
{
v_W1302(0x8e,0x00); //使能
v_W1302(0x80,0x80); //停止晶振
v_W1302(0x90,0x00); //关闭充电
v_W1302(0x8c,arr_RTC[6]); //设置年
v_W1302(0x8a,arr_RTC[5]); //设置周
v_W1302(0x88,arr_RTC[4]); //设置月
v_W1302(0x86,arr_RTC[3]); //设置日
v_W1302(0x84,arr_RTC[2]); //设置小时
v_W1302(0x82,arr_RTC[1]); //设置分
arr_RTC[0] &= 0x7f;
v_W1302(0x80,arr_RTC[0]); //启动晶振,设置秒
v_W1302(0x8e,0x80); //使能
}
void InitSerialPort(void)
{
SDA = 0;
SHIFT_CP = 0;
ST_CP = 0;
}
void SerialSendData(uchar dat)
{
uchar ii;
uchar sdata=dat;
for(ii=0;ii<8;ii++)
{
if(sdata&0x80)SDA=1;
else SDA = 0;
sdata<<=1;
SHIFT_CP =0;
NOP;
NOP;
SHIFT_CP = 1;
NOP;
NOP;
}
ST_CP = 1;
NOP;
NOP;
ST_CP = 0;
}
void Sys_initial ()
{
SCLK=0; RST=0;
ET0=1;
TMOD=0x01;
EA=1;
TH0=-(20000/256);// TH0=0xB1;22118
TL0=-(20000%256);// TL0=0xDF; // 20000nS(20ms)
TR0=1;
}
void Time0 (void) interrupt 1
{
TH0=-(22000/256);//20ms //18432
TL0=-(22000%256);//20ms
b_disp = ~b_disp;
counter++;
if (counter>=25)
{
counter=0;
b_flash = ~b_flash;
}
}
void main (void)
{
Sys_initial ();
RTC_initial ();
InitSerialPort();
while (1)
{
if (b_disp)
{ b_disp=0;
RTC_RD_Time ();
delay(10,10);
// display ();
Updat();
SerialSendData(arr_RTC[i]);
// SerialSendData(Dis_Date[1]);
// SerialSendData(Dis_Date[2]);
// SerialSendData(Dis_Date[3]);
// SerialSendData(Dis_Date[4]);
// SerialSendData(Dis_Date[5]);
i=(i++)%10;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -