📄 main.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 + -