嵌入式计算机系统设计第二次实验报告

实验题目:STC-BSP 余下API函数及综合运用

实验时间:2022.3.7(第3周周一)~2022.3.20(第4周周日)

实验地点:在规定时间中自主寻找合适实验地点并在规定时间内完成

实验条件:

1.STC-B学习板(2021暑假小学期每个学生自己做的)
2.个人电脑:自备
3.Keil、ISP、CH340驱动软件:自备
4.STC-BSP及Demo 程序:教师提供
5.“STC_B学习板”软件支持包使用说明:教师提供
6.C51语言语法:课程提供参考电子书籍,或自找自学
7.Demo1~Demo5源程序:教师提供(Demo3源程序在实验结束后提供)
8.Demo4需要的直流电机模块:工程中心C栋215助教处临时借用
9.Demo5需要的485通信连线:工程中心C栋215助教处临时借用

实验目的:

1.学习和熟悉STC-BSP(“STC-B学习板”板级软件开发支撑包)余下(实验1外)所有模块所有API函数及其使用;
2.掌握“事件”与事件的“回调函数”编程机制与使用;
3.认识“STC-B学习板”中的几种通信方法,熟悉并掌握使用;
4.学习在STC-BSP支撑下,设计应用程序。

实验内容:

1.阅读《“STC_B学习板”软件支持包使用说明》中余下(实验1外)所有模块说明,阅读实验二提供的Demo源程序(Demo1、2、4、5),编写程序测试模块提供的各个函数和方法。除实验1要求熟悉的正向函数使用方法外,本实验重点是“事件”、事件的“回调函数”方法;
2.阅读Demo5相关资料与程序,与同学合作验证Demo 5完成的通信与组网功能,学习和了解相关原理,记录实验过程和现象。
3.实验2现场验收内容:设计与编写有一定功能、目的的应用程序,并调式和在“STC-B学习板”上实现;要求:含通信(串口1、串口2、485、或Ir)、含按键或导航按键操作。
4.选做:认识和验证Demo3功能(Demo3当前仅提供下载的HEX文件,参考源程序在实验二结束后提供),参考Demo2源码,看能否编写程序实现Demo3相同功能和效果?(实验二加分项,训练大家嵌入式应用程序、实用程序编写能力)

实验过程、步骤、现象、结果:

阅读所有余下的模块说明并测试其相关函数

1,ADC.h模块:

ADC模块用于“STC-B学习板”上与ADC相关电路:温度Rt、光照Rop、导航按键Nav、扩展接口EXT上的ADC转换。提供ADC模块初始化函数、2个应用函数,2个事件。
初始化函数:AdcInit(char ADCsel)
函数参数: ADCsel选择扩展接口EXT是否用作ADC功能,取值有
ADCincEXT : 含对扩展接口EXT设置ADC功能(EXT上P1.0、P1.1不可作数字IO功能使用)
ADCexpEXT : 不含对扩展接口EXT设置ADC功能(EXT上P1.0、P1.1可作数字IO功能使用)
选择前者可以使用扩展模块,后者则无法使用
2个应用函数:
struct_ADC GetADC():获取ADC值。ADC结构体信息如下:
typedef struct //ADC转换结果
{ unsigned int EXT_P10; // 扩展接口EXT上P1.0脚ADC(10bit)
unsigned int EXT_P11; // 扩展接口EXT上P1.1脚ADC(10bit)
unsigned int Rt; // 热敏电阻上ADC(10bit)
unsigned int Rop; // 光敏电阻上ADC(10bit)
unsigned int Nav; // 导航按键上ADC(10bit)
} struct_ADC;可用于获取扩展模块的数据或各个ADC相关电路的数据
char GetAdcNavAct(char Nav_button):获取导航按键(包含K3)状态
函数参数:Nav_button:指定要获取状态的导航按键。取值:
enumAdcNavKey3(K3键),
enumAdcNavKeyRight(右按),
enumAdcNavKeyDown(下按),
enumAdcNavKeyCenter(中心按),
enumAdcNavKeyLeft(左按),
enumAdcNavKeyUp(上按).
注意在使用ADC模块后Key模块的Key3相关的函数命令则无法使用
提供的两个事件为:
导航按键事件:enumEventNav
当导航按键5个方向或按键K3有任意”按下“或”抬起“动作时,将产生一个”导航按键事件“enumEventNav。响应导航按键事件的用户回调函数由用户编写,并由sys提供的SetEventCallBack()函数设置响应函数.
扩展接口EXT上P1.0、P1.1两个端口有新的AD值事件:enumEventXADC
当ADC模块对P1.0、P1.1进行ADC转换,获得了它们新的ADC结果时,将产生enumEventXADC事件,通知用户进行处理。响应enumEventXADC事件的用户回调函数由用户编写,并有sys提供的SetEventCallBack()函数设置响应函数.
ADC模块对P1.0、P1.1进行ADC转换速度为3mS,也即每3mS或每秒钟333次转换.
函数功能测试:
将ADC模块的温度,光强和Nav值输出在数码管中:
在这里插入图片描述

