物联12002-翁修林-202004071 - 图1
无线单片机应用
课程设计报告


院(系): 计算机科学学院
专业班级: 物联12002
姓 名: 翁修林
学 号: 202004071
指导教师: 刘鹏
设计时间: 2022.6.17~2022.6.24
设计地点: 物联网基础实验室

目录
一、课程设计目的
二、设计任务及要求
三、外设工作原理及程序设计
1、OLED屏幕工作原理及程序设计
2、串口工作原理及程序设计
3、无线RF工作原理及程序设计
四、系统总体结构及工作流程
五、系统测试及调试
六、课设小结
七、课设成绩评定


一、课程设计目的

通过本次课程设计,巩固和加深在《无线单片机与协议开发》课程中所学的理论知识,熟练掌握单片机的程序设计方法,及利用CC2530单片机进行有线/无线通信的方法,培养学生独立进行单片机应用系统的规划、设计、调试和故障排除的能力,以及撰写课程设计报告的能力。

二、设计任务及要求

每组两个同学,使用两个IMOTE CC2530 无线通信节点板(无线发送端/接收端节点)与PC机。具体任务如下:
(1)PC机通过串口通信软件向无线发送端节点的单片机发送字符串“MUSIC_ON”或“MUSIC_OFF”。
(2)无线发送端节点:无线发送端单片机节点接收到PC机发送的字符串后在OLED显示屏上显示字符串内容,同时通过无线RF向无线接收端节点发送字符串数据。
(3)无线发接收端节点:无线发接收端节点接收通过无线RF方式发送的字符数据,在OLED显示屏上显示字符串内容,并播放或停止播放音乐。

三、外设工作原理及程序设计

1、OLED屏幕工作原理及程序设计

(1)调用示例:
P0DIR |= 0x73;
OLEDInit(); //初始化OLED
OLED_Clear();
OLED_ShowString(30, 1, “RECV_ADDR”);

(2)主要函数:
#define OLED_CS_Clr() P0_6 = 0 //芯片选择 该引脚是片选输入。 仅当 CS# 被拉低时,芯片才会启用 MCU 通信。
#define OLED_CS_Set() P0_6 = 1
#define OLED_RST_Clr() P0_5 = 0 // RST:复位(高电平2.2V~5.5V)
#define OLED_RST_Set() P0_5 = 1
#define OLED_DC_Clr() P0_4 = 0 // D/C:数据/命令(高电平2.2V~5.5V)
#define OLED_DC_Set() P0_4 = 1
#define OLED_SCLK_Clr() P0_1 = 0 // SPI时钟输入
#define OLED_SCLK_Set() P0_1 = 1
#define OLED_SDIN_Clr() P0_0 = 0 // SPI数据输入
#define OLED_SDIN_Set() P0_0 = 1

// OLED模式设置
// 0:4线串行模式
// 1:并行8080模式
#define SIZE 16
#define XLevelL 0x02
#define XLevelH 0x10
#define Max_Column 128 //最大列
#define Max_Row 64 //最大行
#define Brightness 0xFF
#define X_WIDTH 128 // X
宽度
#define YWIDTH 64 // Y 宽度

