CC2530A/D转换

实例:将1/3的的电压值通过ADC转化为数字信号,再将其通过串口信号发送到PC

·(芯片内部ADC,寄存器相对少一些)

·设置ADC的源电压为1/3电源电压(电源电压为3.3v),因此大概为1.1v。

·然后通过CC2530的ADC功能将获得模拟的电压值,通过相应公式转换为数字信号

·再由串口将数字信号打印到PC终端上

一、寄存器配置

①ADCCON1——ADC控制1

`EOC[7]:  转换完成,该位赋值为1,读取ADCH时,他就被清除。(开启转换后每次判断该位是否为1。想要清除该为,需要读取ADCH)

`ST[6]:开启转换,设置该位为1,前提是STSEL[5:4]的位为11。

`STSEL[5:4]:开启转换事件

 因此想开启一个A/D转换就设置:ADCCON1 |=0x40;//启动A/D

(0x40, -> 0100 0000, |= 就是让6位设为1,其他位不变)

关闭A/D转换就设置:ADCCON1 &=~0x40;

(~0x40, -> 0100 0000->取反1011 1111,&=就是6位设为0,其他位不变)

②ADCCON3——ADC控制3

· ECH[3:0] :选择ADC触发的单个转换所在的通道号,本例选择VDD5  /3,设该位为1111。

(单个通道选择。选择ADCCON3触发的单个转换所在的通道号码。当单个转换完成,该位自动清除)

· EDIV[5:4]:设置抽取率,即设精度位12位,设该位为11。

·EREF[7:6] :选择用于额外转换的参考电压。本例选择AVDD5引脚,该位设为10

因此设置ADCCON3 = 0xbf;        (1011 1111,即十六进制的0xbf)

③ADCL、ADCH 数据低、高位寄存器

·ADCL:0、1位无效的,没有使用读出来一直是0。2到7位对应的是ADC转换结果真正的值的0到5位

 ·ADCH:0到7位对应ADC转换结果的高位部分6到13位

二、ADC驱动编写步骤

1、清除EOC标志       ->读取ADCH

2、设置参考电源电压、抽取率、ADC通道        ->设置ADCCON3

3、是能A/D转换        ->设置ADCCON1

4、等待转换完毕       

->等待转换完毕,由于转换完成,则ADCCON1的最高位第七位会被赋值为1,因此通过判断ADCCON1的最高位是否设置为1了,即while(!(ADCCON1&0x80);

5、读取数据        ->读取ADCL/ADCH 这两个寄存器的值

6、转换成模拟值        ->根据前面设置的抽取率来进行转换

 三、编写代码

void InitalAD(void)
{
    //初始化LED
    P1DIR = 0x03;    //P1控制LED
    led1 = 1;
    led2 = 1;    //关LED

    //ADC驱动编写
    ADCH &= 0x00;    //通过读取ADCH,清除EOC标志
    ADCCON3 = 0xbf;    //通过设置ADCCON3寄存器,其中6、7位设置为:10,参考电源电压AVDD5。其中4、5位设置为:11,抽取率为512。其中0到3位设置为:1111,ADC通道选择VDD/3。
即1011 1111-> 0xbf
    //使能转换A/D
    ADCCON1 = 0X30; //0011 0000 (DEC:48),A/D状态仍是停止,只是启动了选择,设置了STSEL的位
    ADCCON1 |= 0x40; //0100 0000 (DEC:64),启动A/D
}

//循环读取ADC数据
while(1)
{
    //判断转换是否完成,即ADCCON1高位(第七位)是否设置为1,如果ADCCON1 >=0x80那么第七位肯定设为1,转换完成
    if(ADCCON1>=0x80)
    {
        led1 = 1;   //转换完毕指示
        //读取数据(拼接数据)
        reading = ADCL;
        reading = ADCH << 8;
        reading >>= 2;
        ADCCON1 = 0x40; //开启下一次转换

        //转换为模拟值
        num = (float)(reading)*3.3/8192;    //定参考电压为3.3v,切分份数8192,读取的值除以8192得到所占比例,再乘以3.3得到模拟值
        //通过串口发送给PC
        sprintf(strTemp,"vol:%.02fv",num);    //将模拟值存到了字符串中。%.02f :小数点后精确带2位,不足位补0
        UartSendString(strTemp,12);    //串口送数
        
        DelayMS(1000);
        led1 = 1;    //完成数据处理
        DelayMS(1000);
    }

}

完整代码:

	/****************************************************************************
* 文 件 名: main.c
* 描    述: 将 1/3 电压值通过 ADC 转换为数字信号,再将其通过串口发送到 PC
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "UartTimer.h"


//定义控制灯的端口
#define led1 P1_0
#define led2 P1_1
#define BEEP P0_0        //定义P0.0定义为蜂鸣器控制口
/****************************************************************************
* 名    称: InitBeep()
* 功    能: 初始化蜂鸣器,默认关闭
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitBeep(void)
{
	P0DIR |= 0x01;    //P0.0定义为输出口 
	BEEP = 0;        //蜂鸣器灭
}
/****************************************************************************
* 名    称: InitSensor()
* 功    能: AD初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/ 
void InitialAD(void)
{
	P1DIR = 0x03; //P1 控制 LED
	led1 = 1;
	led2 = 1; //关 LED

	ADCH &= 0X00; //清 EOC 标志 ADCCON1.EOC位是一个状态位,当一个转换结束时,设置为高电平;当读取ADCH时,它就被清除。 
	ADCCON3=0xbf; //单次转换,参考电压为电源电压,对 1/3 VDD 进行 A/D 转换
	//14 位分辨率bf
	ADCCON1 = 0X30; //停止 A/D
	ADCCON1 |= 0X40; //启动 A/D
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void) 
{   
	char temp[2];
	float num;  
    char strTemp[12]={0};
	unsigned short reading;

	InitBeep();
	DISABLE_ALL_INTERRUPTS();     //关闭所有中断 
	InitClock();                  //设置系统主时钟为 32M 
    InitUART();                           //初始化串口 
    InitialAD();
    
	led1 = 1;
//10bite   
	ADCCON3=0xaf;

    while(1)
    {
      if(ADCCON1>=0x80)
      {
		led1 = 0; //转换完毕指示  
		  
 		 reading = ADCL;
  		 reading |= ADCH << 8; 
  		 reading >>= 5;
         ADCCON1 |= 0x40; //开始下一转换
	
		
        num = (float)(reading)*3.3/1024; //有一位符号位,取 2^10;
        //定参考电压为 3.3V。 14 位精确度
 	
		sprintf(strTemp,"vol:%.02fV", num);//将浮点数转成字符串
        UartSendString(strTemp,12); //串口送数
        //包括空格
        DelayMS(1000);
		led1 = 1; //完成数据处理
		DelayMS(1000);
      }
    }

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是使用 CC2530 单片机控制蜂鸣器播放音乐的代码示例: ```c #include <ioCC2530.h> // 定义蜂鸣器所使用的 IO 口 #define BEEPER_PORT P0_2 // 定义音符对应的频率数组 const uint16_t notes[] = { 262, 294, 330, 349, 392, 440, 494, 523 }; // 定义音符持续时间数组(单位:毫秒) const uint16_t durations[] = { 500, 500, 500, 500, 500, 500, 500, 500 }; // 定义播放音乐的函数 void playMusic() { uint8_t i; // 遍历音符数组 for (i = 0; i < 8; i++) { // 设置蜂鸣器的频率 BEEPER_PORT = 1; delay_us(1000000 / notes[i] / 2); BEEPER_PORT = 0; delay_us(1000000 / notes[i] / 2); // 暂停一段时间 delay_ms(durations[i]); } } void main() { // 初始化蜂鸣器 IO 口为输出模式 P0DIR |= BIT2; // 循环播放音乐 while (1) { playMusic(); } } ``` 上面的代码中定义了两个数组,分别存储了不同音符的频率和持续时间。在 `playMusic()` 函数中,通过循环遍历这两个数组,使用蜂鸣器的 IO 口输出高低电平来控制蜂鸣器的声音。在主函数中,设置蜂鸣器的 IO 口为输出模式,然后循环调用 `playMusic()` 函数来 ### 回答2: 以下是使用CC2530单片机的蜂鸣器播放音乐的一个简单的示例代码: #include <ioCC2530.h> // 定义蜂鸣器控制引脚 #define BUZZER P0_7 // 定义音符频率 #define C4 262 #define D4 294 #define E4 330 #define F4 349 #define G4 392 #define A4 440 #define B4 494 #define C5 523 // 定义音符时长(以毫秒为单位) #define Q 400 // 四分音符 #define H 800 // 二分音符 #define W 1600 // 全音符 // 延时函数,用于控制音符播放的时长 void delay(unsigned int t) { while(t--); } // 控制蜂鸣器播放音符 void playNote(unsigned int frequency, unsigned int duration) { unsigned long period; unsigned int i; period = 500000 / frequency; // 以500KHz的频率采样音符 for (i = 0; i < duration * (frequency / 1000); i++) { BUZZER = 1; // 高电平使蜂鸣器发声 delay(period / 2); BUZZER = 0; // 低电平静音 delay(period / 2); } } // 主函数 void main() { P0DIR |= 0x80; // 将P0_7设为输出模式 // 播放音乐 C-D-E-F-G-A-B-C5 playNote(C4, Q); playNote(D4, Q); playNote(E4, Q); playNote(F4, Q); playNote(G4, Q); playNote(A4, Q); playNote(B4, Q); playNote(C5, Q); } 在这个示例代码中,我们先定义了蜂鸣器控制引脚为P0_7,然后定义了一些音符的频率和时长。在主函数中,我们通过循环调用playNote函数来播放音乐。每次调用playNote函数时,它会根据传入的音符频率和时长控制蜂鸣器发出声音。在每次发声之后,通过延时函数控制音符的时长。最后,在主函数中调用playNote函数来播放C-D-E-F-G-A-B-C5这几个音符。 ### 回答3: CC2530是一款常用于物联网应用的单片机,它具备较低的功耗和丰富的外设接口。要利用CC2530的蜂鸣器播放音乐,可以采用PWM(脉宽调制)技术。 首先,需要在CC2530的开发环境中添加对蜂鸣器的支持。查找CC2530的数据手册,了解相应的IO口和寄存器地址。 接下来,编写C语言代码来实现蜂鸣器的音乐播放功能。以下是一个简单示例代码: ```c #include <cc2530.h> #define BEEP_PIN 0x0A // 定义蜂鸣器所连接的IO口号 const unsigned int note[] = { // 定义音符频率数组 262, 294, 330, 349, 392, 440, 494, 523 }; void delay_ms(unsigned int ms) { unsigned int i; while(ms--) { for(i=0; i<535; i++); } } void beep(unsigned int noteIndex, unsigned int duration) { unsigned int halfPeriod; halfPeriod = 1000000 / note[noteIndex]; // 计算音符的半周期 duration *= 1000; // 将持续时间转换为微秒 P0SEL &= ~(1 << BEEP_PIN); // 设置蜂鸣器所连接的IO口为普通IO口 P0DIR |= (1 << BEEP_PIN); // 将蜂鸣器所连接的IO口设置为输出 while(duration) { P0 ^= (1 << BEEP_PIN); // 翻转蜂鸣器所连接的IO口电平 delay_ms(halfPeriod / 1000); // 延时半个周期 duration -= halfPeriod; // 减去一个半周期的时间 } P0 &= ~(1 << BEEP_PIN); // 将蜂鸣器所连接的IO口电平置低 P0DIR &= ~(1 << BEEP_PIN); // 将蜂鸣器所连接的IO口设置为输入 } void main(void) { unsigned int melody[] = { // 定义音乐旋律 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0 }; unsigned int i; for(i=0; i<sizeof(melody)/sizeof(melody[0]); i++) { beep(melody[i], 200); // 播放音符,持续200毫秒 delay_ms(100); // 暂停100毫秒 } while(1); } ``` 上述代码通过PWM技术,实现了在CC2530上播放简单音乐的功能。首先定义了音符频率数组和一个延时函数,然后通过beep函数来控制蜂鸣器的运行。最后在主函数中定义了一段旋律,并通过循环依次播放每个音符。 在编译、下载程序到CC2530后,蜂鸣器将按照代码中定义的旋律进行播放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值