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

📄 temperature_ad.c

📁 汽车ABS系统车速显示和自动空调系统温度显示
💻 C
字号:
//-----------------------------------------------------------------------------
// JDCS.c
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <REG52.h>                 // SFR declarations
#include "I2C.h"
#include "ZLG7290.h"
#include <intrins.h>
#include <absacc.h>
#include <stdio.h>
#include <math.h>


#define uchar unsigned char
#define uint unsigned int

sbit  IOclk  =     P1^0; //AD时钟信号
sbit  Dout   =     P1^1; //AD数据信号
sbit  ADcs   =     P1^2; //AD片选信号 


//-----------------------------------------------------------------------------
//全局变量定义
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 函数原型定义
//-----------------------------------------------------------------------------
void  INT0_Init(void);                   //外部中断初始化,该中断用于ZKG7290的键盘中断
//ZLG7290显示与键盘测试例程
void INT0_SVC();
void Delay1(unsigned int);
void Delay(uint);
void ZLG7290_Init();
void Display_Temperature(float );
uchar sample(void);
unsigned int SystemCount=0;
unsigned long FreqOne=0;
unsigned long FreqCountOne=0;
//-----------------------------------------------------------
//函数:Delay1()

//------------------------------------------------------------
void Delay1(unsigned int t)
{
   int i, j;
   for(i=1;i<t;i++)
   {
      for (j=1;j<100;j++) ;
   }
}

/*********************************
      BASE  DRIVE
**********************************/
void DELAY(uint t)
{
	while(t!=0)
	t--;
}


/************************************
           AD DRIVE
*************************************/
uchar sample(void)
{
    uchar i;
    uint temp=0;
    IOclk=0;
	ADcs=0;
	DELAY(4);
    for(i=0;i<10;i++)
    {
       IOclk=1;
       temp=temp<<1;
	   CY=Dout;
       if(CY)             //必须含有 "INTRINS.H"文件
       {
          temp|=0x01;
       }
       DELAY(2);
       IOclk=0;
       DELAY(2);
    }
    
	ADcs=1;
	temp=temp>>2;
	return temp;  
    
} 




//在数码管上显示电压
void Display_Temperature(float tem1)
{
   unsigned char d ;
   unsigned int flag;   //为0显示正,为1显示负
   float tem;
   if (tem1 >= 0) flag = 0;
   else 
      flag = 1;
   tem = abs(tem1);
   
   if (tem >= 100) 
   {  
	  if (flag == 1) ZLG7290_WriteReg(ZLG7290_DpRam4,0x02);
	  else ZLG7290_WriteReg(ZLG7290_DpRam4,0x00);
      d = tem / 100;
      ZLG7290_Download(3,0,0,d);
      tem = tem - d * 100;
      d = tem / 10;
      ZLG7290_Download(2,0,0,d);
      d = tem - d * 10;
      ZLG7290_Download(1,0,0,d);
   }
   else if (tem >= 10) 
   {
	  if (flag == 1) ZLG7290_WriteReg(ZLG7290_DpRam4,0x02);
	  else ZLG7290_WriteReg(ZLG7290_DpRam4,0x00);
      tem = tem * 10;
      d = tem / 100;
      ZLG7290_Download(3,0,0,d);
      tem = tem - d * 100;
      d = tem / 10;
      ZLG7290_Download(2,1,0,d);
      d = tem - d * 10;
      ZLG7290_Download(1,0,0,d);
   } 
   else 
   {
	  if (flag == 1) ZLG7290_WriteReg(ZLG7290_DpRam4,0x02);
	  else ZLG7290_WriteReg(ZLG7290_DpRam4,0x00);
      tem = tem * 100;
      d = tem / 100;
      ZLG7290_Download(3,1,0,d);
      tem = tem - d * 100;
      d = tem / 10;
      ZLG7290_Download(2,0,0,d);
      d = tem - d * 10;
      ZLG7290_Download(1,0,0,d);
   } 

   /*
   if (tem >= 10) 
   {
      //if (flag == 1) ZLG7290_SegOnOff(7,1);
	  if (flag == 1) ZLG7290_WriteReg(ZLG7290_DpRam1,0x02);
	  else ZLG7290_WriteReg(ZLG7290_DpRam1,0x00);
	  d = tem / 10;
      ZLG7290_Download(2,0,0,d);
      d = tem - d * 10;
      ZLG7290_Download(3,0,0,d);
   } 
   else 
   {
      //if (flag == 1) ZLG7290_SegOnOff(7,1);
	  if (flag == 1) ZLG7290_WriteReg(ZLG7290_DpRam1,0x02);
	  else ZLG7290_WriteReg(ZLG7290_DpRam1,0x00);
      tem = tem * 10;
      d = tem / 10;
      ZLG7290_Download(2,1,0,d);
      d = tem - d * 10;
      ZLG7290_Download(3,0,0,d);
   } 
   */
}



void main()
{
  // uchar temp;
   int i,j;
   float vx;
  
   EA = 0;
   INT0_Init();                        //初始化外部中断,该函数打开了EA
   ZLG7290_Init();                     //系统初始化
   EA = 1;
   while(1)
   {
     // temp = sample(); 
	 // tempf = temp;
     // vx = (tempf/256)*5.0;
    //  temperature = -25 * (vx) +70;
     // Display_Temperature(temperature);
	  vx=(FreqOne/43.0)*2*3.14*0.262*36/10.0;   //速度=count()*2*3.14*0.262*3600/1000/6
     // vx=(FreqOne/1.0);  
       Display_Temperature(vx);
      for (i=1;i<20;i++)
	     for (j=1;j<400;j++) ;
   }
}



//--------------------------------------------------------------------------------
//外部中断初始化函数
//--------------------------------------------------------------------------------
void INT0_Init(void)
{
    //TCON=0x05;
    T2CON=0x00;
//	T2MOD=0x00;
	//定时10ms
	RCAP2H =0xDC;
	RCAP2L =0x00;
	TH2=0xDC;
	TL2=0x00;
    ET2=1;	
    IT0 = 1;                //负边沿触发中断
    EX0 = 1;                //允许外部中断0
	//IT1 = 1;
    //EX1=1;
	TR2=1;
}

//---------------------------------------------------------------
//函数:ZLG7290_Init()
//功能:ZLG7290初始化
//-----------------------------------------------------------------
void ZLG7290_Init()
{
   I2C_Init();
   Delay1(30); //等待ZLG7290 复位完毕。延时完毕定时器0被关闭。
}

void timer2(void) interrupt 5 
 {
 		SystemCount++;
 		if(SystemCount>=37)
 		{
 			TR2=0;
 			SystemCount=0;
 			FreqOne=FreqCountOne;
 		//	FreqTwo=FreqCountTwo;
 			FreqCountOne=0;
 		//	FreqCountTwo=0;
 			TH2=0xDC;
			TL2=0x00;
 			TR2=1;
 		}
 					
 	TF2=0;
   } 
void External0(void) interrupt 0  using 0//外部中断,用来检测和计算频率
 {
  	FreqCountOne++;
 } 
//#include <REGX51.H>

⌨️ 快捷键说明

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