(3)UART 发送与接收

(3)UART 发送与接收
(3)UART 发送与接收

实验报告3

1.实验名称:UART 发送与接收

2.实验原理:以UART方式设置串口,当有数据发送时触发中断,进入中断程序。

3.实验结果:

实现CC2530通过串口向PC机串口发送字符串“What is your name?”,电脑向CC2530发送名字,名字以#号结束,CC2530向串口发送字符串”HELLO”+名字。

4.实验改进需求:

输出0V和1V

5.代码:

原始代码:

#include

#include

#define led1 P1_0

#define led2 P1_1

#define uint unsigned int

#define uchar unsigned char

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];

uchar RXTXflag=1;

uchar temp;

uint datanumber=0;

uint stringlen;

//初始化串口0函数

void initUARTO(void)

{

CLKCONCMD &=~0x40;

while(CLKCONSTA & 0x40); CLKCONCMD &=~0x47;

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) {

uint j;

for(j=0;j

{

U0DBUF=*Data++;

while(UTX0IF==0);

UTX0IF=0;

}

}

//主函数

void main(void)

{

P1DIR=0x03;

initUARTO();

UartTX_Send_String(str1,20);

while(1)

{

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);

UartTX_Send_String(Recdata,datanumber);

U0CSR |=0x40;

RXTXflag=1;

datanumber=0;

}

}

}

//串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp

#pragma vector=URX0_VECTOR

__interrupt void UARTO_ISR(void)

{

URX0IF=0;

temp=U0DBUF;

}

改进后代码:

#include "ioCC2530.h"

#include

#define uint unsigned int

#define ConversionNum 20

//定义控制灯的端口

#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 Delay(uint n)

{

uint i,t;

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

for(t = 0;t

}

/****************************************************************

*函数功能:初始化ADC *

*入口参数:无*

*返回值:无*

*说明:参考电压A VDD,转换对象是AVDD *

****************************************************************/

void InitialAD(void)

{

P1DIR = 0x03; //P1控制LED

led1 = 1;

led2 = 1; //关LED

ADCCON1 &= ~0X80; //清EOC标志

ADCCON3=0xbf; //单次转换,参考电压为电源电压,对1/3 A VDD进行A/D转换

//12位分辨率

ADCCON1 = 0X30; //停止A/D

ADCCON1 |= 0X40; //启动A/D

}

//初始化串口0函数

void initUARTO(void)

{

CLKCONCMD &=~0x40;

while(CLKCONSTA & 0x40);

CLKCONCMD &=~0x47;

PERCFG=0x00;

P0SEL=0x3c;

P2DIR&=~0xc0;

U0CSR|=0x80;

U0GCR|=9;

U0BAUD|=59;

UTX0IF=1;

U0CSR|=0x40;

IEN0|=0x84;

}

//串口发送字符串函数

void UartTX_Send_String(char *Data,int len)

{

uint j;

for(j=0;j

{

U0DBUF=*Data++;

while(UTX0IF==0);

UTX0IF=0;

}

}

/**************************************************************** *函数功能:主函数*

*入口参数:无*

*返回值:无*

*说明:无*

****************************************************************/ void main(void)

{

char temp[2];

float num;

InitialAD(); // 初始化ADC

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; //数据处理

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位精确度

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.更改代码之后的结果:

输出0V和1V。实验成功。

相关主题
相关文档
最新文档