//初始化SSD1306
void OLED_Init(void)
{
OLED_RST_Set(); //复位 P0_5=1
delay_ms(100);
OLED_RST_Clr(); //复位 P0_5=0
delay_ms(100);
OLED_RST_Set(); //复位 P0_5=1
//—turn off oled panel关闭 OLED 面板
OLED_WR_Byte(0xAE, OLED_CMD);
//—-set low column address 设置低列地址
OLED_WR_Byte(0x02, OLED_CMD);
//—-set high column address 设置高列地址
OLED_WR_Byte(0x10, OLED_CMD);
//—set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
//设置起始行地址 设置映射 RAM 显示起始行 (0x00~0x3F)
OLED_WR_Byte(0x40, OLED_CMD);
//—set contrast control register 设置对比度控制寄存器
OLED_WR_Byte(0x81, OLED_CMD);
// Set SEG Output Current Brightness 设置 SEG 输出电流亮度
OLED_WR_Byte(0xCF, OLED_CMD);
//—Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xA1, OLED_CMD);
// Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xC8, OLED_CMD);
//—set normal display 设置正常显示
OLED_WR_Byte(0xA6, OLED_CMD);
//—set multiplex ratio(1 to 64) 设置复用比(1 到 64)
OLED_WR_Byte(0xA8, OLED_CMD);
//—1/64 duty 1/64责任
OLED_WR_Byte(0x3f, OLED_CMD);
//-set display off set Shift Mapping RAM Counter (0x00~0x3F)
//设置显示关闭 setShift 映射 RAM 计数器 (0x00~0x3F)
OLED_WR_Byte(0xD3, OLED_CMD);
//-not offset 不抵消
OLED_WR_Byte(0x00, OLED_CMD);
//—set display clock divide ratio/oscillator frequency
//设置显示时钟分频比/振荡器频率
OLED_WR_Byte(0xd5, OLED_CMD);
//—set divide ratio, Set Clock as 100 Frames/Sec
//设置分频比,设置时钟为 100 帧/秒
OLED_WR_Byte(0x80, OLED_CMD);
//—set pre-charge period 设置预充电期
OLED_WR_Byte(0xD9, OLED_CMD);
// Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
//设置预充电为 15 个时钟,放电为 1 个时钟
OLED_WR_Byte(0xF1, OLED_CMD);
//—set com pins hardware configuration
//设置 com 引脚硬件配置
OLED_WR_Byte(0xDA, OLED_CMD);
OLED_WR_Byte(0x12, OLED_CMD);
//—set vcomh 设置 vcomh
OLED_WR_Byte(0xDB, OLED_CMD);
// Set VCOM Deselect Level 设置 VCOM 取消选择级别
OLED_WR_Byte(0x40, OLED_CMD);
//-Set Page Addressing Mode (0x00/0x01/0x02)
//设置页面寻址模式(0x00/0x01/0x02)
OLED_WR_Byte(0x20, OLED_CMD);
OLED_WR_Byte(0x02, OLED_CMD);
//—set Charge Pump enable/disable
//设置电荷泵启用/禁用
OLED_WR_Byte(0x8D, OLED_CMD);
//—set(0x10) disable 设置(0x10)禁用
OLED_WR_Byte(0x14, OLED_CMD);
// Disable Entire Display On (0xa4/0xa5)
//禁用整个显示 (0xa4/0xa5)
OLED_WR_Byte(0xA4, OLED_CMD);
// Disable Inverse Display On (0xa6/a7)
//禁用反向显示 (0xa6/a7)
OLED_WR_Byte(0xA6, OLED_CMD);
//—turn on oled panel 打开 OLED 面板
OLED_WR_Byte(0xAF, OLED_CMD);
OLED_WR_Byte(0xAF, OLED_CMD); /display ON 显示开/
OLED_Clear();
OLED_Set_Pos(0, 0);
}

//向SSD1306写入一个字节。
// dat:要写入的数据/命令
// cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(uchar dat, uchar cmd)
{
uchar i;
if (cmd)
OLED_DC_Set(); // D/C:数据/命令(高电平2.2V~5.5V)
else
OLED_DC_Clr();
OLED_CS_Clr(); //芯片选择 该引脚是片选输入。 仅当 CS# 被拉低时,芯片才会启用 MCU 通信。
for (i = 0; i < 8; i++)//写一个字符 8bit
{
OLED_SCLK_Clr(); // SPI时钟输入
if (dat & 0x80)
OLED_SDIN_Set(); // SPI数据输入
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat <<= 1;
}
OLED_CS_Set();
OLED_DC_Set();
}

//显示一个字符号串
void OLED_ShowString(uchar x, uchar y, uchar chr)
{
uchar j = 0;
while (chr[j] != ‘\0’)
{
OLED_ShowChar(x, y, chr[j]);
x += 8;
if (x > 120)
{
x = 0;
y += 2;
}
j++;
}
}

