HNU 电子实训 BSP 模块应用训练笔记
本文最后更新于 44 天前,其中的信息可能已经有所发展或是发生改变。

题目与BSP版权属于学校,代码请见 https://git.cyp0633.icu/cyp0633/eecs-bsp-test-code-2,遵循GPLv3协议。

1. 串口1收发

计算机上利用串口助手,设置串口参数:“2400,8,N,1”(即:波特率2400bps,8个数据位。无奇偶校验位,一个停止位),顺序发送10字节的HEX数据到STC-B板,STC-B板将接收到的10字节数据再以倒序方式经串口1发送回计算机。

引入串口1 使用的头文件uart1.h,初始化传递波特率2400作为参数。然后设定接收条件,接收缓冲区指向一个空的大小为10的字符数组,匹配字符串指向一个空指针,设置字符串长度为0,字符串长度为0。并设置回调函数,当读取到符合上述条件的串口1数据包时,调用sendBack函数。

void sendBack()
{
    char temp;
    int i;
    for(i=0;i<5;i++)
    {
        temp=buffer[i];
        buffer[i]=buffer[9-i];
        buffer[9-i]=temp;
    }
    Uart1Print(buffer,10);
}

大致就是将buffer中的字符串首尾调换,然后通过串口1重新发回。

2. 串口2通信

两块STC-B板1和2通过串口2连接(485接口上:A、B、GND,或EXT上:P1.0(RXD)、P1.1(TXD)、GND),设置串口2参数:“1200,8,N,1”。STC板1往STC板2发送5字节数据,STC板2接收数据,计算它们的累加和,并将累加和的低8位通过LED灯显示,验证结果是否正确?(STC-B板1需多换几组数据验证)。

发送端

使用Uart2Init函数初始化串口2,设定RS485,波特率1200,设置每1s调用回调函数 sendData

sendData中,通过一个countdown全局变量设定每10s发送一次buffer中的内容(1、3、5、7、9),并将里面的每个数递增1(溢出时设为0x1)。

接收端

初始化串口2,波特率1200,初始化屏幕,并设置串口2接收缓冲区和回调函数,类似于题1。

在回调函数中使用一个for循环计算累加和,并将其与0xff的计算结果传入LedPrint显示在LED上。

3. 红外无线通信

与第2题的操作一致,仅两块STC-B板通信方式选用IR红外无线连接(而不是串口2)。注意:同一房间内,同时开启红外通信可能会互相干扰。

发送端

头文件引入红外,使用IrInit 初始化红外为NEC格式,每1s设置调用回调函数。

回调函数内容与题2发送端类似,但考虑到红外特性将发送延迟设置为3s。

接收端

使用IrInit初始化红外为NEC格式,使用 SetIrRxd 指定缓冲区,然后设置收到数据包的回调函数。

在回调函数中行为类似于题2的接收端。

4. 实时时钟

初始化DS1302实时时钟芯片,并将其“时分秒”信息以“时时—分分—秒秒”格式显示在数码管上。然后验证“STC-B学习板”上的实时时钟在断电后,其时钟靠板上的纽扣电池仍能正常走时。

struct_DS1302_RTC time, temp;
unsigned char display[8];

void changeClock()
{
    temp = RTC_Read();
    display[0] = temp.second & 0x0f;
    display[1] = (temp.second >> 4) & 0x0f;
    display[2] = temp.minute & 0x0f;
    display[3] = (temp.minute >> 4) & 0x0f;
    display[4] = temp.hour & 0x0f;
    display[5] = (temp.hour >> 4) & 0x0f;
    display[6] = temp.day & 0x0f;
    display[7] = (temp.day >> 4) & 0x0f;
    Seg7Print(display[7], display[6], display[5], display[4], display[3], display[2], display[1], display[0]);
}

void main()
{
    time.year = 0x22;
    time.day = 0x22;
    time.month = 0x8;
    time.hour = 0x15;
    time.minute = 0x33;
    time.second = 0x22;
    DS1302Init(time);
    DisplayerInit();
    SetDisplayerArea(0, 7);
    LedPrint(0);
    SetEventCallBack(enumEventSys10mS, changeClock);
    MySTC_Init();
    while (1)
    {
        MySTC_OS();
    }
}

5. 非易失存储

