单片机CC2530串口通信读取字节以下代码

单片机CC2530串口通信读取字节以下代码,第1张

1、U0BDUF是硬件至1,串口由接收到数据,2530自动将此位置1,所以,你只需要判断,这个U0BDUF为1了,那就是代表串口接收到数空吵据了。

2、2个if判断,第一个的作用旁亏闭是判断是否接收到完整的一帧(3个字节),如果没接收满,则继续堆到buff_RxDat数组中,第二个if,是对完整帧的处理,看代码,你的一个完整帧有3个字节,以“#”开头,后面接一个灯的序号,再接一个灯的状态,就是说,buff_RxDat[1]选择要控制那个灯运裂,buff_RxDat[2]选择灯是亮还是灭

3、没错,当单片机的串口一旦接收到东西后,会立刻进入中断,但是,你的这个程序,不是采用中断查询,而是轮询的,就是主函数一直在判断U0BDUF位有没有被置1,置1了才进去接收,这种方式跟中断机制有本质不同,你可以写一个中断函数,然后就不需要main函数一直去查询,而可以去干些别的任务

可以用以下方法来解决问题:

1.设计一个端口初始化函数,对端口的功能进行配置,LED相关的端口设置为输出,按键相关的端口设置为输入,并且配置成上拉模式。

2.在主函数中不断扫描按键端口的变化,没有李斗返按键按下,该端口为高电平,如果有按键按下,则为低电平。当发现按键端口有低电平时,先要进行去抖动处理。

3.因为一个按键有“开灯”和“关灯”两种状态,需要定义一个按键状态的全局变量来处理按键按下的时候,应该哪饥是亮LED还是关LED。

CC2530微控制器采用QFN40封装,有40个引脚。其中,有21个数字I/O端口,其中P0和P1是8位端口,P2仅有5位可以使用。这21个端口均可以通过编程进行配置。实际上,在P2端口的5个引脚中,有2个需要用销好作仿真,有2个需要用作晶振,你在CC2530的开发中真正能够使用的只有17个引脚。

#ifndef ULTRASOUND_H

#define ULTRASOUND_H

#define uchar unsigned char

#define uint unsigned int

#define TRIG P1_3//P1_2

#define ECHO P0_7//P0_1

extern uchar RG

extern uchar H1

extern uchar L1

extern uchar H2

extern uchar L2

extern uchar H3

extern uchar L3

extern uint data

extern float distance

extern uchar LoadRegBuf[4]

//void Delay(uint n)

void Delay_1us(uint microSecs)

void Delay_10us(uint n)

void Delay_1s(uint n)

void SysClkSet32M()

void Init_UltrasoundRanging()

void UltrasoundRanging(uchar *ulLoadBufPtr)

__interrupt void P0_ISR(void)

#endif

×××××××××××××××××××××××××××××××××××××××××××

//×××××××××××Ultrasound.c****************************

#include <ioCC2530.h>

#include "Ultrasound.h"

uchar RG

uchar H1

uchar L1

uchar H2

uchar L2

uchar H3

uchar L3

uint data

float distance

uchar LoadRegBuf[4]//全局数据,用以存储定时计数器的值扒谨。

void Delay_1us(uint microSecs)

{ while(microSecs--)

{/* 32 NOPs == 1 usecs 因为延时还有计算的缘故,用了31个nop*/

asm("nop")asm("nop")asm("nop")asm("nop")asm("御宴nop")

asm("nop")asm("nop")asm("nop")asm("nop")asm("nop")

asm("nop")asm("nop")asm("nop")asm("nop")asm("nop"镇此银)

asm("nop")asm("nop")asm("nop")asm("nop")asm("nop")

asm("nop")asm("nop")asm("nop")asm("nop")asm("nop")

asm("nop")asm("nop")asm("nop")asm("nop")asm("nop")

asm("nop")

}

}

void Delay_10us(uint n)

{ /* 320NOPs == 10usecs 因为延时还有计算的缘故,用了310个nop*/

uint tt,yy

for(tt = 0tt<ntt++)

for(yy = 310yy>0yy--)

{asm("NOP")}

}

void Delay_1s(uint n)

{ uint ulloop=1000

uint tt

for(tt =n tt>0tt--)

for( ulloop=1000ulloop>0ulloop--)

{

Delay_10us(100)

}

}

void SysClkSet32M()

{

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

while(CLKCONSTA &0x40)//等待晶振稳定

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

//此时的CLKCONSTA为0x88。即普通时钟和定时器时钟都是32M。

}

void Init_UltrasoundRanging()

{

P1DIR = 0x08//0为输入1为输出 00001000 设置TRIG P1_3为输出模式

TRIG=0 //将TRIG 设置为低电平

P0INP &= ~0x80 //有上拉、下拉 有初始化的左右

P0IEN |= 0x80 //P0_7 中断使能

PICTL |= 0x01 //设置P0_7引脚,下降沿触发中断

IEN1 |= 0x20 // P0IE = 1

P0IFG = 0

}

void UltrasoundRanging(uchar *ulLoadBufPtr)

{

SysClkSet32M()

Init_UltrasoundRanging()

EA = 0

TRIG =1

Delay_1us(10)//需要延时10us以上的高电平

TRIG =0

T1CNTL=0

T1CNTH=0

while(!ECHO)

T1CTL = 0x09 //通道0,中断有效,32分频自动重装模式(0x0000->0xffff)

L1=T1CNTL

H1=T1CNTH

*ulLoadBufPtr++=T1CNTL

*ulLoadBufPtr++=T1CNTH

EA = 1

Delay_10us(60000)

Delay_10us(60000)

}

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)

{

EA=0

T1CTL = 0x00

LoadRegBuf[2]=T1CNTL

LoadRegBuf[3]=T1CNTH

L2=T1CNTL

H2=T1CNTH

if(P0IFG&0x080) //外部ECHO反馈信号

{

P0IFG = 0

}

T1CTL = 0x09

T1CNTL=0

T1CNTH=0

P0IF = 0//清中断标志

EA=1

}

××××××××××××××××××××××××××××××××××××××

#include <ioCC2530.h>

#include "Ultrasound.h"

void main(void)

{

while(1)

{

UltrasoundRanging(LoadRegBuf)

Delay_1s(1)

data=256*H2+L2-L1-256*H1

distance=(float)data*340/10000

Delay_1s(2)

}

}


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

原文地址: http://outofmemory.cn/yw/12519467.html

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

发表评论

登录后才能评论

评论列表(0条)

保存