求大神修改zigbee加减法
zigbee吧
全部回复
仅看楼主
level 1
_WoodRow 楼主
二、课程设计的要求与数据
通过PC与Zigbee模块(CC2530)的串口通信来完成四位数(包括正数和负数)的加减法运算。PC通过串口把所需要做加减运算的两个四位数值发送给Zigbee模块,同时接收来自Zigbee模块的运算结果(范围在[-9999,9999])并显示出来;Zigbee模块完成具体的加减运算,同时将完成运算的结果通过串口发送给上位机。
三、课程设计应完成的工作
1、给出系统的框图,并描述其工作原理;
2、实现字符串与数值之间的转换,同时要明晰原理;
3、电脑与Zigbee模块(CC2530)之间完成串口通信(可以是裸机串口通信,也可以尝试基于协议栈的串口通信);
4、能够实现所发送字符串自定义结束符(=)的检测与识别;
5、能够检测到运算输入表达式格式的错误(数值超过规定范围[-9999,9999]也纳入输入错误的范围)并通过串口通信作出提示;
/**************************************/
/* WeBee团队 */
/* Zigbee学习例程 */
/*例程名称:串口通讯2 */
/*建立时间:2012/06/5 */
/*描述:例以abc
#方式发送,#
为结束符,
返回abc。波特率:115200
bp
s
**************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
//定义控制LED灯的端口
#define LED1 P1_0//定义LED1为P10口控制
#define LED2 P1_1
//函数声明
void Delayms(uint xms);//延时函数
void InitLed(void);//初始化P1口
void InitUart(); //初始化串口
void Uart_Send_String(char *Data,int len);
char Rxdata[50];
uchar RXTXflag = 1;
char temp;
uchar datanumber = 0;
uchar i=0;
int flag=0;
uchar addent=0;
uchar augent=0;
uchar sum=0;
char disp[6]={0,0,0,0,0x0A,0x0D};
uchar fuhao_flag;
/****************************
延时函数
*****************************/
void Delayms(uint xms) //i=xms 即延时i毫秒 (16M晶振时候大约数,32M需要修改,系统不修改默认使用内部16M)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/****************************
//初始化程序
*****************************/
void InitLed(void)
{
P1DIR |= 0x03; //P1_0、P1_1定义为输出
LED1 = 0; //LED1灯熄灭
LED2=0;
}
/****************************************************************
串口初始化函数
***********************************************************/
void InitUart()
{
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口,第二功能
P2DIR &= ~0XC0; //P0 优先作为UART0 ,优先级
U0CSR |= 0x80; //UART 方式
U0GCR |= 11; //U0GCR与U0BAUD配合
U0BAUD |= 216; // 波特率设为115200
UTX0IF = 0; //UART0 TX 中断标志初始置位1 (收发时候)
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; // 开总中断,接收中断
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void Uart_Send_String(char *Data,int len)
{
{
int j;
for(j=0;j=0x30)&&(Rxdata[i]<=0x39))
{
switch(flag)
{
case 0 :addent=addent*10+(Rxdata[i]-0x30);break;
case 1 :augent=augent*10+(Rxdata[i]-0x30);break;
}
}
else if (Rxdata[i]=='+') {flag=1;fuhao_flag=2;}
else if (Rxdata[i]=='-') {flag=1;fuhao_flag=3;}
else
{
Uart_Send_String("input error!\n",sizeof("input error!\n"));
datanumber=0;
RXTXflag=1;
addent=0;
augent=0;
flag=0;
return;
}
}
// if(sum在0-9999的范围)
//{
// }
// else if(sum在-9999-0的范围)
// {
// }
// else
// {//计算结果溢出
// }
switch(fuhao_flag)
{
case 2:sum=addent+augent;break;
case 3:sum=addent-augent;break;
}
if(((sum>0)||(sum==0))&&(sum<100000))
{
disp[0]=0x2b;
for(i=5;i>0;i--)
{
disp[i]=sum%10+0x30;
sum=sum/10;
}
}
else if ((sum>(-100000))&&(sum<0))
{
sum=0xffffffff+1-sum;
disp[0]=0x2d;
for(i=5;i>0;i--)
{
disp[i]=sum%10+0x30;
sum=sum/10;
}
}
else
{
Uart_Send_String("calcution overflow error!\n",sizeof("calcution overflow error"));
}
}
temp = 0;
}
}
if(RXTXflag == 3) //发送状态
{
LED2= 1;
U0CSR &= ~0x40; //禁止接收
Uart_Send_String(disp,6); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
RXTXflag = 1; // 恢复到接收状态
datanumber = 0; //指针归0
LED2 = 0; //关发送指示
}
}
}
/****************************************************************
串口接收一个字符: 一旦有数据从串口传至CC2530, 则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
temp = U0DBUF;
}
2015年01月05日 04点01分 1
level 1
_WoodRow 楼主
2020年12月29日 04点12分 2
level 1
_WoodRow 楼主
https://nuts10车.app
2020年12月29日 04点12分 4
1