//在指定位置显示一个字符,包括部分字符
// x:0~127
// y:0~63
// mode:0,反白显示;1,正常显示
// size:选择字体 16/12
void OLED_ShowChar(uchar x, uchar y, uchar chr)
{
uchar c = 0, i = 0;
c = chr - ‘ ‘; //得到偏移后的值
if (x > Max_Column - 1) //最大列
{
x = 0;
y = y + 2;
}
if (SIZE == 16)
{
OLED_Set_Pos(x, y);
for (i = 0; i < 8; i++)
OLED_WR_Byte(F8X16[c
16 + i], OLED_DATA); // F8X16 816的点阵 字库
OLED_Set_Pos(x, y + 1);
for (i = 0; i < 8; i++)
OLED_WR_Byte(F8X16[c
16 + i + 8], OLED_DATA);
}
else
{
OLED_Set_Pos(x, y + 1);
for (i = 0; i < 6; i++)
OLED_WR_Byte(F6x8[c][i], OLED_DATA);
}
}

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
uchar i, n;
for (i = 0; i < 8; i++)
{
OLED_WR_Byte(0xb0 + i, OLED_CMD); //设置页地址(0~7)
OLED_WR_Byte(0x02, OLED_CMD); //设置显示位置—列低地址
OLED_WR_Byte(0x10, OLED_CMD); //设置显示位置—列高地址
for (n = 0; n < 128; n++)
OLED_WR_Byte(0, OLED_DATA);
} //更新显示
}

void OLED_Set_Pos(uchar x, uchar y)
{
OLED_WR_Byte(0xb0 + y, OLED_CMD);
OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);
OLED_WR_Byte((x & 0x0f) | 0x01, OLED_CMD);
}

2、串口工作原理及程序设计

//初始化串口函数
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while (CLKCONSTA & 0x40)
;//等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
SLEEPCMD |= 0x04;//关闭其它无用频率信号
PERCFG = 0x00;//位置1P0口
P0SEL |= (1 << 3) | (1 << 2);// P0设置为串口
P2DIR &= ~((1 << 7) | (1 << 6)); // P0优先作为UART0
U0CSR |= (1 << 7);
U0GCR |= 9;//指数值,波特率设为9600
U0BAUD |= 59; //小数部分59
UTX0IF = 1;// usart 0 tx中断
U0CSR |= (1 << 6); //接收器使能
IEN0 |= (1 << 7) | (1 << 2);
}

//初始化系统时钟
void InitClock(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while (CLKCONSTA & 0x40)
; //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
SLEEPCMD |= 0x04; //关闭其它无用频率信号
}

//串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
// Recdata[datanumber++] = U0DBUF;//U0DBUF:USART 0 接收/发送数据缓存
temp = U0DBUF;
}

