⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 max1302.c

📁 1302 加74595串行显示
💻 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 + -