(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。实验成功。