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

📄 stc5410_ad.c

📁 18B20程序,采用stc54C12单片机。ch452显示温度
💻 C
字号:
 
		#pragma NOAREGS
		#include <reg52.h>
		#include <string.h>
		#include<intrins.h> 
		#include <stdlib.h>  //for exit() function
		#include <ctype.h>   //for toupper() function
		#include <math.h> 
		#define uchar unsigned char
		#define uint unsigned int
//*******************************************************
		double Temperature;
		uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
		uchar *p;
		sbit tem_A = P1^7;
		bit  flag;
		uchar tem10,tem1,tem_1,tem_11;
	   
	    bit  flag;
		uchar polarity;
    //*****************************************************************
    	uchar LED_code_09[11]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x00};
	//****************************************************************************************************
		/* 延时1uS子程序,主要用于2线接口,与单片机速度有关 */
		#define  DELAY_1US  {_nop_();}
		/* 2线接口的连接,与实际电路有关 */
		sbit CH452_SCL=P2^0;
		sbit CH452_SDA=P2^1;   // 如果使用真正的2线接口,那么SDA接中断引脚P3^3/INT1,用SDA直接做中断输出
		/* 2线接口的位操作,与单片机有关 */
		#define  CH452_SCL_SET  {CH452_SCL=1;}
		#define  CH452_SCL_CLR  {CH452_SCL=0;}
		#define  CH452_SDA_SET  {CH452_SDA=1;}
		#define  CH452_SDA_CLR  {CH452_SDA=0;}
		uchar  data_H,data_L;
	   	uchar  display[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0x3E};//显示:0--9 ,"""-""V" 共阴

 //****************************************************************************************
//*函 数 名:   delay                                                         **********
//*功能描述:   毫秒延时                                                        **********
//****************************************************************************************
dealayms(int xxxx)
				{
					uint dlay ;
					//**************************************************************
					for(dlay=xxxx;dlay>0;dlay--);
				 }
//************************************************************************************************************
void CH452_WrByte(uchar data_4B,uchar data_8B) //写一个字节数据	 data_4B的低四位为数据(有效)
	 {

			   uchar i;
			   data_4B*=16;
			   //****************************************************
			   CH452_SDA_SET;   /*发送起始条件的数据信号*/
			   CH452_SCL_SET;
			   dealayms(100);
			   CH452_SDA_CLR;   /*发送起始信号*/
			   dealayms(100);
			   CH452_SCL_CLR;   /*钳住I2C总线,准备发送或接收数据 */
			   dealayms(100);
			   //*****************************************************
			   CH452_SDA_CLR;  //DA0=0
			   CH452_SCL_SET;
			   dealayms(100);
			   CH452_SCL_CLR;
			   //*****************************************************
			   CH452_SDA_SET;  //DA1=1
			   CH452_SCL_SET;
			   dealayms(100);
			   CH452_SCL_CLR;
			   //*****************************************************
			   CH452_SDA_SET;  //ADDR=1
			   CH452_SCL_SET;
			   dealayms(100);
			   CH452_SCL_CLR;
			   //*****************************************************
			   for(i=0;i!=4;i++)      // 输出4位数据  D11-D8
					 {
					  if(data_4B&0x80) {CH452_SDA_SET;}
					  else {CH452_SDA_CLR;}
					  CH452_SCL_SET;
					  data_4B<<=1;
					  dealayms(100);
					  dealayms(100);
					  CH452_SCL_CLR;
					  dealayms(100);
					 }
			   //*****************************************************
			   CH452_SDA_CLR;    //R/W=0   表示继续写数据
			   CH452_SCL_SET;
			   dealayms(100);
			   CH452_SCL_CLR;
			   //*****************************************************
			   CH452_SDA_SET;    //接受应答
			   CH452_SCL_SET;
			   dealayms(100);
			   CH452_SCL_CLR;
			   //*****************************************************
			   for(i=0;i!=8;i++)      // 输出8位数据  D7-D0
					 {
					  if(data_8B&0x80) {CH452_SDA_SET;}
					  else {CH452_SDA_CLR;}
					  CH452_SCL_SET;
					  data_8B<<=1;
					  dealayms(100);
					  dealayms(100);
					  CH452_SCL_CLR;
					  dealayms(100);
					 }
			   //**************************************************
			   CH452_SCL_SET;
			   CH452_SDA_SET;																				  
			   dealayms(100);
			   dealayms(100);
	  }
