51单片机(CC2530)发送按键次数到串口助手显示 实现功能:按1次按键 串口助手显示1 再按一次 显示2 以此

51单片机(CC2530)发送按键次数到串口助手显示 实现功能:按1次按键 串口助手显示1 再按一次 显示2 以此,第1张

你先一步一步的实验,单独的进行按键测试,先按键跟数码管一起,按键按一下,数码管数值加1,看看是不是达到你想要的目的,然后,进行串口通信, 串口助手发送,单片机接收,然后单片机发送一个数值给串口助手。 两个都完成,然后再结合到一起去, 我不知道你的程序有什么问题,但是尽量不要用delay函数,可以用定时器进行按键的扫描 和 串口定时发送数据

是有osalTimeUpdate()和Hal_ProcessPoll()这两个函数。

cc2530中OSALAPI接口函数:

信息管理API

osal_msg_allocate( )函数原型:任务是分配一个信息缓冲区,当任务调用或函数被调用时,该空间被信息填充或调用信息发送函数osal_msg_send() 发送缓冲空间的信息到其他任务,若该缓冲空间不能被分配,则设置msg_ptr=NULL空;

uint8 osal_msg_allocate( uint16 len ),返回的是指针,若返回为空,则该信息缓存空间分配失败。

注:该函数不能与osal_mem_alloc()混淆,osal_mem_alloc()函数是用于为在任务间发送信息分配缓冲区。该函数可以分配一个存储空间。

因为有一些需要由客户自己指定的数据,如WIFI的网络名、密码等,不能固定在下载程序中,所以可以使用NV,由用户自己确定。

NV *** 作主要实际下面三个函数:osal_nv_item_init、osal_nv_write、osal_nv_read

关于cc2530NV读取的简单代码例子:

需要注意的是,虽然NV可写入地址范围从 0x0401 – 0x0FFF,但是一定要注意,地址应该是 %4=1,如:0x401为十进制1025,1025%4=1;不能是%4=0,至于为什么是%4,可以参照cc2530手册。

另外在某地址第一次读写时,结果可以使用!=SUCCESS来判断,但如果这个地址已经被初始化过并写入过数据,再一次被初始化过,如果还是用!=SUCCESS是不行的,因为此时即使没数据,但读取也是SUCCESS!

#define PATHS_ID 0x0601

#define WIFI_NAME 0x0A01

#define WIFI_PWD 0x0A29

void writeNV(){

osal_nv_item_init(PATHS_ID ,1,NULL);//每次写入前必须先初始化

uint8 sfcsh=0;

uint8 su_b=osal_nv_write(PATHS_ID ,0,1,&sfcsh);//写入标志

uint8 su_n= osal_nv_item_init(WIFI_NAME,40,NULL);

uint8 su_p= osal_nv_item_init(WIFI_PWD,40,NULL);

if((su_b==SUCCESS)&&(su_n==SUCCESS)&&(su_p==SUCCESS)){

HalLcdWriteString("init _ok", HAL_LCD_LINE_1 );

}

}

uint8 readNV(){

uint8 pshuju;

uint8 yuu =osal_nv_read(PATHS_ID,0,sizeof(pshuju),pshuju);

if(yuu==SUCCESS){

if( pshuju==0)

{

return 0;

}else

{

return 1;

}

}

CC2430包括2个串行通信接口 USART0 与 USART1,每个串口包括两个模式:UART(异步)模式、SPI(同步)模式,本节仅涉及UART模式)。两个USART具有同样的功能,可以设置在单独的I/O 引脚

P0_2、P0_3配置为外设功能时:P0_2为RX, P0_3为TXUSART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式。两个USART具有同样的功能,可以设置在单独的I/O 引脚。

相关寄存器为UxCSR、UxCSR、UxGCR、UxBUF、UxBAUD、CLKCONCMD、CLKCONSTA,具体的参数参看datesheet。

CC2530配置串口的一般步骤:

1、 配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0

2、 配置相应串口的控制和状态寄存器。

3、 配置串口工作的波特率。

寄存器具体配置如下:

PERCFG = 0x00; //位置1 P0口

P0SEL = 0x0c; //P0_2,P0_3用作串口(外部设备功能)

P2DIR &= ~0XC0; //P0优先作为UART0

U0CSR |= 0x80; //设置为UART方式

U0GCR |= 11;

U0BAUD |= 216; //波特率设为115200 根据上面表中获得的数据

UTX0IF = 0; //UART0 TX 中断标志初始置位 0

/

描 述: 设置串口调试助手波特率:115200bps 8N1

会收到 CC2530 发过来的:Hello Zigbee

/

#include <ioCC2530h>

#include <stringh>

typedef unsigned char uchar;

typedef unsigned int uint;

#define TX_SIZE 20

#define TX_STRING "Hello Zigbee "

char TxData[TX_SIZE]; //存储发送字符串

/

名 称: DelayMS()

功 能: 以毫秒为单位延时

入口参数: msec 延时参数,值越大延时越久

出口参数: 无

/

void DelayMS(uint msec)

{

uint i,j;

for (i=0; i<msec; i++)

for (j=0; j<1070; j++);

}

/

名 称: InitUart()

功 能: 串口初始化函数

/

void InitUart(void)

{

PERCFG = 0x00; //外设控制寄存器 USART 0 的 IO 位置:0 为 P0 口位置 1

P0SEL = 0x0c; //P0_2,P0_3 用作串口(外设功能)

P2DIR &= ~0XC0; //P0 优先作为 UART0

U0CSR |= 0x80; //设置为 UART 方式

U0GCR |= 11;

U0BAUD |= 216; //波特率设为 115200

UTX0IF = 0; //UART0 TX 中断标志初始置位 0

}

/

名 称: UartSendString()

功 能: 串口发送函数

入口参数: Data:发送缓冲区 len:发送长度

出口参数: 无

/

void UartSendString(char Data, int len)

{

uint i;

for(i=0; i<len; i++)

{

U0DBUF = Data++;

while(UTX0IF == 0);

UTX0IF = 0;

}

}

/

程序入口函数

/

void main(void)

{

CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ 晶振

while(CLKCONSTA & 0x40); //等待晶振稳定为 32M

CLKCONCMD &= ~0x47; //设置系统主时钟频率为 32MHZ

InitUart(); //调置串口相关寄存器

memset(TxData, 0, TX_SIZE); //数据清 0

memcpy(TxData, TX_STRING, sizeof(TX_STRING));//复制发送字符串到 TxData

while(1)

{

UartSendString(TxData, sizeof(TX_STRING)); //串口发送数据

DelayMS(1000); //延时 1 秒

}

}

UTX0IF = 1; UART0发送完成标志位1

while(UTX0IF); //表示等待串口, 直到数据发送完成 如果用延时, 超过等待时间, 也行但不精确

UTX0IF = 0; 若串口数据发送完成,标志位清零。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12176982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存