嵌入式综合实验小结
一:实验目的
- 利用CC2530 的GPIO读取按键值并相应对进行LED发光二极管的亮灭操作;
- 利用CC2530的串口0进行数据收发通讯。
二:实验环境
1.硬件:通用节点、USB仿真器、USB电缆、PC机;
2.软件:IAR Embedded Workbench for MCS-51、串口调试工具。
三:实验内容及原理
1.了解有关实验内容的知识点
2.硬件设计
此图为USB转串口部分原理图;
此图为按键部分的电路图;
3.软件设计
花式流水灯:
奇数偶数交错灯:
串口:
#include "ioCC2530.h"
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define led1 P1_0
#define led2 P1_1
void InitIO(void); //IO初始化
void InitUart(void); //串口初始化
void SendString(char*string,uint legth); //发送字符串
uchar temp; // 存放接受的数据
char wch[] = "Welcome to test this program!\n";
/*****************************************************************************
功能描述: 延时
Count: 延时单位数量
*****************************************************************************/
void DelayXms(unsigned int Count)
{
unsigned int i;
unsigned int j;
for(i = 0; i < Count; i++)
{
for( j=10000; j>0; j--);
}
}
/*****************************************************************************
功能描述: IO初始化
*****************************************************************************/
void InitIO(void)
{
SLEEPCMD &= ~0X04;
CLKCONCMD = 0X10; //32k和32M时钟使用外部晶体,timer分频8M
while(CLKCONSTA!=0X10); //等待时钟切换
SLEEPCMD = 0X04;
P2DIR = 0x00; //高两位零 若设则最高优先USART0
P1DIR|= 0X03; //P1.0 P1.1 LEDs 灯端口配置
P0DIR|= 0X00; //input
PERCFG = 0x00; //UART0 默认端口
P1SEL = 0X00;
P0SEL = 0X0c; //P0<3:2>设置成外围应用
}
/*****************************************************************************
功能描述: 串口初始化
*****************************************************************************/
void InitUart(void)
{
U0CSR |= 0x80; //UART方式
U0GCR = 11; //baud_e 波特率设为115200
U0BAUD |= 216; //baud_m = BaudRate*2^(28-buad_e)/32M-256
//BaudRate=(256+baud_m)/2^(28-buad_e)x32MHz
UTX0IF = 1; //接收中断标记
U0CSR |= 0X40; //允许接收
URX0IE = 1; //接收中断使能
EA =1; //总中断开关打开
}
/*****************************************************************************
功能描述: 串口发送字符串
string: 字符串指针
lenth: 长度
*****************************************************************************/
void SendString(char*string,uint lenth)
{
uint j;
for (j=0; j<lenth; j++)
{
U0DBUF = *string++; //将要发送字符送入U0DBUF发送寄存器
while(UTX0IF == 0); //等待发送完成
UTX0IF = 0; //清0标志位
}
}
/*****************************************************************************
功能描述: 主函数
*****************************************************************************/
void main(void)
{
InitIO();
InitUart();
DelayXms(10);
led1=1; //点亮2个LED灯
led2=1;
SendString(wch,sizeof(wch));
while(1)
{
; //进入无限循环等待中断函数被处触发
}
}
/*****************************************************************************
功能描述: 串口中断函数
*****************************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF;
U0DBUF = temp; //将收到的字符发送回去
while(UTX0IF == 0); //等待发送
UTX0IF = 0; //清发送标志
led1 = ~led1; //指示中断活动
led2 = ~led2;
}
按键驱动:
五:实验结果
LED:花式流水灯:先两次亮灭后灯依次亮。
奇数偶数交错灯:先一次亮灭后偶数亮接着奇数亮。
串口:电脑接收到数据
按键驱动:
使用USB 仿真器连接电脑和通用传感器节点模块并在IAR环境下运行程序后可发现两个发光二极管灭,后进行第一次按键可以发现其中一个发光二极管亮,再进行第二次按键可以发现前一个发光二极管灭后一个发光二极管亮,再进行第三次按键可以发现两个同时亮,再按键可以发现两个发光二极管都灭,再继续按键则是循环这四次按键。长按按键可循环这个过程,改变延时数值可以发现,若改成大于之前的数字,则长按按键时可以发现发光二极管状态改变时间变长,反之改成小于之前的数字则状态改变时间变短。