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

📄 main.c

📁 利用NTC电阻实现温度测试,带详细文档和C语言代码,测试温度误差在0.5度.
💻 C
字号:

/*==============================================================================================
  Copyright (C), 2005, RegalCyber Tech. Co., Ltd.
  File name:   main.C
  Author: Zhangui Duan   Version: v1.3   Date: 2005-3-30

  Description:
     此程序文件主要是完成接收读卡器的寻卡信号,再发送四字节的卡号
  		1,主程序 
  		2,初始化CPU,I/O口,串口,RTC,SPI等
  Other Description:
  		 由 Keil C51 V7.05 编译通过

  Function List:  
    1. 	主程序
		void main(void);
	2,	初始化程序
		void Init(void);
		
  History:          
    1. Date:  2005-6-12
       Author:Zhangui Duan
       Modification: 由于卡号要与普通的IC卡兼容,将卡号设置为4个字节,所以发送的有效数据宽度
	   由原来的40位改为48位(1字节前置码+4字节卡号+1字节校验字节),同时发送缓冲区直接设置
	   为数组,字节长度为6字节

==============================================================================================*/
#include "main.h"
//#include "adc.h"
#include <stdio.h>
//#define DEBUG 1

unsigned char code R_T1[61] = {254,241,230,219,209,199,190,181,172,165,157,150,143,137,130,125,119,114,
 							   109,104,100,96,92,88,84,81,77,74,71,68,65,63,60,58,55,53,51,49,47,45,43,
							   42,40,39,37,36,35,33,32,31,30,29,28,27,26,25,24,23,22,21,20};
//unsigned char code R_T2[25] = {242,228,215,203,192,182,172,162,154,146,138,131,124,117,111,106,100,95,90,
 		//					   86,82,78,73,70,67};	 /4
unsigned char code R_T2[45] = {240,224,210,197,184,173,162,152,143,134,126,118,111,105,98,93,87,82,78,73,
							   69,65,62,58,55,52,49,46,44,42,39,37,35,34,32,30,29,27,26,25,23,22,21,20,19};		//   /14


void Temperature_test(void)
{
	unsigned char i,j;
	char Tempteratrue   = 0;
	unsigned char Rntc  = 0;    //热敏电阻的阻值
	unsigned long Time1 = 0;   //标准电阻充放电时间
	unsigned long Time2 = 0;   //热敏电阻充放电时间
	P0_DIR = 0x00;             //R RT C端都设为输出
	P_Rsta 	= 0;	           //放电
	P_Rntc 	= 0;
	P_Ctest	= 0;
	Delay100us(100);
	P0_DIR = 0x28;    //RT C端设为输入,R端设为输出
   	P_Rsta 	= 1;	  //通过电阻R对C充电
	while(P_Ctest != 1)
	{
		Time1++ ;
	}		
	P0_DIR = 0x00;    //R RT C端都设为输出	
	P_Rsta 	= 0;	  //放电
	P_Rntc 	= 0;
	P_Ctest	= 0;
	Delay100us(100);
	P0_DIR = 0x18;    //R C端设为输入,RT端设为输出
   	P_Rntc 	= 1;	  //通过热敏电阻RT对C充电
	while(P_Ctest != 1)
	{
		Time2++;
	}
   	Rntc = (unsigned char)((0x64*Time2)/Time1);		//计算出热敏电阻值
	for(i = 0;i<62;i++)
	{
		if((Rntc <= R_T1[i] )&& (Rntc > R_T1[i+1])) Tempteratrue = 5+i;	
		if(Rntc >254)
		{
		  	for(j = 0; j<46 ;j++)
			{
			 	if(((Rntc/14) <= R_T2[j])&& ((Rntc/14) > R_T2[j+1]))Tempteratrue = (-40)+i;		
			}	
		}	 
	}
	PutChar(Tempteratrue);	
}



