找回密码
 立即注册
查看: 1434|回复: 17

[STC屠龙刀]学习打卡日历/学习感悟 - 跟着冲哥学习 STC32G12K128

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-5-31 14:00:55 | 显示全部楼层 |阅读模式
本帖最后由 nano 于 2024-5-31 23:07 编辑

单片机(Microcontroller)是一种集成电路芯片,它集成了处理器、存储器、输入/输出接口以及各种功能模块于一身。

能写入用户程序;能读取在输入引脚上的电压信号,能在引脚上输出特定的电平信号,能在特定引脚上输出电压信号,能计算时间,能计数,能做数学运算,能做逻辑运算,能顺序动作,能通信等功能,最概括的来说就是他能做有规律可循的控制应用。





1. 总线:总线是一组导线,连接了单片机中的各个部分,如处理器、存储器和输入/输出接口。它负责在各个部件之间传递信息和数据。常见的总线有地址总线、数据总线和控制总线。
  • 地址总线:用于传递存储器和外设的地址信息。
  • 数据总线:用于传输实际的数据。
  • 控制总线:用于传递控制信号,如读写操作。
2. 总线与外设通信:单片机通过总线与外设进行通信。当处理器需要与外设通信时,它会将外设的地址放在地址总线上,将要传输的数据放在数据总线上,并通过控制总线发送控制信号,以实现对外设的读写操作。3. GPIO(General Purpose Input/Output,通用输入输出):GPIO是单片机上的一种通用接口,可用于连接各种外设。GPIO接口可以配置为输入或输出模式,实现单片机与外设之间的数据传输。



4. 通信协议:单片机与外设之间通信的方式有很多,通常需要遵循一定的协议。以下是一些常见的通信协议:
  • UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器):这是一种异步串行通信协议,用于在单片机与外设之间传输数据。UART通信需要两根线:一根用于发送数据(TX),另一根用于接收数据(RX)。
  • SPI(Serial Peripheral Interface,串行外设接口):SPI是一种同步串行通信协议,使用主从模式进行通信。它需要四根线:时钟线(SCLK)、主设备数据输出线(MOSI)、主设备数据输入线(MISO)和片选线(SS)。
  • I2C(Inter-Integrated Circuit,内部集成电路总线):I2C是一种同步串行通信协议,使用主从模式进行通信。它只需要两根线:串行数据线(SDA)和串行

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-5-31 17:10:03 | 显示全部楼层

[STC屠龙刀]学习打卡日历/学习感悟 - 第02集

本帖最后由 nano 于 2024-5-31 17:40 编辑


思考:做什么产品


想通过学习单片机做一个 MP5 播放器或者,这需要学习很多的电子元器件的知识,以及嵌入式开发的知识。

11.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-5-31 17:34:00 | 显示全部楼层

[STC屠龙刀]学习打卡日历/学习感悟 - 第03集

本帖最后由 nano 于 2024-5-31 17:40 编辑

1. 成功完成开发环境的搭建
2. 使用 stcai-isp 通过 HID 下载程序,屠龙刀板子完成跑马灯固件烧录,并实现跑马灯效果。




1.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-5-31 22:44:50 | 显示全部楼层

[STC屠龙刀]学习打卡日历/学习感悟 - 第04集

本帖最后由 nano 于 2024-5-31 22:50 编辑

  • 成功完成点灯的工程
  • 了解 LED 点亮原理,并学会了使用寄存器来点灯。源码如下



  1. // ================================================================
  2. // 寄存器点灯学习
  3. // ================================================================
  4. // 在开发板的左上方有八个共阳 LED 灯。对应的引脚是 P20...7
  5. //
  6. // 在数据手册 《11.1 I/O 口相关寄存器》章节有说明相关的寄存器地址
  7. //
  8. // | 符号 | 描述              | 地址 |
  9. // | ---- | ----------------- | ---- |
  10. // | P2   | P2 端口           | A0H  |
  11. // | P2M0 | P2 口配置寄存器 0 | 96H  |
  12. // | P2M1 | P2 口配置寄存器 1 | 95H  |
  13. //
  14. // ================================================================
  15. sfr P2   = 0xA0;
  16. sfr P2M1 = 0x95;
  17. sfr P2M0 = 0x96;
  18. sbit P20 = P2^0;
  19. sbit P21 = P2^1;
  20. sbit P22 = P2^2;
  21. sbit P23 = P2^3;
  22. sbit P24 = P2^4;
  23. sbit P25 = P2^5;
  24. sbit P26 = P2^6;
  25. sbit P27 = P2^7;
  26. int main() {
  27.     P2M1 = 0x00, P2M0 = 0x00;   //设置为准双向口
  28.         // 共阳 LED 灯 : 高电平灭, 低电平亮
  29.     P20 = 0; P21 = 0; P22 = 0; P23 = 0;
  30.         P24 = 0; P25 = 0; P26 = 0; P27 = 0;
  31.        
  32.     while(1) {}
  33. }