测试结果如下:其中3~6位表示光强,在用物品遮挡和放置强光下时结果会相应的升高降低,Nav的值在我们按下不同的导航键时会显示不同的值,这些值对应导航键每一个按键的状态信息,温度还没有转成摄氏度,目前显示的室内的ADC值为550左右,在加热后(用手)该数值降低
嵌入式计算机系统设计第二次实验报告_第1张图片

导航按键事件的回调测试:
嵌入式计算机系统设计第二次实验报告_第2张图片

在导航按键按下不同位置时,Led灯会亮起如代码所示相应位置的LED灯。测试结果符合预期:
嵌入式计算机系统设计第二次实验报告_第3张图片

2.DS1302.h模块:

DS1302模块用于控制“STC-B学习板”上DS1302芯片操作。
DS1302提供RTC(实时时钟)和NVM(非易失存储器)功能(断电后,RTC和NVM是依靠纽扣电池BAT维持工作的)。其中RTC提供年、月、日、星期、时、分、秒功能;NVM提供31 Bytes非易失存储器功能(地址为:0~30)。
其中地址为30的单元被DS1302Init()函数用于检测DS1302是否掉电,用户不能使用
DS1302模块共提供1个驱动函数、4个应用函数:
(1) void DS1302Init(struct_DS1302_RTC time):DS1302驱动函数。使用DS1302,需用该函数初始化和驱动一次
函数参数:结构struct_DS1302_RTC time
如果DS1302掉电(初始化时检测RTC数据失效),则以参数time定义的时间初始化RTC
(2)struct_DS1302_RTC RTC_Read(void):读取DS1302内部实时时钟RTC内容
函数返回值:结构struct_DS1302(见结构struct_DS1302定义)
(3)void RTC_Write(struct_DS1302_RTC time) :写DS1302内部实时时钟RTC内容
函数参数:结构struct_DS1302 time(见结构struct_DS1302定义)
(4)unsigned char NVM_Read(unsigned char NVM_addr): 读取NVM一个指定地址内容
函数参数:
NVM_addr:指定非易失存储单元地址,有效值0~30(共31个单元)
函数返回值:当函数参数正常时,返回NVM中对应单元的存储数值(1Byte)
当函数参数错误时,返回enumDS1302_error
(5)unsigned char NVM_Write(unsigned char NVM_addr, unsigned char NVM_data):向NVM一个指定地址写入新值
函数参数:NVM_addr:指定非易失存储单元地址,有效值:0~30(共31个单元。
NVM_data:待写入NVM单元的新值(1Byte)
函数返回值:当函数参数正常时,返回enumDS1302_OK
当函数参数错误时,返回enumDS1302_error
结构struct_DS1302_RTC定义:
typedef struct
{ unsigned char second; //秒(BCD码,以下均为BCD码)
unsigned char minute; //分
unsigned char hour; //时
unsigned char day; //日
unsigned char month; //月
unsigned char week; //星期
unsigned char year; //年
} struct_DS1302_RTC;
BCD码为2进码十进数,简单来说对于4位的二进制来说,只采用00001001的数字其他舍弃就是最简单的BCD码即只表示010的数字a~f不进行表示
测试函数:
嵌入式计算机系统设计第二次实验报告_第4张图片

初始界面如图所示,掉电后结果不变,按下按键日期发生变化,同样掉电后结果不发生改变
嵌入式计算机系统设计第二次实验报告_第5张图片

测试非易丢存储器:
嵌入式计算机系统设计第二次实验报告_第6张图片

初始情况:断电后结果不变 按下按键后结果如图:断电后结果不变
嵌入式计算机系统设计第二次实验报告_第7张图片

3.EXT.h模块

EXT模块用于控制“STC-B学习板”上扩展接口EXT上相关操作。
EXT模块根据应用需要,在外接相应模块或部件后,可实现多种相应功能。这里提供部分应用驱动和API函数。
EXT模块这里提供1个驱动函数和若干个应用层API函数。
EXT模块的API函数不是同时有效的,而是根据初始化函数参数不同而分别有效。
测试enumEXTWeight()功能:
在这里插入图片描述

显示情况如下:初始值并不为0,这是因为函数本身没有进行清零标定的工作
所以后续想要使用该模块还需要进行标定工作。
嵌入式计算机系统设计第二次实验报告_第8张图片

测试enumEXTPWM功能:
嵌入式计算机系统设计第二次实验报告_第9张图片

效果为当pwm1比pwm2差距20及以上时电机会进行旋转,当pwm1>pwm2 时逆时针旋转,反之顺时针旋转
测试enumEXTDecode
在这里插入图片描述

实验结果无论顺时针或逆时针,只要改变旋转角度都会显示正值,当不旋转时显示0。
测试enumEXTUltraSonic超声波测距
在这里插入图片描述

测试结果如图能过正确显示超声波模块到障碍物的距离
嵌入式计算机系统设计第二次实验报告_第10张图片

4.Hall.h模块

Hall模块用于获取“STC-B学习板”上hall传感器状态。hall模块共提供1个加载函数、1个应用函数,一个Hall事件:enumEventHall
(1)HallInit():hall模块初始化函数
(2)unsigned char GetHallAct(void):获取hall事件。
函数返回值:
enumHallNull(无变化)
enumHallGetClose(磁场接近)
enumHallGetAway(磁场离开)
查询一次后,事件值变成enumEventHall (仅查询一次有效)
(3)hall传感器事件:
当Hall检测到有"磁场接近"或"磁场离开"事件时,将产生一个Hall传感器事件(enumEventHall).响应事件的用户处理函数由用户编写, 并有sys中提供的SetEventCallBack()函数设置事件响应函数.
测试函数:
嵌入式计算机系统设计第二次实验报告_第11张图片

实验结果:磁铁靠近时数码管会显示1,初始情况显示0

5.IR.h模块

IR模块用于控制“STC-B学习板”上红外发送与接收控制,支持PWM、PPM红外编码协议的发送,PWM红外编码的接收,可用于制作红外遥控器、红外通信等。
IR模块提供1个驱动函数、5个API应用函数、1个红外接收事件(enumEventIrRxd:红外Ir上收到一个数据包)。
IR模块已不与串口通信(uart和uart2)冲突,可用与它们同时工作。(以前冲突)
API函数:
(1) void IrInit(unsigned char Protocol):IR模块初始化函数。
函数参数:unsigned char Protocol,定义红外协议。
Protocol 暂仅提供取值:NEC_R05d(定义红外协议基本时间片时长 = 13.1Protocol uS)
(2) char IrTxdSet(unsigned char pt,unsigned char num):以自由编码方式控制IR发送:可用于编写任意编码协议的红外发送,如各种电器红外遥控器等
函数参数:unsigned char pt,指向待发送红外编码数据的首地址。编码规则如下:
码i红外发送时长,码i红外发送停止时长 //单位:协议基本时间片的个数值,最大255。如当协议基本时间片为0.56mS时,数值1代表0.56mS时长,3代表1.68mS时长
unsigned char num,待发送红外编码数据的大小(字节数)
函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。
enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中
(3) char IrPrint(void pt, unsigned char num)://以NEC的PWM编码方式发送数据,可用于符合该函数发送格式的部分电器遥控器;与GetIrRxNum()、SetIrRxd()配合,可进行红外双机通信;等
//红外发送数据格式为:引导码:发(16
基本时间片),停(8
基本时间片)。0.56mS时:发9mS、停4.5mS
数据编码:“0” – 发(1
基本时间片),停(1
基本时间片)
“1” – 发(1基本时间片),停(3基本时间片) 先发高位、后发低位
结束码:发(1基本时间片),停(1基本时间片)
//非阻塞函数,该函数从被调用到返回大约1uS左右时间,但所指定的数据经红外发送完毕则需要较长时间(每字节大约需要10mS量级时间)。
函数参数:void *pt :指定发送数据包位置(数据包不含引导码、结束码信息,仅待发送的有效数据)
unsigned char num:发送数据包大小(字节数,不含引导码、结束码)
函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。
enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中(同IrTxdSet()函数返回值)
(4) void SetIrRxd(void *RxdPt,unsigned char RxdNmax):设置红外接收数据包存放位置、每个数据包最大字节数。 收到一个数据包(至少1字节数据)时将产生numEventIrRxd事件。与它机IrPrint()函数配合,可实现红外数据通信
函数参数: void char *RxdPt:指定接收数据包存放区(首地址)
unsigned char RxdNmax:指定每个数据包接收最大字节数。接收数据如果字节数超出,超出部分将被忽略。该值定义接收数据包最大值,以免超出而影响程序其它数据
(5) unsigned char GetIrRxNum(void):获取收到的红外接收数据包实际字节数。与SetIrRxd()配合,可实现红外数据包接收。(它机应使用IrPrint()函数发送数据包)
返回取值 <= Ir接收缓冲区最大字节数(RxdNmax定义)。如果实际红外数据包字节数大于RxdNmax,收到的多余字节数将不被存储(也不进行计数)
函数返回值:红外接收数据包大小(字节数)。
当收到一个数据包的numEventIrRxd事件产生后,可用该函数获取红外接收数据包的大小(字节数)。其它时间访问,其值不确定
(6)char GetIrStatus(void): 获取Ir状态
函数返回值:enumIrFree:红外空闲
enumIrBusy:红外正忙(正在发送数据包,或正在接收数据包)
(7)红外接收事件enumEventIrRxd:红外Ir上收到一个符合格式的数据包(红外格式见IrPrint()函数说明)。如果接收数据包实际字节数大于Ir接收缓冲区最大字节数(RxdNmax定义),也在收到数据包结束符后产生enumEventIrRxd事件
测试函数:
嵌入式计算机系统设计第二次实验报告_第12张图片