数据可以在掉电情况下保留在非易失存储器(M24C02或DS1302)中的某个单元上。设计一段小程序:上电后,读取出非易失存储内某个单元数据,并将其值显示在LED灯上,再将这个数据+1后写回这个单元。分析这样的程序,如果拔插“STC—B学习板”电源(或按板上“RST”复位按键),会出现什么现象?(说明:DS1302需要靠纽扣电池才能在掉电时保存数据)

初始化NVM后使用NVM_Read读取0x05处的值作为初始值,并显示在LED上。如果值为0xf,则重置为0,否则将值自增1后写回0x05。这样的步骤在每次重置后都会进行,就实现了自增的效果。

6. 收音机

初始化启用FM_radio模块。收音机参数设定为91.8MHz,音量6。PHONE接口上插上耳机验证是否正确收到电台?

初始化一个struct_FMRadio结构体,设置频率918,音量6,三个GP都为0,然后传递给FMRadioInit函数。

7. 音乐播放器

用Music模块提供的API实现播放一段音乐。

使用SetMusic指定节拍、音调、乐谱数据、乐谱大小(用sizeof得到)以及显示方式,然后使用SetPlayerMode开始播放。

代码存放于 https://git.cyp0633.icu/cyp0633/eecs-bsp-test-code/src/branch/master/music2

8. 温度值计算

10位精度采集热敏电阻ADC值,编写程序(查表、或线性插值方法等)换算出正确温度值,并在数码管显示出来。热敏电阻参数10K/3950,(具体见“案例测试”中提供的参考资料。可设有效换算温度范围-5°C~+85°C)。

从其他示例程序找到了一个8位采样值到温度的的换算表:

int code tempdata[] = {239, 197, 175, 160, 150, 142, 135, 129, 124, 120, 116, 113, 109, 107, 104, 101,
                       99, 97, 95, 93, 91, 90, 88, 86, 85, 84, 82, 81, 80, 78, 77, 76,
                       75, 74, 73, 72, 71, 70, 69, 68, 67, 67, 66, 65, 64, 63, 63, 62,
                       61, 61, 60, 59, 58, 58, 57, 57, 56, 55, 55, 54, 54, 53, 52, 52,
                       51, 51, 50, 50, 49, 49, 48, 48, 47, 47, 46, 46, 45, 45, 44, 44,
                       43, 43, 42, 42, 41, 41, 41, 40, 40, 39, 39, 38, 38, 38, 37, 37,
                       36, 36, 36, 35, 35, 34, 34, 34, 33, 33, 32, 32, 32, 31, 31, 31,
                       30, 30, 29, 29, 29, 28, 28, 28, 27, 27, 27, 26, 26, 26, 25, 25,
                       24, 24, 24, 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19,
                       19, 19, 18, 18, 18, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14,
                       13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 9, 9, 9, 8, 8, 8, 7,
                       7, 7, 6, 6, 5, 5, 54, 4, 3, 3, 3, 2, 2, 1, 1, 1, 0, 0, -1, -1, -1,
                       -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8, -8, -9, -9,
                       -10, -10, -11, -11, -12, -13, -13, -14, -14, -15, -16, -16, -17,
                       -18, -19, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
                       -30, -32, -33, -35, -36, -38, -40, -43, -46, -50, -55, -63, 361};

使用ADCexpEXT初始化ADC,并初始化屏幕。每10ms回调calcTemp函数。

在calcTemp中,将10位取样右移2位变为8位,计算100次取样的累加和,并取平均值。将换算表中平均采样值的对应值显示在数码管上。

9. 扩展模板

外设模块中超声波、编码器、电子尺…选取一个,能在数码管上显示相应物理量数值。

引入扩展模块头文件,使用EXTInit初始化超声波模块,初始化屏幕,设置10ms回调showDist函数。

使用GetUltraSonic获得超声波传感器的读数,将每位分出来显示在数码管上。

10. 直流电机

设计简单程序段,用两组参数(“50%速度、正转”,和“30%速度、反转”)分别设置直流电机,并接上直流电机观察不同参数时电机转动情况。

设一个状态变量,按Key 1后更改其值,并输出另一种PWM信号。正转50%使用SetPWM(0, 0, 50, 500);,反转30%使用SetPWM(50, 300, 0, 0);

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