void main(void)
{
P0DIR |= 0x73;
OLED_Init(); //初始化OLED
OLED_Clear();
#if NODE_TYPE
OLED_ShowString(30, 1, “SEND_ADDR”); //发送数据
#else
OLED_ShowString(30, 1, “RECV_ADDR “); //接收数据
#endif
Led_Init(); //初始化LED
P1DIR = 0x03; // P1控制LED
initUART0(); //初始化串口0函数
UartTX_Send_String(str, 20);
while (1)
{
if (RXTXflag == 1)
{
if (temp != 0)//如果temp有数据就存到数组Recdata中
{
if ((temp != ‘#’) && (datanumber < 9))
{
Recdata[datanumber++] = temp;
}
else
{
RXTXflag = 3;
Recdata[datanumber++] = ‘\0’;
}
temp = 0;
}
}
if (RXTXflag == 3)
{
U0CSR &= ~(1 << 6); // 不能接收
if (Recdata[7] == ‘N’)
{
//显示OLED
led1 = 0;
UartTX_Send_String(Recdata, datanumber);
P0DIR |= 0x73;
// Recdata[8]=0;
OLED_Init(); //初始化OLED
OLED_Clear();
OLED_ShowString(30, 1, “SEND_ADDR”);
OLED_ShowString(30, 3, “MUSIC_ON “);
rf_init();
tx();
Delay(2000); //延时
}
else if (Recdata[7] == ‘F’)
{
led1 = 1;
UartTX_Send_String(Recdata, datanumber);
P0DIR |= 0x73;
OLED_Init(); //初始化OLED
OLED_Clear();
OLED_ShowString(30, 1, “SEND_ADDR”);
OLED_ShowString(30, 3, “MUSIC_OFF”);
rf_init();
tx();
Delay(2000); //延时
}
U0CSR |= (1 << 6); // 0x40允许接收
RXTXflag = 1;
datanumber = 0;
}
}
}

3、无线RF工作原理及程序设计

/**发送方*/
// RF中断初始化
void rf_init()
{
//(1 << 6)硬件产生一个CRC-16(ITU-T)并附加到发送帧。不需要写最后2 个字节到TXBUF。
//硬件检查一个CRC-16,并以一个16 位状态字代替RX FIFO,包括一个CRC OK 位。状态字可通过APPEND_DATA_MODE 控制。
//(1 << 5)定义无线电是否自动发送确认帧。当autoack 使能,所有经过地址过滤接受的帧都设置确认请求标志,在接收之后自动确认一个有效的CRC12 符号周期。
FRMCTRL0 |= (1 << 5) | (1 << 6); //(0x20 | 0x40);//硬件CRC以及AUTO_ACK使能 FRMCTRL0:帧处理
TXFILTCFG = 0x09;// 0000 1001 设置TX抗混叠过滤器以获得合适的带宽
AGCCTRL1 = 0x15;//调整AGC目标值
FSCAL1 = 0x00;//获得最佳的EVM
RFIRQM0 |= (1 << 6);// RXPKTDONE 中断位使能
IEN2 |= (1 << 0);// RF 中断使能
EA = 1;//开中断
FREQCTRL = 0x0a;//信道选择,选择11信道
SHORT_ADDR0 = 0x05;// 0x0005//目标地址过滤期间使用的短地址
SHORT_ADDR1 = 0x00;
PAN_ID0 = 0x23; // 选择两个设备进行无线通信时的个域网ID: PANID 0x0022//目标地址过滤期间使用的PANID
PAN_ID1 = 0x00;
RFST = 0xed;//清除RXFIFO缓冲区并复位解调器
RFST = 0xe3;//为RX使能并校准频率合成器
FRMFILT0 &= ~(1 << 0); //禁止帧过滤
}

//通信
void tx()
{
unsigned char i;
RFST = 0xe3; //为RX使能并校准频率合成器
while (FSMSTAT1 & ((1 << 1) | (1 << 5)))
;// 等待发送状态不活跃并且没有接收到SFD
RFIRQM0 &= ~(1 << 6);//禁止RXPKTDONE接收数据包中断
IEN2 &= ~(1 << 0);//禁止RF中断
RFST = 0xee;// 清除TXFIFO缓存
RFIRQF1 = ~(1 << 1);// 清除 TXDONE 发送完成中断
if (Recdata[7] == ‘N’)
{
RFD = 8 + 2;// 发送的第一个字节是传输的帧长度
for (i = 0; i < 8 + 2; i++) //将mac的内容写到RFD中
RFD = Recdata[i];
}
else
{
RFD = 9 + 2;// 发送的第一个字节是传输的帧长度
for (i = 0; i < 9 + 2; i++) //将mac的内容写到RFD中
RFD = Recdata[i];
}
RFST = 0xe9; //校准后使能TX
while (!(RFIRQF1 & (1 << 1)))
;//等待传输结束
RFIRQF1 = ~(1 << 1);//清除 TXDONE状态
RFIRQM0 |= (1 << 6);// 打开RX中断
IEN2 |= (1 << 0);//打开RF中断
}

/**接收方*/
void rf_init()
{
FRMCTRL0 |= (1 << 5) | (1 << 6); //(0x20 | 0x40);//硬件CRC以及AUTO_ACK使能
TXFILTCFG = 0x09;//设置TX抗混叠过滤器以获得合适的带宽
AGCCTRL1 = 0x15;//调整AGC目标值
FSCAL1 = 0x00;//获得最佳的EVM
RFIRQM0 |= (1 << 6);// RXPKTDONE 中断位使能
IEN2 |= (1 << 0);// RF 中断使能
EA = 1;//开中断
FREQCTRL = 0x0a;//信道选择,选择11信道
SHORT_ADDR0 = 0x05;// 0x0005//目标地址过滤期间使用的短地址
SHORT_ADDR1 = 0x00;
PAN_ID0 = 0x23; // 0x0022//目标地址过滤期间使用的PANID
PAN_ID1 = 0x00;
RFST = 0xed;//清除RXFIFO缓冲区并复位解调器
RFST = 0xe3;//为RX使能并校准频率合成器
FRMFILT0 &= ~(1 << 0); //禁止帧过滤
}

//接收中断处理
#pragma vector = RF_VECTOR
interrupt void rf_isr(void)
{
unsigned char i;
//关中断
IEN2 &= ~0X01;
//接收帧结束
if (RFIRQF0 & (1 << 6))
{
len = RFD; //接收帧长度
len &= 0x7f;
for (i = 0; i < len; i++) //将接收的数据写入buf中
{
buf[i] = RFD;
Delay(200);
}
if (buf[7] == ‘N’)
{
P0DIR |= 0x73;
OLED_Init();//初始化OLED
OLED_Clear(); //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
OLED_ShowString(30, 1, “RECV_ADDR”);
OLED_ShowString(30, 3, “MUSIC_ON”);
delay_ms(250);
//放歌
led1 = 1;
led2 = 0;
Init_Sys();
Init_T1();
k = sszymmh[yuepu_cnt] - 1 + 7 sszymmh[yuepu_cnt + 1];
Init_T3();
EA = 1; //开总中断
}
else if (buf[7] == ‘F’)
{
//停止播放
beep = 0;
Delay(2000);
Delay(2000);
Delay(2000);
T1IE = 0;
T3IE = 0;
beep = 0;
jiepai_cnt = 0;
yuepu_cnt = 0;
led1 = 1;
led2 = 1;
// OLED
P0DIR |= 0x73;
OLED_Init(); //初始化OLED
OLED_Clear();
OLED_ShowString(30, 1, “RECV_ADDR”);
OLED_ShowString(30, 3, “MUSIC_OFF”);
delay_ms(250);
}
S1CON = 0;// 清RF中断
RFIRQF0 &= ~(1 << 6); //清 RXPKTDONE中断
//设置断点后,程序停止在断点处,但RF仍旧在接收,导致FIFO溢出,无法接收数据,继续运行后再也无法接收。所以要运行一下指令
RFST = 0xed;//清除RXFIFO缓冲区并复位解调器
}
IEN2 |= (1 << 0);
}

/**接收方-播放音乐**
/
//播放音乐模块
unsigned char yuepu_cnt = 0;//乐谱数组计数
unsigned char k = 0;
unsigned int jiepai_cnt = 0;
unsigned char sszymmh[] = {//乐谱数组 (音符,音高,节拍)
// 凉凉
6, 0, 2, 3, 1, 2, 3, 1, 2, 2, 1, 2, 3, 1, 2, 5, 1, 2, 3, 1, 2,
2, 1, 2, 3, 1, 4, 6, 0, 8, 7, 0, 2, 7, 0, 2, 7, 0, 2, 1, 1, 2,
7, 0, 4, 3, 0, 2, 5, 0, 2, 6, 0, 2, 5, 0, 10,
6, 0, 2, 3, 1, 2, 3, 1, 2, 2, 1, 2, 3, 1, 2, 2, 1, 2, 3, 1, 2,
5, 1, 4, 3, 1, 4, 2, 1, 2, 3, 1, 2, 5, 1, 2, 5, 1, 4, 6, 1, 4,
6, 1, 4, 5, 1, 4, 5, 1, 2, 6, 1, 10};
unsigned int YINFU[] = { //音符数组
//低音 0
0X1DD2, 0X1A94, 0X17AD, 0X1663, 0X13EE, 0X11C1, 0X0FD1,
//中音 1
0x0EF0, 0X0D4F, 0X0BDB, 0X0B31, 0X09F7, 0X08E1, 0X07E8,
//高音 2
0X1912, 0X06A6, 0X05ED, 0X0598, 0X04FC, 0X0470, 0X03F9};

//初始化函数声明
void Init_Sys(void)
{
CLKCONCMD &= ~0x7f; //晶振设置为32MHZ
while (CLKCONSTA & 0x40)
; //等待晶振稳定
P1SEL &= ~((1 << 0) | (1 << 1));
P1DIR |= (1 << 0) | (1 << 1);

P2SEL &= ~(1 << 0);//P2_0通用I/O
P2DIR |= (1 << 0);//输出
beep = 0;//初始低电平 不叫
led1 = 0;
led2 = 1;
}
void Init_T1(void) //系统工作频率32MHz,定时器1工作频率4MHz(8分频)
{
T1CCTL0 = (1 << 2) | (1 << 6);//通道0终端使能,比较模式
T1CTL = (1 << 2) | (2 << 0);//启动,设8分频,设模模式,1/4Mhz(0.25ms)
T1IE = 1;//开T1中断
}
void Init_T3(void)//系统工作频率32MHz,定时器3工作频率1MHz(32分频)
{
T3CC0 = JIEPAI;//定时器3比较模式模为125us
jiepai_cnt = 0;
T3CCTL0 = (1 << 2) | (1 << 6);//通道0终端使能,比较模式
T3CTL = (5 << 5) | (1 << 4) | (1 << 2) | (2 << 0);//设32分频,启动定时器,复位T3计数器,设模模式
T3IE = 1;//开T3中断
}
void delay_jiepai(void)
{
jiepai_cnt = 0;
T3CTL |= (1 << 2) | (1 << 4);//复位并启动T3计数器
T3CC0 = JIEPAI;
while (jiepai_cnt != (sszymmh[yuepu_cnt + 2] * 1000))
;
}

#pragma vector = T1_VECTOR
interrupt void T1_ISR(void)
{
if (buf[7] == ‘F’) //如果是F则
{
beep = 0; //初始低电平 不叫
led1 = 0;
led2 = 0;
yuepu_cnt = 0;
jiepai_cnt = 0;
T1CC0H = 0; //定时器1 通道0 捕获/比较值高字节
T1CC0L = 0; //定时器1 通道1 捕获/比较值低字节
}
else
{
beep = !beep; // 1电平 叫
T1CC0H = YINFU[k] >> 8;
T1CC0L = YINFU[k] & 0xFF;
}
}

#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
//T3CC0 = JIEPAI;
jiepai_cnt++;
if (jiepai_cnt >= (sszymmh[yuepu_cnt + 2] 1000)) //节拍数组 1/4 单位:ms
{
jiepai_cnt = 0;
yuepu_cnt += 3;
if (yuepu_cnt >= sizeof(sszymmh))
yuepu_cnt = 0;
k = sszymmh[yuepu_cnt] - 1 + 7
sszymmh[yuepu_cnt + 1];
T1CC0H = YINFU[k] >> 8;
T1CC0L = YINFU[k] & 0xFF;
led1 = !led1; //播放一个音符交替闪烁
led2 = !led2; //
}
}

四、系统总体结构及工作流程

(1)系统总体结构图
物联12002-翁修林-202004071 - 图2


物联12002-翁修林-202004071 - 图3
(2)工作流程
物联12002-翁修林-202004071 - 图4
(3)无线发送端软件流程图和无线接收端软件流程图
物联12002-翁修林-202004071 - 图5

物联12002-翁修林-202004071 - 图6

五、系统测试及调试

(1)板子测试
物联12002-翁修林-202004071 - 图7
物联12002-翁修林-202004071 - 图8
(2)PC接收测试
物联12002-翁修林-202004071 - 图9

六、课设小结

(1)对单片机的开发有了一些认识(通过操作寄存器来操作单片机)。
(2)因为没有接触过zigbee的无线通信方面的知识,一开始做的时候完全没有思路,通过看文档(老师发的资料以及上网查找),刚开始想用协议栈来做,但后来,感觉后面RF写寄存器的方法自己理解起来好像深刻一点就使用了RF的方法。
(3)在要复习期末的情况下,合理分配时间十分重要。
(4)要学会手册的使用,必要情况下可以去官网去查一查。文档手册使用的好不仅可以帮助我们快速理解,也是我们编程的一大助力。
(5)编程能力的不足,有些操作要理解好久(比如测VDD中的左移<< >>右移操作)。之后要更加注重这方面能力的培养与学习。

七、课设成绩评定

考勤与纪律
(20%)
软件系统的结构和程序的调试能力
(30%)
课设报告
(30%)
验收答辩
(20%)
总成绩