/***************************************** //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); } }
|