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

📄 080630.c

📁 DS12CR887万年历四种程序(MOTOROLA)时序和(INTEL)时序
💻 C
📖 第 1 页 / 共 2 页
字号:
//*********************************************************************/*
/*DS12CR887高精度万年历 C51程序

编写:wsb
日期:2008-7-7
QQ:576515317

功能:电路采用DS12CR887高精度时钟芯片,用74HC595驱动15个码管
		采用模拟串口的方式进行数据的发送。三个独立按键,一个功能
		键,一个时间加,一个时间减,组成时间调整功能。
		一个DS18B20数字温度传感器实现环境温度的读取。
		能够显示的内容有年、月、日、时、分、秒、星期和温度。
*/
#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf};


uchar shi,fen,miao,nian,yue,ri,xq,s1num,tt;	
uint temp;
bit flag;

//DS12CR887的四个位声明
sbit dscs=P2^5;	
sbit dsas=P2^4;
sbit dswr=P2^3;	
sbit dsds=P2^2;

sbit tempDS=P2^1;	//DS18B20 I/0口定义

sbit s1=P3^0;	//功能键
sbit s2=P3^1;	//时间加
sbit s3=P3^2;	//时间减

sbit rd=P3^7;

sbit SH_CP=P1^4;	//移位寄存器时钟脉冲

sbit ST_CP=P1^5;	//存储寄存器时钟脉冲输出锁存器控制

sbit d1=P1^3;//双二极管闪烁

sbit DS=P1^7;		//串行数据输入

void delay(uint count)      //延时子函数

{

  uint i;

  while(count)

  {

    i=200;

    while(i>0)

    i--;

    count--;

  }

}
/************************
函数名:dsreset()
功能 :DS18B20初始化复位
*************************/
void dsreset(void)       

{

  uint i;                

  tempDS=0;

  i=103;

  while(i>0)i--;

  tempDS=1;

  i=4;

  while(i>0)i--;

}

 
/************************
函数名:tmpreadbit()
功能:从DS18B20里读一位
*************************/
bit tmpreadbit(void)       

{

   uint i;

   bit dat;

   tempDS=0;i++;          //i++ for delay  小延时一下

   tempDS=1;i++;i++;

   dat=tempDS;

   i=8;while(i>0)i--;

   return (dat);

}

/************************
函数名:tmpread()
功能:从DS18B20里读一个字节
*************************/
uchar tmpread(void)   

{

  uchar i,j,dat;

  dat=0;

  for(i=1;i<=8;i++)

  {

    j=tmpreadbit();

    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好//一个字节在DAT里

  }

  return(dat);             //将一个字节数据返回

}

 
/************************
函数名:tmpwritebyte()
功能:写一个字节到DS18B20里
*************************/
void tmpwritebyte(uchar dat)   

{                           

  uint i;

  uchar j;

  bit testb;

  for(j=1;j<=8;j++)

  {

    testb=dat&0x01;

    dat=dat>>1;

    if(testb)     //write 1    写1部分

    {

      tempDS=0;

      i++;i++;

      tempDS=1;

      i=8;while(i>0)i--;

    }

    else

    {

      tempDS=0;       //write 0   写0部分

      i=8;while(i>0)i--;

      tempDS=1;

      i++;i++;

    }

  }

}

 
/************************
函数名:tmpchange()
功能:给18B20发送温度转换命令

*************************/
void tmpchange(void)  

{

  dsreset();             //初始化DS18B20

  delay(1);             //延时

  tmpwritebyte(0xcc);  // 跳过序列号命令

  tmpwritebyte(0x44);  //开始转换

}
/************************
函数名:tmp()
功能:DS18B20获取温度
*************************/
void tmp()               
{

  float tt;

  uchar a,b;

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);   

  tmpwritebyte(0xbe);    //发送读取数据命令

  a=tmpread();          //连续读两个字节数据

  b=tmpread();

  temp=b;

  temp=temp<<8;             

  temp=temp|a;         //两字节合成一个整型变量。

  tt=temp*0.0625;       //得到真实十进制温度值

  temp=tt*10+0.5;   


}
////DS12CR887/////
////数据读取/////
uchar read_ds(uchar add)
{
	uchar date;
	//dscs=0;
	dsas=1;
	dsds=1;
	dswr=1;
	dscs=0;
	P0=add;
	dsas=0;
	dsds=0;
	P0=0xff;//读取P0口先给P0口全赋个一
	date=P0;
	dsds=1;
	dsas=1;
	dscs=1;
	return date;			
}
///DS12CR887数据写入/////
void write_ds(uchar add,uchar date)
{
	//dscs=0;
	dsas=1;
	dsds=1;
	dswr=1;
	dscs=0;
	P0=add;
	dsas=0;
	dswr=0;
	P0=date;
	dswr=1;
	dsas=1;
	dscs=1;		
}


/************************
函数名:write_595byte()
功能:模拟串口给595送数据

*************************/
void write_595byte(uchar shi_s,uchar fen_s,uchar miao_s,nian_s,yue_s,ri_s,xq_s,temp_s)
{
	uchar k,shi_ge,shi_shi,fen_ge,fen_shi,miao_ge,
		miao_shi,nian_ge,nian_shi,yue_ge,yue_shi,
		ri_ge,ri_shi,xq,temp_shi,temp_ge;
	
	shi_ge=table[shi_s%10];		//先把所有数据进行分离
	shi_shi=table[shi_s/10];
	fen_ge=table[fen_s%10];
	fen_shi=table[fen_s/10];
	miao_ge=table[miao_s%10];
	miao_shi=table[miao_s/10];
	nian_ge=table[nian_s%10];
	nian_shi=table[nian_s/10];
	yue_ge=table[yue_s%10];
	yue_shi=table[yue_s/10];
	ri_ge=table[ri_s%10];
	ri_shi=table[ri_s/10];
	xq=table[xq_s];
	temp_ge=table[temp_s%100/10];
	temp_shi=table[temp_s/100];
	
	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		miao_ge<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}

	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		miao_shi<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		fen_ge<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}

	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		fen_shi<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	
	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		shi_ge<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}

	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		shi_shi<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	
	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		ri_ge<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	
	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		ri_shi<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	
	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		yue_ge<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	for(k=0;k<8;k++)
	{
		SH_CP=0;	
		yue_shi<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	
		for(k=0;k<8;k++)
	{
		SH_CP=0;	
		nian_ge<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
		for(k=0;k<8;k++)
	{
		SH_CP=0;	
		nian_shi<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	
		for(k=0;k<8;k++)
	{
		SH_CP=0;	
		xq<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
		for(k=0;k<8;k++)
	{
		SH_CP=0;	
		temp_ge<<=1;		//将数据左移把最高位移入到了CY当中
		DS=CY;
		SH_CP=1;		//上升沿发生移位
	}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -