CC2530 ADC实验1(读取片内温度并通过串口显示)


/***************************************** //by 虚幻代码 //名称:读取片内温度并通过串口显示 //说明:取片内温度传感器为AD源,通过串口在PC上显示出来。 //实验使用UART0,波特率为19200 *****************************************/ /*引用********************************************/ #include #include/*宏定义*****************************************/ #define uchar unsigned char #define uint unsigned int #define int16 short#define uint16 unsigned short/*函数定义*******************************/ //初始化时钟 void initclock(void) {CLKCONCMD &=0XBF; //系统时钟源选择32MHZ XOSCCLKCONCMD &=0XF8; //系统时钟频率为32MHZCLKCONCMD |=0X28; CLKCONCMD &=0XEF; //定时时钟频率为1MHZwhile(CLKCONSTA & 0X40); //等待时钟稳定 } //初始化串口0函数 void inituart0(void) {PERCFG &=0XFE; //设USART0的ALT 1P0SEL |=0X3C; //P0口2、3、4、5做外设P2DIR &=0X3F; //P0外设优先级USART0最高U0CSR |=0X80; //设USART0 工作方式为 UARTU0GCR |=9; U0BAUD |=59; //设波特率,理论上应该为19200,调试串口却要设为9600,奇怪?UTX0IF=0; //UART0 TX中断标志位清0U0CSR |=0X40; //USART0 接收使能IEN0 |=0X04; //usart0 接收中断使能IEN0 |=0X80; //总中断使能 } //串口发送字符串函数 void uarttx_send_string(char *data,int len) {int j; for(j=0; j> 2; //ADCL寄存器低2位无效value |=(((uint16)ADCH)<<6); //连接ADCH和ADCL,并赋值给valueadcvalue +=value; //adcvalue被赋值为4次AD值之和}value=https://www.it610.com/article/adcvalue>>2; //累加除以4,得到平均值return ((value) >> 4) - 315; //根据AD值,计算出实际的温度 }/*变量定义和赋值*******************************/ int16 avgtemp;
【CC2530 ADC实验1(读取片内温度并通过串口显示)】/*主函数*******************************/ void main(void) {char i; char tempvalue[10]; initclock(); //初始化时钟inituart0(); //初始化串口IEN0=IEN1=IEN2=0X00; //关闭所有中断ATEST=0X01; //开启温度传感器TR0=0X01; //将温度传感器与ADC连接起来while(1){avgtemp=0; for(i=0; i<64; i++){avgtemp +=gettemperature(); //取得温度数,加上原平均值avgtemp>>=1; //除以2,取得平均值}sprintf(tempvalue,(char *)"%dC/r",(int)avgtemp); uarttx_send_string(tempvalue,4); delay(50000); } }







/* 本程序讲解AD控制(片内温度计) 主讲王加辉 */ #include #include"stdio.h" #define ucharunsigned char #define uintunsigned int void init_UART0(void)/*初始化串口*/ { P0SEL|=0X3C; /*这里我们是选择P0_2,P0_3,P0_4,P0_5最为串口通信的I/O口*/ P2DIR&=~0XC0; /*在这里我们设置串口0的优先级大于串口1,也就是设置使用串口0*/ PERCFG=0X00; /*PERCFG是接口控制寄存器,这里我们选择串口0位置1,就是选择P0-2和P0-3为串口通信接口*/ U0CSR|=0X80; /*选择串口的工作方式,我们选择为异步通信*/ U0GCR|=11; /*结合U0BAUD设置波特率为115200,请各位查找手册*/ U0BAUD|=216; UTX0IF=0; /*UTX0IF为串口0发送中断标志位,我们将其置零*/ }
float recieve_AD(void)/*AD转换,读取片内温度计实时电压*/ { uint value=https://www.it610.com/article/0; /*无符号整型变量,用来储存AD转换值*/ ADCCON1|=0X30; /*选择AD转换启动的方式为手动启动*/ ADCCON3=0X3E; /*设置AD转换的信息源为片内温度传感器、选择内部参考电压为1.25V,设置单通道AD转换的分辨率为512dec,12位,此处要对照AD寄存器手册查看*/ ADCCON1|=0X40; /*手动启动AD转换*/ while(!(ADCCON1&0X80)); /*等待AD一次转换完成*/ value=ADCL>>4; /*CC2530的AD转换数据是由高到低存储的,ADCL低4位无效,所以我们要向右移动去掉无效四位, 这我也是在CC2430学校视频上看到的,暂时我不能给出确切解释,有懂得请补充一下,谢谢*/ value|=(uint)ADCH<<4; /*视频上解释高位数据向左移动4位是为了和低位对应,然后相加,我无法做出准确解释,我找到相关资料再做补充解释*/ return value*0.06229-303.3-4; /*温度的计算公式为:温度=((测量电压-某一电压)/温度系数)-温度的误差值*/ }
void init_tempurature()/*初始化温度传感器*/ { IEN0=IEN1=IEN2=0; /*因为AD转换会产生中断,所以此处我们先关掉所用中断,对于AD中断的使用大家可以参考手册,查看其中断源*/ CLKCONCMD&=~0X40; /*设置时钟频率,在前面的串口通信中我们也曾讲过*/ while(CLKCONSTA&0X40); CLKCONCMD&=~0X47; TR0=0X01; /*这里我让AD和温度传感器相连*/ ATEST=0X01; /*启动温度传感器*/ }
void data_UART0(char *character,int length)/*串口数据输出函数*/ { int i; for(i=0; i

    推荐阅读