本帖最后由 ohy3686 于 2017-12-1 23:30 编辑
【CC2530入门教程-强化练习C】基本控制模块综合应用
【1】引用
一个学期即将结束,我设计了一个CC2530基本外设功能的综合应用实训来测试学生的学习效果。这个题目对于嵌入式应用或者单片机开发的初学者来说也是一个测试自己很好的题目。每年年底,很多省份都开展全国职业院校技能大赛的省级选拨,这个也是物联网应用技术赛项一个很好的训练题目哦。
【2】题目
【3】功能分析与设计思路
<1> 系统上电后,LED需要闪烁2下,实际上就是一个跑马灯函数LEDRunning(),当然还需要一个端口初始化函数Init_Port()和延时函数Delay()。
<2> 要实现1秒的AD采样,那么就需要使用定时器1。1秒的间隔定时显然比较长,需要将其分解为更小的定时单位,通过多次定时实现1秒的间隔时长。对于定时器1模块,先定义初始化函数Init_Timer1(),然后定时定时中断服务函数Timer1_Sevice(),实现0.1秒间隔定时,再定义两个全局变量:统计定时器中断次数的t_count和1秒定时完成标志F_Time01S。
<3> 在AD采样光照电压的功能中,使用的是通道0,先在初始化函数Init_ADC0()中配置必要的寄存器,然后在ADC0_to_LED3()函数中采样光照数据,再通过判断比较ADCH的值来实现对LED3的自动控制。
<4> 对于串口0模块,首先在初始化系统时钟Init_Clock()将系统时钟配置为32MHz的外部晶振,通过串口初始化函数Init_Uart0()配置波特率等参数,在中断服务函数UR0Recv_Sevice()中来接收单字节指令存在Recv_dat,用F_Recv来标志接收完成,由UR0_Excute_Command()来解析和执行指令。通过UR0_Send_Data()函数将返回帧数组Send_dat[4]发送到上位机。
<5> 定义Scan_Keys()来扫描按键SW2,在确认按键动作之前需要进行去抖动处理,用一个全局变量Num_sw2来统计按键的操作次数。
<6> 在mian()函数中,实现整个系统的功能,其逻辑要清晰明了。
【4】程序框架搭建参考- #include "ioCC2530.h"
- /*------------------设备宏定义-----------------------*/
- #define LED3 P1_0
- #define LED4 P1_1
- #define SW2 P0_1
- /*------------------全局变量定义--------------------*/
- unsigned char t_count = 0,Recv_dat = 0,Num_keys = 0;
- unsigned char Send_dat[4] = {0xfa, 0x00, 0x00, 0xaf};
- unsigned char F_Time01S = 0, F_Recv = 0, S_LED4 = 0;
- /*--------------------延时函数----------------------*/
- void Delay(unsigned int time)
- {}
- /*-------------------端口初始化---------------------*/
- void Init_Port()
- {}
- /*-------------------跑马灯函数---------------------*/
- void LEDRunning()
- {}
- /*-----------------定时器1初始化--------------------*/
- void Init_Timer1()
- {}
- /*--------------定时器1中断服务函数-----------------*/
- #pragma vector = T1_VECTOR
- __interrupt void Timer1_Sevice()
- {}
- /*-----------------系统时钟初始化-------------------*/
- void Init_Clock()
- {}
- /*------------------串口0初始化---------------------*/
- void Init_Uart0()
- {}
- /*-----------------字节发送函数---------------------*/
- void UR0_Send_Data()
- {}
- /*-----------串口0接收中断服务函数------------------*/
- #pragma vector = URX0_VECTOR
- __interrupt void UR0Recv_Sevice()
- {}
- /*-------------------ADC0初始化---------------------*/
- void Init_ADC0(){}
- /*-------------ADC0采样电压控制LED3----------------*/
- void ADC0_to_LED3()
- {}
- /*---------------上位机命令字解析与执行-------------*/
- void UR0_Excute_Command(){}
- /*------------------按键扫描函数--------------------*/
- void Scan_Keys()
- {}
- /*=====================主函数=========================
- 功能:初始化端口、定时器、串口和ADC
- 系统启动跑马灯与扫描按键处理
- 处理1秒定时的光照数据采集与LED自动控制
- 处理上位机串口数据交互
- 设计:广东职业技术学院 欧浩源
- 时间:2017年12月01日
- ====================================================*/
- void main()
- {
- Init_Clock(); //初始化系统时钟
- Init_Port(); //初始化端口
- Init_Timer1(); //初始化定时器1
- Init_Uart0(); //初始化串口0
- Init_ADC0(); //初始化ADC通道0
- LEDRunning(); //执行跑马灯程序
- while(1) //进入系统循环
- {
- Scan_Keys(); //扫描按键
-
- if(F_Time01S == 1) //定时1秒间隔时间到
- {
- ADC0_to_LED3(); //采样光照输入电压数据
- F_Time01S = 0; //清除定时1秒标志
- }
-
- if(F_Recv == 1) //成功接收到一个单字节指令
- {
- UR0_Excute_Command();
- F_Recv = 0; //清除接收标志
- }
- }
- }
复制代码
【5】程序编码与仿真调试
既然是测试题目,那就不给出源码了。
不过,可以参考本人在论坛的CC2530入门系列教程。
如果自己不能实现本题目,那么你的水平离入门还有一丢丢的距离,加油!
实在需要,给我邮件哦<ohy3686@foxmail.com>...
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
在论坛上侃侃还可以,出教程弄不好就误导学生了。
是的,现在上课正在用。
一周热门 更多>