(3)UART 发送与接收
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告3
1.实验名称:UART发送与接收
2.实验原理:以UART方式设置串口,当有数据发送时触发中断,进入中断程序。
3.实验结果:
实现CC2530通过串口向PC机串口发送字符串“What is your name?”,电脑向CC2530发送名字,名字以#号结束,CC2530向串口发送字符串”HELLO”+名字。
{
if(RXTXflag==1)
{
if(temp!=0)
{
if((temp!='#')&&(datanumber<20))
Recdata[datanumber++]=temp;
else
RXTXflag=3;
temp=0;
}
}
if(RXTXflag==3)
{
U0CSR&=~0x40;
UartTX_Send_String(str2,6);
输出0V和1V。实验成功。
#define led1 P1_0
#define led2 P1_1
void Delay(uint);
void InitialAD(void);
void initUARTO(void);
void UartTX_Send_String(char *Data,int len);
char adcdata[]=" 0.0V ";
void initUARTO(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
uchar str1[20]="What is your name?";
uchar str2[7]="HELLO";
uchar Recdata[20];
UartTX_Send_String(Recdata,datanumber);
U0CSR |=0x40;
RXTXflag=1;
datanumber=0;
}
}
}
//串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp
#pragma vector=URX0_VECTOR
temp[1] |= temp[0]<<6;
temp[0] = temp[0]>>2;
temp[0] &= 0x3f;
num = (temp[0]*256+temp[1])*3.3/4096; //12位,取2^12;
num = num/2+0.05; //四舍五入处理
//定参考电压为3.3V。12位精确度
uchar RXTXflag=1;
uchar temp;
uint datanumber=0;
uint stringlen;
//初始化串口0函数
void initUARTO(void)
{
CLKCONCMD &=~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &=~0x47;
initUARTO();
led1 = 1;
int n=1;
while(n)
{
if(ADCCON1>=0x80)
{
led1 = 1;//转换完毕指示
temp[1] = ADCL;
temp[0] = ADCH;
ADCCON1 |= 0x40;//开始下一转换
temp[1] = temp[1]>>2; //数据处理
U0CSR|=0x40;
IEN0|=0x84;
}
//串口发送字符串函数
void UartTX_Send_String(char *Data,int len)
{
uint j;
for(j=0;j<len;j++)
{
U0DBUF=*Data++;
while(UTX0IF==0);
UTX0IF=0;
}
}
/****************************************************************
*函数功能:初始化ADC*
*入口参数:无*
*返回值:无*
*说明:参考电压AVDD,转换对象是AVDD*
****************************************************************/
void InitialAD(void)
{
P1DIR = 0x03;//P1控制LED
4.实验改进需求:
输出0V和1V
5.代码:
原始代码:
#include<ioCC2530.h>
#include<string.h>
#define led1 P1_0
#define led2 P1_1
#define uint unsigned int
#define uchar unsigned char
*函数功能:主函数*
*入口参数:无*
*返回值:无*
*说明:无*
****************************************************************/
void main(void)
{
char temp[2];
float num;
InitialAD(); //初始化ADC
PERCFG=0x00;
P0SEL=0x3c;
P2DIR&=~0xc0;
U0CSR|=0x80;
U0GCR|=9;
U0BAUD|=59;
UTX0IF=1;
U0CSR|=0x40;
IEN0|=0x84;
}
//串口发送字符串函数
void UartTX_Send_String(uchar *Data,int len)
led1 = 1;
led2 = 1;//关LED
ADCCON1 &= ~0X80;//清EOC标志
ADCCON3=0xbf;//单次转换,参考电压为电源电压,对1/3 AVDD进行A/D转换
//12位分辨率
ADCCON1 = 0X30;//停止A/D
ADCCON1 |= 0X40;//启动A/D
}
//初始化串口0函数
/****************************
//延时函数
*****************************/
void Delay(uint n)
{
uint i,t;
for(i = 0;i<5;i++)
for(t = 0;t<n;t++);
}
/****************************************************************
adcdata[1] = (char)(num)%10+48;
adcdata[3] = (char)(num*10)%10+48;
UartTX_Send_String(adcdata,5);
Delay(30000);
led1 = 0; //完成数据处理
Delay(30000);
n=0;
}
}
}
6.更改代码之后的结果:
void initUARTO(void)
{
CLKCONCMD &=~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &=~0x47;
PERCFG=0x00;
P0SEL=0x3c;
P2DIBiblioteka Baidu&=~0xc0;
U0CSR|=0x80;
U0GCR|=9;
U0BAUD|=59;
UTX0IF=1;
__interrupt void UARTO_ISR(void)
{
URX0IF=0;
temp=U0DBUF;
}
改进后代码:
#include "ioCC2530.h"
#include<string.h>
#define uint unsigned int
#define ConversionNum 20
//定义控制灯的端口
{
uint j;
for(j=0;j<len;j++)
{
U0DBUF=*Data++;
while(UTX0IF==0);
UTX0IF=0;
}
}
//主函数
void main(void)
{
P1DIR=0x03;
initUARTO();
UartTX_Send_String(str1,20);
while(1)
1.实验名称:UART发送与接收
2.实验原理:以UART方式设置串口,当有数据发送时触发中断,进入中断程序。
3.实验结果:
实现CC2530通过串口向PC机串口发送字符串“What is your name?”,电脑向CC2530发送名字,名字以#号结束,CC2530向串口发送字符串”HELLO”+名字。
{
if(RXTXflag==1)
{
if(temp!=0)
{
if((temp!='#')&&(datanumber<20))
Recdata[datanumber++]=temp;
else
RXTXflag=3;
temp=0;
}
}
if(RXTXflag==3)
{
U0CSR&=~0x40;
UartTX_Send_String(str2,6);
输出0V和1V。实验成功。
#define led1 P1_0
#define led2 P1_1
void Delay(uint);
void InitialAD(void);
void initUARTO(void);
void UartTX_Send_String(char *Data,int len);
char adcdata[]=" 0.0V ";
void initUARTO(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
uchar str1[20]="What is your name?";
uchar str2[7]="HELLO";
uchar Recdata[20];
UartTX_Send_String(Recdata,datanumber);
U0CSR |=0x40;
RXTXflag=1;
datanumber=0;
}
}
}
//串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp
#pragma vector=URX0_VECTOR
temp[1] |= temp[0]<<6;
temp[0] = temp[0]>>2;
temp[0] &= 0x3f;
num = (temp[0]*256+temp[1])*3.3/4096; //12位,取2^12;
num = num/2+0.05; //四舍五入处理
//定参考电压为3.3V。12位精确度
uchar RXTXflag=1;
uchar temp;
uint datanumber=0;
uint stringlen;
//初始化串口0函数
void initUARTO(void)
{
CLKCONCMD &=~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &=~0x47;
initUARTO();
led1 = 1;
int n=1;
while(n)
{
if(ADCCON1>=0x80)
{
led1 = 1;//转换完毕指示
temp[1] = ADCL;
temp[0] = ADCH;
ADCCON1 |= 0x40;//开始下一转换
temp[1] = temp[1]>>2; //数据处理
U0CSR|=0x40;
IEN0|=0x84;
}
//串口发送字符串函数
void UartTX_Send_String(char *Data,int len)
{
uint j;
for(j=0;j<len;j++)
{
U0DBUF=*Data++;
while(UTX0IF==0);
UTX0IF=0;
}
}
/****************************************************************
*函数功能:初始化ADC*
*入口参数:无*
*返回值:无*
*说明:参考电压AVDD,转换对象是AVDD*
****************************************************************/
void InitialAD(void)
{
P1DIR = 0x03;//P1控制LED
4.实验改进需求:
输出0V和1V
5.代码:
原始代码:
#include<ioCC2530.h>
#include<string.h>
#define led1 P1_0
#define led2 P1_1
#define uint unsigned int
#define uchar unsigned char
*函数功能:主函数*
*入口参数:无*
*返回值:无*
*说明:无*
****************************************************************/
void main(void)
{
char temp[2];
float num;
InitialAD(); //初始化ADC
PERCFG=0x00;
P0SEL=0x3c;
P2DIR&=~0xc0;
U0CSR|=0x80;
U0GCR|=9;
U0BAUD|=59;
UTX0IF=1;
U0CSR|=0x40;
IEN0|=0x84;
}
//串口发送字符串函数
void UartTX_Send_String(uchar *Data,int len)
led1 = 1;
led2 = 1;//关LED
ADCCON1 &= ~0X80;//清EOC标志
ADCCON3=0xbf;//单次转换,参考电压为电源电压,对1/3 AVDD进行A/D转换
//12位分辨率
ADCCON1 = 0X30;//停止A/D
ADCCON1 |= 0X40;//启动A/D
}
//初始化串口0函数
/****************************
//延时函数
*****************************/
void Delay(uint n)
{
uint i,t;
for(i = 0;i<5;i++)
for(t = 0;t<n;t++);
}
/****************************************************************
adcdata[1] = (char)(num)%10+48;
adcdata[3] = (char)(num*10)%10+48;
UartTX_Send_String(adcdata,5);
Delay(30000);
led1 = 0; //完成数据处理
Delay(30000);
n=0;
}
}
}
6.更改代码之后的结果:
void initUARTO(void)
{
CLKCONCMD &=~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &=~0x47;
PERCFG=0x00;
P0SEL=0x3c;
P2DIBiblioteka Baidu&=~0xc0;
U0CSR|=0x80;
U0GCR|=9;
U0BAUD|=59;
UTX0IF=1;
__interrupt void UARTO_ISR(void)
{
URX0IF=0;
temp=U0DBUF;
}
改进后代码:
#include "ioCC2530.h"
#include<string.h>
#define uint unsigned int
#define ConversionNum 20
//定义控制灯的端口
{
uint j;
for(j=0;j<len;j++)
{
U0DBUF=*Data++;
while(UTX0IF==0);
UTX0IF=0;
}
}
//主函数
void main(void)
{
P1DIR=0x03;
initUARTO();
UartTX_Send_String(str1,20);
while(1)