cc2530设计性实验代码五

该代码实现了一个嵌入式系统,使用ADC进行温度和电源电压的测量。系统根据定义的节点类型配置LED和按键,通过HalAdcInit初始化ADC,并读取温度传感器和电源电压的多次平均值,然后在LCD上显示结果。程序还包含了延时函数和系统时钟源选择功能。
摘要由CSDN通过智能技术生成

主函数

#include"ioCC2530.h"
#include"hal_ADC/hal_adc.h"
#include"hal_ADC/hal_types.h"
#include"hal_ADC/LcdControl.h"
#include "stdio.h"

#define uint unsigned int
#define uchar unsigned char

#define master_node

#ifdef master_node
#define LED1 P1_0
#define LED2 P1_1
#else
#define LED1 P1_1
#define LED2 P1_0
#endif
#define ON 1
#define OFF 0
#ifdef master_node
#define K1 P1_3
#define K2 P0_1
#else
#define K1 P0_1
#define K2 P0_7
#endif
enum SYSCLK_SRC{XOSC_32MHz,RC_16MHz};

void Delay(uint);
void InitLed(void);
void InitKey(void);
uchar KeyScan(void);

char i=0;
uchar Keyvalue=0;
uint temperature = 0;
uint volt=0,voltagevalue=0;
uint16 avgTemp;
uint16 avgVcc3;
double v3;

void Delay(uint n){
  uint t;
  for(t=0;t<n;t++);
  for(t=0;t<n;t++);
  for(t=0;t<n;t++);
  for(t=0;t<n;t++);
  for(t=0;t<n;t++);
}

void SystemClockSourceSelect(enum SYSCLK_SRC source)
{
  unsigned char osc32k_bm=CLKCONCMD & 0x80;
  unsigned char __clkconcmd,__clkconsta;
  
  if(source==RC_16MHz)
    CLKCONCMD=((osc32k_bm)|\
      (0x01<<6)|\
        (0x01<<3)|\
          (0x01<<0));
  else if(source==XOSC_32MHz)
  {
    CLKCONCMD=(osc32k_bm);
  }
  __clkconcmd=CLKCONCMD;
  do
  {
    __clkconsta=CLKCONSTA;
  }while(__clkconsta!=__clkconcmd);
}
void InitKey(void)
{
  
#ifdef master_node
  P0SEL&=~0X02;
  P0DIR&=~0X02;
  P0INP|=0x02;
  
  P1SEL&=~0X08;
  P1DIR&=~0X08;
  P1INP|=0x08;
#else
  P0SEL&=~0X82;
  P0DIR&=~0X82;
  P0INP|=0x82;
#endif
}

void InitLed(void)
{
  P1SEL&=~0x03;
  P1DIR|=0x03;
  LED1=ON;
  LED2=OFF;
}

uchar KeyScan(void)
{
   if(K1==0)
  {
    Delay(100);
    if(K1==0)
    {
      while(!K1);
      return(1);
    }
  }
  
  else if(K2==0)
  {
    Delay(100);
    if(K2==0)
    {
      while(!K2);
      return(2);
    }
  }
  else
    ;
  return(Keyvalue);
}
void main(void)
{
  char i;
  double v;
  double temperature;
  uint8 temperature1,temperature2,temperature3;
  uint8 avgV0,avgV1,avgV2,avgV3;
  uint8 avgvcc0,avgvcc1,avgvcc2,avgvcc3;
  
  SystemClockSourceSelect(XOSC_32MHz);
  InitLed();
  HalLcd_HW_Init(pic2);
  IEN0=IEN1=IEN2=0X00;
  HalAdcInit();
  Delay(60000);Delay(60000);Delay(60000);
  Display_Picture(pic3);
  while(1)
  {
    avgTemp = 0;
    avgVcc3 =0;

    TR0=0X01;//连接温度传感器到SOP-ADC
    ATEST=0X01;//使能温度传感器
    for(i = 0 ; i < 4 ; i++)//取四次值求和
    {
      avgVcc3 += HalAdcRead (HAL_ADC_CHN_VDD3, HAL_ADC_RESOLUTION_12);//获取电源电压
      avgTemp += HalAdcRead (HAL_ADC_CHN_TEMP, HAL_ADC_RESOLUTION_12);
    }
    TR0=0X00;//断开温度传感器到SOP-ADC
    ATEST=0X00;//使能温度传感器无效
    avgTemp >>= 2;//avgTemp右移2位相当于除以4,取平均
    temperature=(avgTemp-(1480-4.5*25))/4.5;//计算出温度值

    avgVcc3 >>= 2;//avgVcc3右移2位相当于除以4,取平均
    v3=1.15*avgVcc3/2047;//1/3电压
    v=v3*3.0;//电源电压
    Delay(20000);

    temperature = temperature*10;//将温度先乘10
    temperature1 = (uint16)temperature/100;//将温度十位赋值给temperature1
    temperature2 = (uint16)temperature%100/10;//将温度个位赋值给temperature2
    temperature3 = (uint16)temperature%10;//将温度十分位赋值给temperature3

    v3 = v3*1000;//将1/3电压先乘1000
    avgV0 = (uint16)v3/1000;//将1/3电压个位赋值给avgV0
    avgV1 = (uint16)v3%1000/100;//将1/3电压十分位赋值给avgV1
    avgV2 = (uint16)v3%1000/10%10;//将1/3电压百分位赋值给avgV2
    avgV3 = (uint16)v3%1000%100%10;//将1/3电压千分位赋值给avgV3

    v = v*1000;//将电源压先乘1000
    avgvcc0 = (uint16)v/1000;//将电源电压个位赋值给avgvcc0
    avgvcc1 = (uint16)v%1000/100;//将电源电压十分位赋值给avgvcc1
    avgvcc2 = (uint16)v%1000/10%10;//将电源电压百分位赋值给avgvcc2
    avgvcc3 = (uint16)v%1000%100%10;//将电源电压千分位赋值给avgvcc3

    LCDDataShow(temperature1,2,3,82,89);//显示温度
    LCDDataShow(temperature2,2,3,90,97);
    LCDDataShow(temperature3,2,3,99,106);

    LCDDataShow(avgV0,4,5,75,82);//显示1/3电源电压
    LCDDataShow(avgV1,4,5,83,90);
    LCDDataShow(avgV2,4,5,91,98);
    LCDDataShow(avgV3,4,5,99,106);

    LCDDataShow(avgvcc0,6,7,73,80);//显示电源电压
    LCDDataShow(avgvcc1,6,7,83,90);
    LCDDataShow(avgvcc2,6,7,91,98);
    LCDDataShow(avgvcc3,6,7,99,106);

    Delay(60000);
  }
}

完整代码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天地神仙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值