/**********************************************************************************************
  Function:        main
  Description:     定时休眠,通过RTC唤醒,
  				   判断收到寻卡信号,发送卡号,并判断是否出了此区域,
  Calls:           
  					Init();
    				Init_Receiver();
					Transmitter();
					Delayms();
					Receiver();
  Called By:      			 
  Input:     
  Output:    
  Return:    
  Others:    
**********************************************************************************************/
 void main(void)
 {
  //  unsigned char _set_card;
	unsigned char temp= 0;
   // _set_card=Config();//接收配置读卡器发送过来的卡号,并返回卡号
  //  RW_Flash(_set_card);//存储或者是从eeprom中取出卡号和配置参数
   	Init();
//	InitADC();
//	TxBuf[0]=TransmitCardNo;//前置码
//	TxBuf[13]=TxBuf[1]^TxBuf[2]^TxBuf[3]^TxBuf[4]^TxBuf[5]^TxBuf[6]^TxBuf[7]
//	^TxBuf[8]^TxBuf[9]^TxBuf[10]^TxBuf[11]^TxBuf[12]; //校验字节
  //  WriteRTC(TIME/TICK); //设置唤醒定时器
    while(1)
    { 											 	
		Temperature_test();
	//	Delay100us(4000);
    //----------------------------------------------
	  //发送卡号
    //----------------------------------------------;
    	  //REGX_CTRL = 0x0b; 					 //关闭唤醒定时器
          //while(REGX_CTRL & 0x10)             // Wait for the interface to be ready
    //  
	/*      ;
		  #ifdef DEBUG
		  LED4=0;
		  PutChar(0x55);
    	  Delayms(1);  
    	  LED4=1;
		  #else	
		  Temperature_test();

		  //temp = Temperature_test();
		 // PutChar(temp);
		  //PutChar(0x77); //test
		 // Transmitter(&TxBuf[0]);//发送卡号
		  #endif
		  Delay100us(1); 		  
	  	  CK_CTRL=0x03;//省电模式	  
		 */	          	    	
  	  } 
  }

 /*************************************************
  Function:        RW_Flash
  Description:     参数配置
  					1,将配置参数存入FLASH中
					2,从FLASH中读出配置参数
  Calls:           	void EEInit(void);
					unsigned char EERead(unsigned int addr);
					void EEWrite(unsigned int addr, unsigned char b);
  Called By:        void main(void)			 
  Input:     	    set_card
                    根据此输入值判断是否有进行参数配置
  Output:    
  Return:    
  Others:    
*************************************************/ 
void RW_Flash(unsigned char set_card)
{
   	unsigned char m;
	unsigned int addr_card,config_addr;
  	EEInit();     //eeprom 初始化
	config_addr=Addr_Cardno+12;//初始化配置参数存放地址	
  //--------------------------------------------//
   //如果需要配置,则将卡号和配置参数写到FLASH中
	if(set_card)
	{
	    if(!((RxBuf[1]==0)&&(RxBuf[2]==0)&&(RxBuf[3]==0)&&(RxBuf[4]==0)&&(RxBuf[5]==0)&&(RxBuf[6]==0)
		&&(RxBuf[7]==0)&&(RxBuf[8]==0)&&(RxBuf[9]==0)&&(RxBuf[10]==0)&&(RxBuf[11]==0)&&(RxBuf[12]==0)))
		{
		   //如果12字节卡号数据全部为0,则发送过来的卡号数据就不需要存储到FLASH中
			for(m=1,addr_card=Addr_Cardno;m<13;m++,addr_card++)
			{
				EEWrite(addr_card, RxBuf[13-m]);	//将12字节卡号参数写到FLASH中
    		}
		}
			EEWrite(config_addr, RxBuf[13]);//将配置参数写到FLASH中
			EEWrite((config_addr+1), RxBuf[14]);//将时间参数写到FLASH中
	}
  //--------------------------------------------//
	//从FLASH中读出12字节的卡号以及配置参数
	for(m=1,addr_card=Addr_Cardno;m<13;m++,addr_card++)
	{
		TxBuf[m]=EERead(addr_card);    //读取卡号
	}
	tconf.buf[13]=EERead(config_addr); //读取发送配置参数
	rconf.buf[13]=tconf.buf[13];      //读取接收配置参数
	TIME=EERead(config_addr+1); 	  //读取时间参数
}

 /*************************************************
  Function:        Config
  Description:     参数配置
  					1,接收配置读卡器发送过来的卡号,收发功率,收发速率
					2,返回上述参数给配置读卡器
  Calls:           	void Init(void)
					void Init_Receiver(void)
					void Receiver(unsigned char *rxbuf)
                    void Transmitter(unsigned char *txbuf)
  Called By:        void main(void)			 
  Input:     
  Output:    
  Return:    
  Others:    
*************************************************/ 
unsigned char Config(void)
{
	unsigned char s,Rnum,set_card_sign;
	Init();
	Init_Receiver(); //接收初始化
	set_card_sign=0;
	Rnum=0;
	do{
	  	Rnum++;
	  #ifdef DEBUG
	    LED3=0;
	  #endif
	    //Init_Receiver(); //接收初始化
	  	for(s=0;s<RNUM;s++)
		{
		 RxBuf[s]=0;	
		} 
	    Receiver(RxBuf);
		//判断是否是设置卡号命令
		if((RxBuf[0]==SetCardNo)&&((RxBuf[1]^RxBuf[2]^RxBuf[3]^RxBuf[4]^RxBuf[5]^RxBuf[6]^RxBuf[7]
		^RxBuf[8]^RxBuf[9]^RxBuf[10]^RxBuf[11]^RxBuf[12]^RxBuf[13]^RxBuf[14])==RxBuf[15]))
		{
			Rnum=255;
			set_card_sign=1;
			/*
		   #ifdef DEBUG
	  		 LED3=1;
	  	   #endif
		   */
		}	
	  Delayms( Setdelaytime);	//延时1ms
	  /*
	#ifdef DEBUG
	  LED4=0;
	#endif
	*/
    }while(Rnum<250);         //连续接受5秒数据
	/*
	#ifdef DEBUG
	 LED4=1;
	#endif
	*/
//----------------------------------------------
    //将接收到的卡号和参数返回给设置读卡器
//----------------------------------------------
	if(set_card_sign)
	{	TxBuf[0]=TransmitCardNo;
	    TxBuf[1]=RxBuf[1];
		TxBuf[2]=RxBuf[2];
		TxBuf[3]=RxBuf[3];
		TxBuf[4]=RxBuf[4];
		TxBuf[5]=RxBuf[5];
	    TxBuf[6]=RxBuf[6];
		TxBuf[7]=RxBuf[7];
		TxBuf[8]=RxBuf[8];
		TxBuf[9]=RxBuf[9];
		TxBuf[10]=RxBuf[10];
		TxBuf[11]=RxBuf[11];
		TxBuf[12]=RxBuf[12];
		TxBuf[13]=RxBuf[15];
		Delayms(5);
		Rnum=0;
		do{
	  		Rnum++;
			Transmitter(&TxBuf[0]);//发送接收到的数据
			/*
		  #ifdef DEBUG
	 	 	LED3=0;
    	 	Delayms(5);  
   	 	 	LED3=1;
		  #endif
		  */
	  		Delay100us(RCdelaytime);
		   }while(Rnum<5);	//连续发送5次数据
	}
  return set_card_sign;
}

