利用定时器1每过1秒cc2530给Pc发送温度。
PC发送d5on#或者d5off#控制灯亮灭。
波特率115200。
#include <ioCC2530.h>
#include "stdio.h"
#define uint unsigned int
#define uchar unsigned char
uchar Rxbuff[10];
uchar index=0;
uchar flag_U=0;
//定义 LED 的端口 /d3 d4 d5 d6 0 1 3 4
#define d3 P1_0
#define d5 P1_3
void initled()
{
P1SEL &=~(1<<0);
P1DIR |=(1<<0);
d3=0;
P1SEL &=~(1<<3);
P1DIR |=(1<<3);
d5=0;
}
/****************************************************************
温度传感器初始化函数
****************************************************************/
void initTempSensor(void)
{
TR0=0X01; //set '1' to connectthe temperature sensorto the SOC_ADC.
ATEST=0X01; // Enablesthe temperature sensor
}
/****************************************************************
串口初始化函数
******************************************* *****/
void InitUart()
{
CLKCONCMD &= ~0x40; // 设置系统时钟源为 Z 32MHZ 晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
PERCFG = 0x00; // 位置 0 1 P0 口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5 用作串口, , 第二功能
P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级
U0CSR |= 0x80; //UART 方式
U0GCR |= 11; //U0GCR 与 与 D U0BAUD 配合
U0BAUD |= 216; // 波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志初始置位 1 (收发时候)
U0CSR |= 0X40; // 允许接收
IEN0 |= 0x84; // 开总中断,接收中断
}
//定时器初始化
void InitT1() //系统不配置工作时钟时默认是 2 分频,即 16MHz
{
T1CTL = 0x0d; //128 分频,自动重装 0X0000-0XFFFF
T1STAT= 0x21; //通道 0, 中断有效
}
/****************************************************************
延时函数
****************************************************************/
void Delay_ms(uint n)
{
uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<1774;j++);
}
}
/****************************************************************
读取温度传感器 AD 值函数
****************************************************************/
float getTemperature(void)
{
uint value;
ADCCON3 = (0x3E); //选择 1.25V 为参考电压;14 位分辨率;对片内温度传感器采样
ADCCON1 |= 0x30; //选择 ADC 的启动模式为手动
ADCCON1 |= 0x40; //启动 AD 转化
while(!(ADCCON1 & 0x80)); //等待 AD 转换完成
value = ADCL >> 4; //ADCL 寄存器低 2 位无效
value |= (((uint)ADCH) << 4);
return (value-1367.5)/4.5-4; //根据 AD 值,计算出实际的温度,芯片手册有错,温度系数应该是 4.5 /℃
//进行温度校正,这里减去 4℃(不同芯片根据具体情况校正)
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void Uart_Send_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0); // 发送完成标志位
UTX0IF = 0;
}
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
char i;
char TempValue[7];
uchar count;
float AvgTemp;
InitT1();
initled();
InitUart(); //初始化串口
initTempSensor(); //初始化 ADC
while(1)
{
///定时器查询
if(IRCON>0) //查询方式
{
IRCON=0;
if(++count>=2) //约 1s 周期性闪烁
{
d3=1;
count=0;
AvgTemp = 0;
for(i = 0 ; i < 64 ; i++)
{
AvgTemp += getTemperature();
AvgTemp=AvgTemp/2; //每次累加后除 2
}
/****温度转换成 ascii 码发送****/
TempValue[0] = (unsigned char)(AvgTemp)/10 + 48; //十位
TempValue[1] = (unsigned char)(AvgTemp)%10 + 48; //个位
TempValue[2] = '.'; //小数点
TempValue[3] = (unsigned char)(AvgTemp*10)%10+48; //十分位
TempValue[4] = (unsigned char)(AvgTemp*100)%10+48; //百分位
TempValue[5] = '\r\n';
TempValue[6] = '\0';
Uart_Send_String( TempValue,6);
d3=0;
}
}
}
}
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void) ///URX0IF URX0IF
{
URX0IF=0;
Rxbuff[index]=U0DBUF;
index++;
if(Rxbuff[index-1]=='#')
{
index=0;
if(strcmp(Rxbuff,"d5on#") == 0)
{
d5 = 1;
}
if(strcmp(Rxbuff,"d5off#") == 0)
{
d5 = 0;
}
memset(Rxbuff,0,10);
}
}