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

📄 main.c

📁 完成了温度采集并显示的功能
💻 C
字号:
/*****************************************************************************************
		 
		                   程序说明

   本程序实现的功能是对ADUC824开发板的标准传感器端J1的THER 和AGND端输入的热电阻(AT502)来采集温度。
   并利用1602LCD将温度值显示,同时可以采用串口调试工具观察各参数,同时扩展了用指令将CPU转入掉电模式
   功能,具体操作指令及接线提示如下:

   接线提示:
           1.将液晶HS162-4插在JP5上
           2.将AT502接在J1的THER和AGND端上
           3.将拨码开关S4(2,3,4)打开
           4.应利用R41,R42将电压调整如下: 驱动电压Vo   :0.71--0.8v
                                            背光电压LED+ :2.37V

   程序采用串口调试工具可以观察采集结果,具体的指令格式为:

           发送A,返回ADC1所转换的原始转换值(调试用);
           发送B,返回查表转换后的温度值;
           发送C,进入掉电模式;

   同时,若接上了1602LCD可以看到温度值的显示,可以由读者自己扩展成加日期时间显示
		 提示:用ADUC824内部自带的RTC寄存器实现。

   author: zdq@hdu
   any question please contact :zdq823@gmail.com

**********************************************************************************************/


#include<aduc834.h>
#include"..\headers\main.h"
#include"..\headers\1602.h"
#include"..\headers\RS485.h"

extern unsigned int code AT502[70];

bit Sample_Flag;  				 //采集标志位
sbit LED = P3^5;				 //LED指示灯
unsigned char UART_BUF;			 //串口接收缓冲单元
unsigned char Tem;
union {							 //全局变量,存储AD转换值

unsigned int AD_Value;
unsigned char TEM[2];
}v;

void main ()

{
  LCD_Init();
  main_Init();
  while(1)
  {
   if(Sample_Flag)
    {
     Sample_Flag =0;
     Sample();
     Tem = Find();
	 DDRAM_ADDR_SET(2,0x06);	 //设置显示位置,第一个参数是行数,第二个参数是第几位
	 WR_DAT(Tem/10 +'0');	     //显示高位
	 WR_DAT(Tem%10 +'0');	     //显示低位
	 WR_DAT(0X00);               //调用CGRAM字库显示度
	 WR_DAT(0X43);     		     //显示C
	 
    }		   

   if(UART_BUF =='B')			  //串口发送温度值
    {
	 UART_BUF = 0X00;
	 //Tem = 21;
     SendChar(Tem/10 +'0');		 //发送温度值十位数
     SendChar(Tem%10 +'0');		 //发送温度值个位数
	 }

   if(UART_BUF == 'A')           //发送AD转换原始数据
    {
     UART_BUF =0X00;
     SendVar(v.TEM[0]);          //发送高位
     SendVar(v.TEM[1]);         //发送低位
    }

	if(UART_BUF == 'C')			//进入掉电模式命令
	{
	  PCON =0x22;				//掉电模式,INT0方式唤醒,且PLLCON.0已置位,故TIC中断不唤醒
	 }
  }

}
void main_Init()		 //系统初始化

{
	PLLCON = 0x80;		//12MHZ	/掉电时把晶振关掉(PLLCON.0位)
	TH2=0XFF;
	TL2=0XD7;			//9600波特率
	RCAP2H=0XFF;
	RCAP2L=0XD7;
	SCON=0X50;		   //方式1,允许接收
	T2CON=0X34;		   //定时器2作为串口波特率发生器
    PCON=0x00;		   //波特率倍增位0

	ADC1CON=0x78;	   //AIN5,单极性

	INTVAL=0x10;	   //定时时间1/8s
	TIMECON=0x03;	   //单位为1/128s
	IEIP2=0x04;		   //TIC定时中断允许
//	InitDsp();	  	   //1602液晶初始化
	ES = 1;            //串口中断允许 

	IT0 =1;  		   //外部中断0 INTO 的相关设置
	EX0 =1;

	EA=1;			   //总中断允许
	Sample_Flag = 0 ;

}
/*********************二分法查找程序*****************************/
unsigned char Find()
{
 unsigned char Counter_First=0,Counter_Mid=0,Counter_End=69 ;
 unsigned char i;
   for(i=0;i<7;i++)
     {
         Counter_Mid = (Counter_First+Counter_End)>>1;   //中间值
         if(v.AD_Value>=AT502[Counter_Mid])		         //与中间值比较
   	     Counter_End = Counter_Mid;					     //小于中间值则转到前半段
	     else
	     Counter_First = Counter_Mid;				     //大于中间值则转到后半段
      }
  return Counter_End;                                    //返回最后的查找值


}

/*****************温度采集程序******************************/
void Sample(void)			   //采用全局变量传值,故不用参数

{
   ADC1CON = 0x78;			  //AIN5,单极性
   ADCMODE = 0x12;			  //ADC1允许,ADC0关闭,单个转换方式
   while(!RDY1);		      //等待转换结束
   RDY1 = 0;
   v.TEM[0] = ADC1H;
   v.TEM[1] = ADC1L;		  //用全局变量联合体存储

}
/************TIC定时工作灯闪烁**************************/
void  TIC_INT() interrupt 10
{
   LED = ~LED;
   Sample_Flag = 1;

}
/*************串口接收中断接收指令*********************************/
void  UART_INT() interrupt 4

{
   UART_BUF = SBUF;
   RI =0;
         
}

/**************掉电模式唤醒测试*************************************/
void EX0_INT()  interrupt 0	  //用IRET来唤醒CPU

{

}

⌨️ 快捷键说明

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