CC2530 ADC实验1(读取片内温度并通过串口显示)
来源:互联网 发布:大数据在审计中的应用 编辑:程序博客网 时间:2024/05/22 06:14
/*****************************************//by 虚幻代码//名称:读取片内温度并通过串口显示//说明:取片内温度传感器为AD源,通过串口在PC上显示出来。//实验使用UART0,波特率为19200*****************************************//*引用********************************************/#include <iocc2530.h>#include <stdio.h>/*宏定义*****************************************/#define uchar unsigned char#define uint unsigned int#define int16 short #define uint16 unsigned short /*函数定义*******************************///初始化时钟void initclock(void){ CLKCONCMD &=0XBF;//系统时钟源选择32MHZ XOSC CLKCONCMD &=0XF8;//系统时钟频率为32MHZ CLKCONCMD |=0X28; CLKCONCMD &=0XEF;//定时时钟频率为1MHZ while(CLKCONSTA & 0X40);//等待时钟稳定}//初始化串口0函数void inituart0(void){ PERCFG &=0XFE;//设USART0的ALT 1 P0SEL |=0X3C;//P0口2、3、4、5做外设 P2DIR &=0X3F;//P0外设优先级USART0最高 U0CSR |=0X80;//设USART0 工作方式为 UART U0GCR |=9; U0BAUD |=59;//设波特率,理论上应该为19200,调试串口却要设为9600,奇怪? UTX0IF=0;//UART0 TX中断标志位清0 U0CSR |=0X40;//USART0 接收使能 IEN0 |=0X04;//usart0 接收中断使能 IEN0 |=0X80;//总中断使能}//串口发送字符串函数void uarttx_send_string(char *data,int len){ int j; for(j=0;j<len;j++) { U0DBUF=*data++; while(UTX0IF==0); UTX0IF=0; } U0DBUF=0X0A;//换行 while(UTX0IF==0); UTX0IF=0; }//延时函数void delay(uint n){ uint i; for(i=0;i<n;i++); for(i=0;i<n;i++); for(i=0;i<n;i++); for(i=0;i<n;i++); for(i=0;i<n;i++);}//读取温度传感器AD值函数uint gettemperature(void){ uint i; uint16 adcvalue; uint16 value; adcvalue=0; for(i=0;i<4;i++) { ADCCON3 |=0X0E;//单通道AD转换源为温度传感器--看手册 ADCCON3 &=0X3F;//单通道AD转换参考电压为1.25内部电压 ADCCON3 |=0X30;//单通道AD转换分辨率为512DEC,12有效 ADCCON1 |=0X30;//ADC启动方式选择为ADCCON1.ST=1事件 ADCCON1 |=0X40;//ADC启动转换 while(!ADCCON1&0X80);//等待AD转换完成 value = ADCL >> 2; //ADCL寄存器低2位无效 value |=(((uint16)ADCH)<<6);//连接ADCH和ADCL,并赋值给value adcvalue +=value;//adcvalue被赋值为4次AD值之和 } value=adcvalue>>2;//累加除以4,得到平均值 return ((value) >> 4) - 315; //根据AD值,计算出实际的温度} /*变量定义和赋值*******************************/int16 avgtemp;
/*主函数*******************************/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<iocc2530.h>#include"stdio.h"#define uchar unsigned char#define uint unsigned intvoid 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=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<length;i++){U0DBUF=*character++;while(UTX0IF==0);/*每次发送数据完成后串口发送中断位硬件自动置一*/UTX0IF=0;/*这里我们要软件将其置一*/}U0DBUF=0X0A;/*这句是在串口中输出一个换行,大家可以试试*/while(UTX0IF==0);UTX0IF=0;}/*告诉大家一个在串口通信中将数字转换成字符输出的简单方法,就是在数字后面加0x30,大家可以尝试*/void delay_ms(int ti)/*延迟函数*/{int x,y;for(x=0;x<ti;x++)for(y=0;y<526;y++);}void main(){int turn=0;float ADTEMP=0;char temp[6]={0};init_tempurature();//初始化温度传感器init_UART0();//初始化串口通信while(1){for(turn=0;turn<60;turn++)/*累计60次的温度*/ADTEMP+=recieve_AD();ADTEMP=ADTEMP/60;/*求60次温度的平均值*/temp[0]=(uchar)(ADTEMP)/10+48;/*将温度的数值存入数组temp中*/temp[1]=(uchar)(ADTEMP)%10+48;temp[2]='.';temp[3]=(uchar)(ADTEMP*10)%10+48;temp[4]=(uchar)(ADTEMP*100)%10+48;data_UART0(temp,5);//串口输出温度值delay_ms(2000);//控制每次输出的时间间隔}}/*zigbee cc2530的AD控制(片内温度计)就讲到这里,祝大家学的愉快*/
- CC2530 ADC实验1(读取片内温度并通过串口显示)
- CC2538之TinyOS例程实验:5-Adc_Temp片内温度读取实验 TinyOS如何直接使用C文件
- STC15F2K60S2读取DS18B20温度串口显示
- MSP430F149片内温度
- 单片机实时温度采集并通过串口通信上传电脑显示
- CC2530 串口实验
- CC2530串口实验
- CC2530基础实验五 ADC转换实验
- C8051F020实现ADC采样芯片外的模拟电压,通过LCD显示,并通过串口发送到PC机
- ZigBee基础实验(七)--AD采集温度串口显示
- zigbee温度读取函数 (cc2530内部)
- 【龙印】龙芯1C300A片内ADC的测试
- ARM串口实验,ADC实验,I2C实验
- 2812片内ADC采样时间计算
- matlab读取串口数据并显示曲线
- CC2530--串口实验的回显
- cc2530 串口实验--控制led灯
- cc2530 串口实验4--设置时间
- 常用字符串时间工具类
- 小时候。哭着哭着,就笑了。长大了,笑着,笑着,就哭了。
- 利用busybox制作yaffs2文件系统
- C#各命名空间用途——c#
- ORA-19808
- CC2530 ADC实验1(读取片内温度并通过串口显示)
- c/c++ 从键盘流中读入字符串的函数:gets(str);
- CentOS下php安装mcrypt扩展
- C#获取对象的属性值,格式为(属性:值),
- ant多项目打包,Ant多个项目批量打包方法
- 8086汇编常用子程序集(未完)
- linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(
- svn服务器环境搭建及汉化图文教程
- 你知道。在这个世界上最好的幸福——就是可以做自己。