//****************************************************************************************************88
//*******************************************************************************************************
//显示函数
void   Temp_display()
          {
			
//*******************************************************************************************************/
				 //**********************设置显示参数 四位显示
				   data_H=0x03;			   //0x03表示显示4位
				   data_L=0x40;
				   CH452_WrByte(data_H,data_L);
				 //**************************************************
				   data_H=0x0B;		                       //第1位显示
				   data_L=display[polarity];
				   CH452_WrByte(data_H,data_L);
				   //**************************************************
				   //**************************************************
				   data_H=0x0A;		                       //第2位显示
				   data_L=display[tem10];
				   CH452_WrByte(data_H,data_L);
				   //**************************************************
				   //**************************************************
				   data_H=0x09;		                       //第3位显示
				   data_L=display[tem1]|0x80;			       //显示小数点
				   CH452_WrByte(data_H,data_L);
				   //**************************************************
				   data_H=0x08;		                       //第4位显示
				   data_L=display[tem_1];				  
				   CH452_WrByte(data_H,data_L);
				   //**************************************************
//*******************************************************************************************************				   data_H=0x04;
			   data_H=0x04;
			   data_L=0x11;
			   CH452_WrByte(data_H,data_L);
			   dealayms(5);  
			   }				
 //*****************************************************************************************				
				void delay(uint number) 	                 //毫秒延时
		               {
                          for(;number!=0;number--);
		               }
 //*****************************************************************************************
	   void serialset (void)           //串口设置
	        {
	        TMOD=0x21;  //定义串行口  (T1波特率发生器)
	        TL1=0xFA;   //波特率为9600
	        TH1=0xFA;
	        EA = 1; 
	        PCON=0x80;
	        ET1=0;
	        TR1=1;
	        TI=0;
	        ES=1;
	        SCON=0x50;
	        PS=1;        //串口中断优先级设置最高
	        }
	 //****************************************************************************************
	  void sendchar(unsigned int sendsign)//  //单字节发送子程序
	        {
	              ES=0;
	              SBUF=sendsign;
	              while(TI==0);
	              TI=0;
	              ES=1;
	        }
//****************************************************************************************************88
/************************************************************
		*Function:延时处理
		*parameter:
		*Return:
		*Modify:
		*************************************************************/
		void TempDelay (uchar us)
		{
		  uchar uss=us;
		  uint i;
		  for(i=0;i<10;i++)
		      {    
		       while(--us);
			   us=uss;
			   }
		}

 
 		/************************************************************
		*Function:18B20初始化
		*parameter:
		*Return:
		*Modify:
		*************************************************************/
		void Init18b20_A ()
		{
		
				 tem_A=1;
				 TempDelay(1);
				 tem_A=0;
				 TempDelay(242);   //delay 530 uS//80
				 
				 tem_A=1;
				  TempDelay(42);   //delay 49 uS//7
				 
				 if(tem_A==0)
				      flag = 1;   //detect 1820 success!
				 else
				      flag = 0;    //detect 1820 fail!
				 TempDelay(20);       //20
				 tem_A = 1;
		
		}			    

/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte_A (uchar wr)  //单字节写入
{

 uchar i;
 for (i=0;i<8;i++)
 {
		  tem_A = 0;
		  TempDelay(1); 
		  tem_A=wr&0x01;
		  TempDelay(8);   //delay 45 uS //5
		  tem_A=1;
		  wr >>= 1;

 }
}
/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
uchar ReadByte_A ()     //读取单字节
{

		 uchar i,u=0;
		 for(i=0;i<8;i++)
		 {
		  tem_A = 0;
		  TempDelay(1); 
		  u >>= 1;
		  tem_A = 1;
		  if(tem_A==1)
		  u |= 0x80;
		  TempDelay (6);

		  tem_A = 1;
		 }
		 return(u);

}
/************************************************************
*Function:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes_A (uchar j)
{

	  uchar i;
	  for(i=0;i<j;i++)
	  {
	    *p = ReadByte_A();
	     p++;
	  }

}
								                                                                                                                        
/************************************************************
*Function:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp_A ()
{
	   read_bytes_A (2);
	   Temperature = temp_buff[1]*0x100 + temp_buff[0];
	   //Temperature *= 0.625;
	   Temperature /= 16;
	   TempDelay(1);
}


/************************************************************
*Function:18B20ID全处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TemperatuerResult_A()
{
		 Init18b20_A ();
		 WriteByte_A(0xCC);   //skip rom
		 WriteByte_A(0x44);   //Temperature convert
		 Init18b20_A ();
		 TempDelay(30);
		 WriteByte_A(0xCC);   //skip rom
		 WriteByte_A(0xBE);   //read Temperature
		 p = temp_buff;
		 GemTemp_A();
}

		//****************************************************************************************
		
  Temperature_js()
  		{
		  //*******************************************************
	             tem10=Temperature/10;
				 tem1=Temperature-tem10*10;
				 Temperature-=(tem10*10+tem1);
				 Temperature*=10;
				 tem_1=Temperature;
	     //**********************************************************
	   }

	main() 
		{
		       delay( 50000);
			   delay( 50000);
			   delay( 50000);
			   delay( 50000);
			   delay( 50000);
			   delay( 50000);
			   serialset ();
		  
		 while (1)
               {
				 TemperatuerResult_A();
			     Temperature_js();
				 sendchar(tem10);
				 sendchar(tem1);
				 sendchar(85);
				 Temp_display(); 
				 delay( 50000);
				 delay( 50000);
				 delay( 50000);
				 delay( 50000);
				 delay( 50000);
				 delay( 50000);
				 delay( 50000);
	             }      
				
		  }

⌨️ 快捷键说明

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