/*************************************************
  Function:        Init
  Description:     CPU的初始化
  					1,I/O口的方向初始化
					2,I/O口的输出初始化
					3,SPI初始化
					3,串口初始化
					4,发送接收缓冲区初始化
  Calls:           
  Called By:        void main(void);			 
  Input:     
  Output:    
  Return:    
  Others:    
*************************************************/ 
 void Init(void)
 {

//  Port ini

    P0_ALT = 0x06;  // Select alternate functions on pins P0.1 and P0.2,  TXD RXD 
   // P0_DIR = 0x09;                  // P0.0, P0.3 is input(S1, S2), the rest output
   // P0 = 0xF0;                      // P0.7-P0.4 = 1 for OFF LED1-LED4    
    P1_DIR = 0x03;		   			// P0.0, P0.3 is input(S3, S4),

//	LED1=1;
//	LED2=1;
//	LED3=1;
//	LED4=1;

    PWR_UP = 1;                     // Turn on Radio
    Delay100us(30);                 // Wait > 3ms 
    SPICLK = 0;                     // Max SPI clock (XTAL/8)
    SPI_CTRL = 0x02;                // Connect internal SPI controller to Radio

//  serial communication ini
    TH1 = 230;      // 9600@16MHz (when T1M=1 and SMOD=1)
    CKCON |= 0x10;  // T1M=1 (/4 timer clock)
    PCON = 0x80;    // SMOD=1 (double baud rate)
    SCON = 0x52;    // Serial mode1, enable receiver
    TMOD = 0x20;    // Timer1 8bit auto reload 
    TCON = 0x40;    // Start timer1 
/*
//定时器0初始化
	TH0   = 2; 	//192us	  
	TL0   = TH0;
	TR0   = 1;      //允许定时器0计数            
	EA=1;          //打开总中断控制位 
	ET0=0;		  //关闭定时中断

	TRCOUNT=0;
	RxBuf[0]=0;
	RxBuf[1]=0;
*/
 }   


⌨️ 快捷键说明

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