复制代码






3. 使用 USB-HID 方式实现不断电自动下载



这是我最喜欢的下载方式,USB-CDC 下载方式还需要生成一个串口,STC-USB Link1 还需要外拖一个设备,这种方式只需要一个 USB 数据即可。

11.png


4. 使用 USB-CDC 方式实现不断电自动下载

22.png


5. 使用 STC-USB Link1 方式实现不断电自动下载

2.jpg










回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-5-31 23:02:26 | 显示全部楼层

[STC屠龙刀]学习打卡日历/学习感悟 - 第05集

1. C语言表示进制中,二进制以  0B 或  0b 开头,八进制以  0 开头,十六进制以 0x 或 0X 开头

2. 标识符只能由 字母数字下划线 组成,不能以 数字 开头

3. 二进制和八进制相互转换

   111 010 101 011 转换为八进制后结果为

  1. 步骤:
  2.    ∵ 二进制每三位都可以转为一个八进制位的值
  3.        111 010 101 011
  4.         7   2   5   3
  5.    ∴ 转换结果为:0753
复制代码


   76321 转换为二进制结果为

  1. 步骤:
  2.    ∵ 八进制的每位都可以转换为三位的二进制
  3.       7 --> 111
  4.       6 --> 110
  5.       3 --> 011
  6.       2 --> 010
  7.       1 --> 001
  8.    ∴ 结果为:111 110 011 010 001
复制代码


4. 二进制和十六进制相互转换

   1111 1010 1101 1011 转换为十六进制后结果为

  1. 步骤:
  2.    ∵ 二进制每四位都可以转为一个十六进制位的值
  3.       1111 1010 1101 1011
  4.        15   10   13   11
  5.    又∵ 在十六进制中,大于九的数值都有其字母对应,即
  6.        10 -> A   11 -> B   12 -> C   13 -> D    14 -> E    15 -> F
  7.    ∴ 结果为:0XFADB
复制代码


   a6b2f1 转换为二进制结果为

  1. 步骤:
  2.    ∵ 十六进制的每位都可以转换为四位的二进制
  3.       a --> 10 --> 1010
  4.       6 -->  6 --> 0110
  5.       b --> 11 --> 1011
  6.       2 -->  2 --> 0010
  7.       f --> 15 --> 1111
  8.       1 -->  1 --> 0001
  9.    ∴ 结果为:1010 0110 1011 0010 1111 0001
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-6-1 22:25:11 | 显示全部楼层

[STC屠龙刀]学习打卡日历/学习感悟 - 第06集

本帖最后由 nano 于 2024-6-1 22:28 编辑

