实验共用到CLOKCON、SLEEP、PERCFG、U0CSR、U0GCR、U0BAUD、IEN0、U0BUF、ADCCON1、ADCCON3、ADCH和ADCL几个个寄存器。其中CLOKCON为时钟控制寄存器,SLEEP为睡眠模式控制寄存器,PERCFG为外设控制寄存器,U0CSR为串口0控制状态寄存器,U0CSR为串口0常规控制寄存器,U0BAUD为串口0波特率控制寄存器,U0BUF为串口0收发缓冲。
这个实验的程序真的是十分麻烦,在我看来主要是分成两个部分——串口部分和测温部分,首先说一下串口部分的程序吧。主要包括下面的几个函数:
void initUARTtest(void); 串口初始化函数
void UartTX_Send_String(char *Data,int len); 向串口发送字符串函数
void UartTX_Send_word(char word); 向串口发送字函数
以上这些就是这个实验里要用的了,因为这个实验是通过串口向上显示数据的,所以主要是用到的串口的发送功能(数据通过串口由芯片向上位机发送),前面我写的文章讲串口的已经是不少了感觉,所以这里就不再一一解释这写程序了。但是要说明的一点就是串口发送的时候是不能够用中断的,要使用查询模式,所以要从初始化串口开始一步一步的进行。这个实验里设置的波特率是57600。
接着说一下这个实验的测温部分。测温部分用到的函数有一下几个:
initTempSensor(); 初始化温度传感器函数
getTemperature(); 获取温度函数
其中initTempSensor()的程序是
void initTempSensor(void)
{
DISABLE_ALL_INTERRUPTS(); //关掉中断
SET_MAIN_CLOCK_SOURCE(0); //设置时钟频率
*((BYTE __xdata*) 0xDF26) = 0x80; //设AD目标为片机温度传感器(这个我不是很明白,55)
}
而getTemperature()的程序在这就不给出了,主要是看一下几个与他有关的宏定义:
//ADC信号转换宏定义
#define ADC_SINGLE_CONVERSION(settings) do{ ADCCON3 = (settings); }while(0)
//ADC采样信号宏定义
#define ADC_SAMPLE_SINGLE() do { ADC_STOP(); ADCCON1 |= 0x40; } while (0)
//采样就绪宏定义
#define ADC_SAMPLE_READY() (ADCCON1 & 0x80)
//数值计算宏定义
#define ADC14_TO_CELSIUS(ADC_VALUE) ( ((ADC_VALUE) >> 4) - 315)
在getTemperature()这个函数里一共是连续进行了四次AD转换,将得到的结果求均值后将AD转换为温度返回。这样我们就可以看见片内温度了(见下图)。
文章评论(0条评论)
登录后参与讨论