测试结果如图,当按下Key1后收到红外信号后,数码管上的数字加一。

6.M24C02.h模块

M24C02模块用于控制“STC-B学习板”上IIC接口的非易失存储器(NVM)M24C02芯片操作。
M24C02提供2K bits(256 Bytes)非易失存储器(NVM)功能(非易失存储器单元地址为:00~0xff)。
M24C0402模块共提供2个应用函数(本模块不需要初始化)
(1)unsigned char M24C02_Read(unsigned char NVM_addr): 读取M24C02一个指定地址内容
函数参数: NVM_addr:指定非易失存储单元地址,有效值00~0xff(共256个单元)
函数返回值:返回M24C02中对应单元的存储数值(1Byte)
(2)void M24C02_Write(unsigned char NVM_addr, unsigned char NVM_data):向M24C02一个指定地址写入新值
函数参数:
NVM_addr:指定非易失存储单元地址,有效值:00~0xff(共256个单元)
NVM_data:待写入M24C02单元的新值(1Byte)
补充说明:
M24C02为非易失性存储器,其主要特点是:存储的内容在断电后能继续保存,一般用于保存断电需保留的工作系统参数;
但读、写M24C02内部每一个字节均需要花费一定时间(每次读写操作大约数十uS,写周期为5~10mS),且有”写“寿命限制(每一单元大约”写“寿命为10万次量级寿命);
与DS1302内部NVM区别:容量大(M24C02提供256字节,M24CXX系列最大可提供64K字节),但有“写”寿命限制(一般为数十万次“写”寿命“,且写周期长(5~10mS)因此,两次写操作之间需间隔5~10mS以上;
实验效果与DS1302类似都可以做到掉电保存效果

7.StepMotor.h模块

StepMotor用于STC-B板控制步进电机。共提供1个驱动函数、3个应用函数:(1)StepMotorInit():步进电机模块驱动函数
(2)SetStepMotor(char StepMotor,unsigned char speed ,int steps ) 指定步进电机、按指定转动速度、转动指定步
函数参数:StepMotor 指定步进电机,取值(enum StepMotorName中定义)
enumStepMotor1: SM 接口上的步进电机
enumStepMotor2: 此时,用L0~L3四个LED模拟一个4相步进电机
enumStepMotor3: 此时,用L4~L7四个LED模拟一个4相步进电机
Speed:步进电机转动速度(0~255),单位:步/S。 (实际每步时间=int(1000mS/speed) mS),与设置速度可能存在一定误差
Step:步进电机转动步数(-32768~32767),负值表示反转
函数返回:enumSetStepMotorOK: 调用成功(enum StepMotorActName中定义)
numSetStepMotorFail:调用失败(电机名不在指定范围,或speed=0,或调用时正在转动)
(3)EmStop(char StepMotor) 紧急停止指定步进电机转动
函数参数:StepMotor 指定步进电机。函数参数不对将返回0值。
函数返回:剩余未转完的步数
(4)GetStepMotorStatus(char StepMotor) 获取指定步进电机状态
函数参数:StepMotor 指定步进电机
函数返回:enumStepMotorFree:自由(enum StepMotorActName中定义)
enumStepMotorBusy,忙(正在转动)
enumSetStepMotorFail:调用失败(步进电机名不在指定范围)
在这里插入图片描述

实验效果:电机逆时针转动(但是速度为200了转速看起来还是很慢)
8.Uart2.h
Uart2模块提供Uart2模块初始化函数、3个应用函数,1个事件(enumUart2EventRxd):
(1) Uart2Init(unsigned long band,unsigned char Uart2mode):Uart2模块初始化函数。
函数参数:unsigned long band:定义串口2的通信波特率(单位:bps)(固定8个数据位、1个停止位,无奇偶校验位)
unsigned char Uart2mode:定义串口2位置
取值:Uart2UsedforEXT —— 串口2在EXT扩展插座上
Uart2Usedfor485 —— 串口2用于485通信(半双工。发送数据包时不能接收数据)
(2) void SetUart2Rxd(char *RxdPt, unsigned int Nmax, char *matchhead, unsigned int matchheadsize);
设置串口2接收参数:数据包存放位置、大小,包头匹配字符、匹配字符个数。收到符合条件的数据包时将产生enumEventRxd事件。
函数参数: char *RxdPt:指定接收数据包存放区(首地址)
unsigned int Nmax:接收数据包大小(字节数),最大65535
char matchhead: 需要匹配的数据包头(首地址)
unsigned int matchheadsize:需要匹配的字节数
补充说明:
Nmax=1:为单字节接收,即收到一个字节就产生enumEventUart2Rxd事件(如果定义了匹配,还需满足匹配条件);
0 < matchheadsize < Nmax:要求接收数据中连续matchheadsize个字节与
matchhead处数据完全匹配,才在收到Nmax数据时产生enumEventRxd事件;
matchheadsize = Nmax:设定接收数据包完全匹配
matchheadsize=0 或 matchheadsize > Nmax:将不做匹配,接收到任意Nmax数据时产生enumEventRxd事件;
在enumEventRxd事件发出后,接收到的数据包应及时使用或取出,收到下一个数据时将破坏和覆盖前面收到的数据包
(3)char Uart2Print(void *pt, unsigned int num):发送数据包,非阻塞函数(即函数不等到所设定任务全部完成才返回),该函数从被调用到返回大约1uS左右时间。
函数参数: void *pt :指定发送数据包位置
unsigned int num:发送数据包大小;
函数返回值:enumTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。
enumTxFailure:调用失败(主要原因是:串口正忙(上一数据包未发完)
补充说明:串口上发送1个字节数据大约需要时间0.1mS~10mS(视所设定的波特率)。
(4)char GetUart2TxStatus(void): 获取Uart2发送状态
函数返回值:enumUart2TxFree:串口2发送空闲
enumUart2TxBusy,串口2发送正忙
(5) Uart2接收事件:enumUart2EventRxd。表示收到了一个符合指定要求(数据包头匹配、数据包大小一致)的数据包。
补充说明:串口(1和2)上收到的两个数据包之时间间隔要求不小于1mS(原因:系统内部调度方法限制)
测试函数:蓝牙方面的测试:
在这里插入图片描述

完成初始化后就可以接收到蓝牙模块进行配对了

嵌入式计算机系统设计第二次实验报告_第13张图片

测试485情况下的代码:
嵌入式计算机系统设计第二次实验报告_第14张图片

当Key1按下后对方的板子上数码管数字会加一,实验结果:
嵌入式计算机系统设计第二次实验报告_第15张图片

9.Uart1.h模块

Uart1模块提供Uart1模块初始化函数、3个应用函数,1个事件(enumEventRxd):
(1) Uart1Init(unsigned long band):Uart1模块初始化函数。
函数参数:unsigned long band定义串口1的通信波特率(单位:bps)(8个数据位、1个停止位,无奇偶校验位)
函数返回值:无
(2) void SetUart1Rxd(char *RxdPt, unsigned int Nmax, char *matchhead, unsigned int matchheadsize);
设置串口1接收参数:数据包存放位置、大小,包头匹配字符、匹配字符个数。收到符合条件的数据包时将产生enumEventRxd事件。
函数参数: char *RxdPt:指定接收数据包存放区(首地址)
unsigned int Nmax:接收数据包大小(字节数),最大65535
char matchhead: 需要匹配的数据包头(首地址)
unsigned int matchheadsize:需要匹配的字节数
补充说明:
Nmax=1:为单字节接收,即收到一个字节就产生enumUart1EventRxd事件(如果定义了匹配,还需满足匹配条件);
0 < matchheadsize < Nmax:要求接收数据中连续matchheadsize个字节与
matchhead处数据完全匹配,才在收到Nmax数据时产生enumEventRxd事件;
matchheadsize = Nmax:设定接收数据包完全匹配
matchheadsize=0 或 matchheadsize > Nmax:将不做匹配,接收到任意Nmax数据时产生enumEventRxd事件;
在enumEventRxd事件发出后,接收到的数据包应及时使用或取出,收到下一个数据时将破坏和覆盖前面收到的数据包
函数返回值:无
(3)char Uart1Print(void *pt, unsigned int num):发送数据包,非阻塞函数(即函数不等到所设定任务全部完成才返回),该函数从被调用到返回大约1uS左右时间。
函数参数: void *pt :指定发送数据包位置
unsigned int num:发送数据包大小;
函数返回值:enumTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。
enumTxFailure:调用失败(主要原因是:串口正忙(上一数据包未发完)
补充说明:串口上发送1个字节数据大约需要时间0.1mS~10mS(视所设定的波特率)。
(4)char GetUart1TxStatus(void): 获取Uart1发送状态
函数返回值:enumUart1TxFree:串口1发送空闲
enumUart1TxBusy,串口1发送正忙
(5) Uart1接收事件:enumEventUart1Rxd。表示收到了一个符合指定要求(数据包头匹配、数据包大小一致)的数据包。
补充说明:串口(1和2)上收到的两个数据包之时间间隔要求不小于1mS(原因:系统内部调度方法限制)
测试函数:
嵌入式计算机系统设计第二次实验报告_第16张图片

按下按键后,电脑可从串口(初始化时波特率要与串口助手一致)得到1,1,1,1,1,1的数据(6个1是发送数据地址中的数据)
电脑先串口发送数据后板子接收到信息后触发回调函数,板子上数码管的数字加一。
实验

你可能感兴趣的:(单片机,stm32,嵌入式硬件)