今天学习的是 LED 闪烁和花式点灯,我声明了一个函数,可以实现跑马灯和流水灯两个效果。源码如下:





  1. #include "stc_usb_auto_download.h"
  2. // ==============================================================================================
  3. // 流水灯&跑马灯
  4. // 在开发板的右上方有八个共阳 LED 灯。对应的引脚是 P20...7
  5. // ==============================================================================================
  6. /*!
  7.     \brief   延迟函数
  8.         
  9.     \param[in]  ms[u16]: 延迟时间(单位:毫秒)
  10.     \param[out] none
  11.     \retval     none
  12. */
  13. void delay_ms(u16 ms) {
  14.      u16 i;
  15.      do {
  16.           i = MAIN_Fosc / 6030;
  17.           while(--i);
  18.      }while(--ms);
  19. }
  20. /*!
  21.     \brief   延迟函数
  22.         
  23.     \param[in]  status  [u8] : 灯的状态, 0 或 1
  24.     \param[in]  start   [u16]: 起始索引, 取值范围[0, 7]
  25.     \param[in]  step    [u16]: 移动步长
  26.     \param[in]  flowing [u16]: 是否是流水灯, 1: 流水不灭, 0: 走马单亮
  27.     \param[out] none
  28.     \retval     none
  29. */
  30. #define TURN_OFF_ALL_LED() {P27 = P26 = P25 = P24 = P23 = P22 = P21 = P20 = 1;}
  31. void marquee(u8 status, u16 start, int step, u16 flowing) {
  32.     u16 i = 0;
  33.         status = status ? 1 : 0;
  34.     for(i = start; i < 8 && i >= 0; i+= step) {
  35.         switch(i) {
  36.             case 0: P20 = status; break; case 1: P21 = status; break;
  37.             case 2: P22 = status; break; case 3: P23 = status; break;
  38.             case 4: P24 = status; break; case 5: P25 = status; break;
  39.             case 6: P26 = status; break; case 7: P27 = status; break;
  40.         }
  41.         delay_ms(10);
  42.         if(!flowing) {
  43.             TURN_OFF_ALL_LED();
  44.         }
  45.     }
  46. }
  47. int main() {
  48.         auto_usb_hid_download();    // 开启自动下载
  49.         P2M1 = 0x00, P2M0 = 0x00;   //设置为准双向口
  50.         
  51.     while (1) {
  52.                 marquee(0, 0, 1, 1);   // 依次亮灯[流水灯]
  53.                 delay_ms(200);
  54.                 marquee(1, 7, -1, 1);  // 依次灭灯[流水灯]
  55.                 delay_ms(200);
  56.                
  57.                 marquee(0, 0, 1, 0);   // 依次亮灯[跑马灯]
  58.                 delay_ms(200);
  59.                 marquee(0, 7, -1, 0);  // 依次亮灯[跑马灯]
  60.                 delay_ms(200);
  61.         }
  62. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-6-1 23:08:58 | 显示全部楼层

[STC屠龙刀]学习打卡日历/学习感悟 - 第07集



今天学习的是按键按下的时候点灯,我将上节课的代码封装起来,方便这节课使用,封装代码如下:


LED.h


  1. #ifndef __LED_H__
  2. #define __LED_H__
  3. #include "STC32G_Delay.h"
  4. /*!
  5.     \brief   初始化 LED
  6.         
  7.     \param[in]  none
  8.     \param[out] none
  9.     \retval     none
  10. */
  11. void led_init();
  12. /*!
  13.     \brief   打开所有灯
  14.         
  15.     \param[in]  none
  16.     \param[out] none
  17.     \retval     none
  18. */
  19. void turn_on_all_led();
  20. /*!
  21.     \brief   关闭所有灯
  22.         
  23.     \param[in]  none
  24.     \param[out] none
  25.     \retval     none
  26. */
  27. void turn_off_all_led();
  28. /*!
  29.     \brief   延迟函数
  30.         
  31.     \param[in]  status  [u8] : 灯的状态, 0 或 1
  32.     \param[in]  start   [u16]: 起始索引, 取值范围[0, 7]
  33.     \param[in]  step    [u16]: 移动步长
  34.     \param[in]  flowing [u16]: 是否是流水灯, 1: 流水不灭, 0: 走马单亮
  35.     \param[out] none
  36.     \retval     none
  37. */
  38. void marquee(u8 status, u16 start, int step, u16 flowing);
  39. /*!
  40.     \brief   SOS 灯
  41.         
  42.     \param[in]  none
  43.     \param[out] none
  44.     \retval     none
  45. */
  46. void led_sos();
  47. #endif
复制代码


LED.c


  1. #include "LED.h"
  2. /*!
  3.     \brief   初始化 LED
  4.         
  5.     \param[in]  none
  6.     \param[out] none
  7.     \retval     none
  8. */
  9. void led_init() { P2M1 = 0x00, P2M0 = 0x00; }
  10. /*!
  11.     \brief   打开所有灯
  12.         
  13.     \param[in]  none
  14.     \param[out] none
  15.     \retval     none
  16. */
  17. void turn_on_all_led() {
  18.         P27 = P26 = P25 = P24 = P23 = P22 = P21 = P20 = 0;
  19. }
  20. /*!
  21.     \brief   关闭所有灯
  22.         
  23.     \param[in]  none
  24.     \param[out] none
  25.     \retval     none
  26. */
  27. void turn_off_all_led() {
  28.         P27 = P26 = P25 = P24 = P23 = P22 = P21 = P20 = 1;
  29. }
  30. /*!
  31.     \brief   延迟函数
  32.         
  33.     \param[in]  status  [u8] : 灯的状态, 0 或 1
  34.     \param[in]  start   [u16]: 起始索引, 取值范围[0, 7]
  35.     \param[in]  step    [u16]: 移动步长
  36.     \param[in]  flowing [u16]: 是否是流水灯, 1: 流水不灭, 0: 走马单亮
  37.     \param[out] none
  38.     \retval     none
  39. */
  40. void marquee(u8 status, u16 start, int step, u16 flowing) {
  41.     u16 i = 0;
  42.         status = status ? 1 : 0;
  43.     for(i = start; i < 8 && i >= 0; i+= step) {
  44.         switch(i) {
  45.             case 0: P20 = status; break; case 1: P21 = status; break;
  46.             case 2: P22 = status; break; case 3: P23 = status; break;
  47.             case 4: P24 = status; break; case 5: P25 = status; break;
  48.             case 6: P26 = status; break; case 7: P27 = status; break;
  49.         }
  50.         delay_ms(10);
  51.         if(!flowing) {
  52.             turn_off_all_led();
  53.         }
  54.     }
  55. }
  56. /*!
  57.     \brief   SOS 灯
  58.         
  59.     \param[in]  none
  60.     \param[out] none
  61.     \retval     none
  62. */
  63. void led_sos() {
  64.         int i = 0;
  65.         unsigned int times = 0;
  66.         for(i = 0; i < 9; i++) {
  67.                 times = i < 3 || i > 5 ? 100 : 300;
  68.                 turn_on_all_led();
  69.                 delay_ms(times);
  70.                 turn_off_all_led();
  71.                 delay_ms(times);
  72.         }
  73. }
复制代码


main.c

  1. #include "stc_usb_auto_download.h"
  2. // ==============================================================================================
  3. // 按键点灯
  4. // 在开发板的右上方有八个共阳 LED 灯。对应的引脚是 P20...7
  5. // 在开发板的左下方有四个按键。对应的引脚是 P32...5
  6. // ==============================================================================================
  7. #include "LED.h"
  8. int main() {
  9.         int key_released = 1;         // 标识位: 记录按键上一次按下的状态
  10.         auto_usb_hid_download();      // 开启自动下载
  11.         led_init();                   // 设置为准双向口
  12.         
  13.         P3M0 &= ~0x08; P3M1 &= ~0x08; // 将按键 P33 设置为准双向
  14.         led_sos();                    // SOS 闪灯效果
  15.         
  16.     while (1) {
  17.                 if(P33 == 0 && key_released == 1) {
  18.                         // 按下
  19.                         key_released = 0;
  20.                         turn_on_all_led();
  21.                 } else if(P33 == 1 && key_released == 0) {
  22.                         // 弹起
  23.                         key_released = 1;
  24.                         turn_off_all_led();
  25.                 }
  26.                 delay_ms(10);
  27.         }
  28. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-09 00:40:40
已绑定手机

1

主题

836

回帖

1529

积分

金牌会员

积分
1529
发表于 2024-6-2 00:36:52 | 显示全部楼层
靡不有初,鲜克有终
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:429
  • 最近打卡:2025-05-08 00:01:49
已绑定手机

19

主题

3196

回帖

4956

积分

论坛元老

积分
4956
发表于 2024-6-2 10:07:46 | 显示全部楼层
autodown直接定义成函数这方法不错
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-06-26 09:16:29

1

主题

11

回帖

91

积分

注册会员

积分
91
发表于 2024-6-2 23:45:06 | 显示全部楼层

[STC屠龙刀]学习打卡日历/学习感悟 - 第08集

本帖最后由 nano 于 2024-6-4 13:48 编辑

今天学习的是按键按下的时候蜂鸣器会响起,我结合上节课的 LED 灯的操作。完成了如下代码:

  1. #include "stc_usb_auto_download.h"
  2. // ==============================================================================================
  3. // 蜂鸣器
  4. // 在开发板的右上方有八个共阳 LED 灯。对应的引脚是 P20...7
  5. // 在开发板的左下方有四个按键。对应的引脚是 P32...5
  6. // 在开发板左下方的 P54 引脚外接有源蜂鸣器, 引脚输出低电平能让蜂鸣器响起
  7. //
  8. // 课后练习:按下后表示启动,选择的对应的功能的LED持续闪烁,表示正在工作,
  9. //           且在工作的时候无法切换功能。
  10. // ==============================================================================================
  11. // 工作倒计时宏定义, 因为每 10ms 记一次数, 则 1000 表示工作十秒
  12. #define MAX_TIMES   1000
  13. void delay_ms(unsigned int ms) {
  14.         unsigned int i;
  15.         do{
  16.                 i = MAIN_Fosc / 13060;
  17.                 while(--i);
  18.         }while(--ms);
  19. }
  20. // 打开所有灯
  21. void set_all_led(uint16 v)  { P27 = P26 = P25 = P24 = P23 = P22 = P21 = P20 = v; };
  22. // 打开所有灯
  23. void turn_on_all_led()  { set_all_led(0); };
  24. // 关闭所有灯
  25. void turn_off_all_led() { set_all_led(1); };
  26. int main() {
  27.         uint16 i = 0, s = 0;
  28.         uint16 work_times = MAX_TIMES;   // 工作倒计时 10s, 每 10ms 减一, 到零说明工作完成
  29.         uint16 working = 0;              // 标识位: 表示此时是否正在工作
  30.         uint16 key_released = 1;         // 标识位: 记录按键上一次按下的状态
  31.         auto_usb_hid_download();         // 开启自动下载
  32.         
  33.         P2M0  =  0x00, P2M1  =  0x00;    // 将共阳灯  P20...7 引脚设置为双向
  34.         P5M0 |=  0x10, P5M1 &=  0x10;    // 将蜂鸣器  P54     引脚设置为推挽
  35.         P3M0 &= ~0x08, P3M1 &= ~0x08;    // 将按键的  P33     引脚设置为准双向
  36.         
  37.         P54 = 0;                         // 测试启动蜂鸣器
  38.         turn_on_all_led();               // 测试开灯
  39.         delay_ms(5000);                  // 测试延迟 1s
  40.         turn_off_all_led();              // 测试关灯
  41.         P54 = 1;                         // 测试关闭蜂鸣器
  42.         
  43.     while (1) {
  44.                
  45.                 if(working == 1) {
  46.                         // LED持续闪烁,表示正在工作,
  47.                         set_all_led(work_times % 10 == 0 ? 0 : 1);
  48.                         work_times--;
  49.                         if(work_times < 1) {
  50.                                 // 倒计时结束, 工作完成, 蜂鸣器响起 1s, LED 灯闪烁 三次
  51.                                 working = 0;
  52.                                 work_times = MAX_TIMES;
  53.                                 P54 = 0;
  54.                                 turn_on_all_led();
  55.                                 delay_ms(500);
  56.                                 for(i = 0; i < 7; i++) {
  57.                                         s = i % 2 == 0 ? 1 : 0;
  58.                                         P54 = s;
  59.                                         set_all_led(s);
  60.                                         delay_ms(100);
  61.                                 }
  62.                                 turn_off_all_led();
  63.                                 P54 = 1;
  64.                         }
  65.                 } else {
  66.                         // 未工作的时候按钮可允许按键按下
  67.                         
  68.                         if(P33 == 0 && key_released == 1) {        // 按下
  69.                                 key_released = 0;
  70.                                 P54 = 0;
  71.                         } else if(P33 == 1 && key_released == 0) { // 弹起
  72.                                 key_released = 1;
  73.                                 P54 = 1;
  74.                                 working = 1;                           // 开始工作
  75.                         }
  76.                 }
  77.                
  78.                 delay_ms(10);
  79.         }
  80. }
复制代码


回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 03:24 , Processed in 0.166920 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表