CC2530AD转换;通过芯片检测温度;串口控制led灯亮。

利用定时器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);
    
  }
} 
    
    
    
    
    
    
    
    

 

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIOT魔法师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值