找回密码
 立即注册
楼主: lclbf

冲哥视频学习笔记

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-12 11:31:02 | 显示全部楼层
本帖最后由 lclbf 于 2023-5-13 08:15 编辑

第二十四集:比较器
  利用运算放大器的同相输入端高于反向输入端的电压输出高电平,同相输入端低于反向输入端的电压输出低电平,实现电压比较;STC32单片机把这个功能集成到单片机里面,用硬件来实现。
具体电路如下:
1.png
在学习是需要2个问题:
  1、按照视频里面用LED0,不能控制LED0。只能用P40 = 0;P60 = 0;去控制LED0;
1.png

  2、开始电位器W1调到最低位置,P37口为0V,灯不会亮,要把电位器W1调到最上面再调下来灯才会亮。我理解为:理论上

只要是P37口低于1.19V灯就会亮才对。实际中为啥会出现这样的问题,没有想明白。

实验代码如下:

24 比较器1.rar

277.45 KB, 下载次数: 112

24 比较器2.rar

284.72 KB, 下载次数: 112

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-13 08:18:40 | 显示全部楼层
本帖最后由 lcl*** 于 2023-5-13 08:24 编辑
lclbf 发表于 2023-5-12 11:31
第二十四集:比较器
  利用运算放大器的同相输入端高于反向输入端的电压输出高电平,同相输入端低于反向输 ...

上面提到的问题1的问题找到原因了,是我显示部分的代码问题。显示部分我有两个刷新代码,用错了,所以功能不对
有问题的代码如下
/*****************************************************
函数名称:SEG_LED_Fre
函数功能:刷新数码管
入口参数:无
函数返回:无
当前版本:VER1.0
修改日期:2023.5.2
当前作者:
其他备注:
*******************************************************/
void SEG_LED_Fre(void)
{
        static u8 num = 0;
        
        Time_Count++;                                                 //1毫秒计数加1
        if(Time_Count >= 500) //500ms灯闪烁
        {
                blink = !blink;                                           //灯闪烁
                Time_Count = 0;                                      //毫秒计数清零
        }
        
        if(num <= 7)                                                   //8位数码管的刷新
        {
                LEDPower = 1;                                         //关闭LED的电源
                SEG_COM = SEG_W[num];                       //选择相应的数码管的位
                if(blink_bit == num)                                //对应位数码管
                {
                        if(blink == 0)                                  //灯亮
                        {
                              SEG_SEG = SEG_D[SEG_Show[num]];        //需要显示的数字的段码
                        }
                        else                                             //灯熄灭
                        {
                                SEG_SEG =  0xff;                  //段码不显示
                        }
                }
                else
                {
                        SEG_SEG = SEG_D[SEG_Show[num]];        //需要显示的数字的段码
                }                        
        }
        
        else if(num <= 8)//LED的刷新
        {
                SEG_COM = 0xff;                                 //关闭所有数码管
                LEDPower = 0;                                    //打开LED的电源
                SEG_SEG = LED_DATA;                        //输出LED的状态
        }
        
        else
        {
                SEG_COM = 0xff;                              //关闭数码管
                LEDPower = 1;                                 //关闭LED的电源
                SEG_SEG = 0xff;                               //关闭所有输出
        }
        
        num++;                                                 //计数加1
        if(num >= 10)                                        //计数大于10
                num = 0;                                       //计数清零
}


正确的代码应该是下面的:
/*****************************************************
函数名称:SEG_LED_Fre
函数功能:数码管刷新
入口参数:无
函数返回:无
当前版本:VER1.0
修改日期:2023.4.19
当前作者:
其他备注:
*******************************************************/
void SEG_LED_Fre()
{
        static num = 0;
        
        if(num <= 7)                                                 //8位数码管刷新
        {
                LEDPower = 1;                                     //关闭LED
                SEG_SEG = SEG_D[SEG_Show[num]];    //段码给P6口
                SEG_COM = SEG_W[num];                    //第一位数码管显示
        }
        else if(num <= 8)                                        //LED刷新
        {
                SEG_COM = 0xff;                               //关闭数码管
                LEDPower = 0;                                  //打开LED总电源
                SEG_SEG = LED_DATA;                     //点亮对应的LED
        }
        else
        {
                LEDPower = 1;                               //关闭LED
                SEG_COM = 0XFF;                         //关闭数码管
                SEG_SEG = 0XFF;                         //关闭P6口
        }
        
        num++;                                                                             //段码数组值自加
        if(num >= 10)                                                                                          //加到9归0
        num = 0;
}

修正后的代码如下:

24 比较器1.rar

276.96 KB, 下载次数: 103

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-03-27 19:50:39

1

主题

44

回帖

346

积分

中级会员

积分
346
发表于 2023-5-14 08:16:25 | 显示全部楼层
666
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-14 13:59:44 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-15 14:12:05 | 显示全部楼层
本帖最后由 lclbf 于 2023-5-15 14:21 编辑

第二十五集:EEPROM
     EEPROM的学习:写程序注意,写前要先擦除,也就是要先全部写1.冲哥视频讲了单字节的操作。没有单独冲EEPROM,借用单片机的FLASH来当EEPROM,
EEPROM的大小,在下载程序的时候可以根据自己的需要来选择大小(不知道我这样理解对不对)。冲哥视频和规格书都讲的选64K,如下图所示:
1.png

还有要注意的是:下载程序若是选择为1K,地址不能大于1023,如下:


        dat = EEPROM_read_n(1023);        //读取e2数据 eeprom是1K最大值为1023
        EEPROM_SectorErase(1023);        //初始化e2数据,把指定地址的EEPROM扇区擦除
        EEPROM_write_n(1023,dat+1);//将当前数据+1之后重新写入



实验程序如下:




25 EEPROM.rar

300.9 KB, 下载次数: 94

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-15 14:28:10 | 显示全部楼层
本帖最后由 lcl*** 于 2023-5-15 14:34 编辑
lclbf 发表于 2023-5-12 11:31
第二十四集:比较器
  利用运算放大器的同相输入端高于反向输入端的电压输出高电平,同相输入端低于反向输 ...

对于比较器,我说的第二个问题:
   开始电位器W1调到最低位置,P37口为0V,灯不会亮,要把电位器W1调到最上面再调下来灯才会亮。我理解为:理论上只要是P37口低于1.19V灯就会亮才对。实际中为啥会出现这样的问题,没有想明白。
对于这个问题我理解有错,没有好好看规格书,在QQ交流群冲哥回复了我,我又去看了规格书,条件是要上升沿和下降沿才能触发,没有高电平和低电平触发,所以要去调电位器,让他产生一个变化的上升沿或者
下降沿。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-18 17:07:35 | 显示全部楼层
本帖最后由 lclbf 于 2023-5-18 17:16 编辑

第二十六集:单总线控制DS18B20
   电路图如下:
1.png

   DS18B20做温度传感器测试温度,用途广泛,电路简单,元件就3个脚,电源供电,地和输出。供电用104电容滤波,保证工作稳定,
通过本视频的学习,明白了啥是底层函数,啥是接口函数,啥是用户功能函数。

//---------------底层驱动---------------/
void DS18b20_Reset(void);                                //复位
void DS18b20_Write_0(void);                        //写逻辑0码
void DS18b20_Write_1(void);                        //写逻辑1码
bit DS18b20_Read(void);                                        //读取电平

//---------------接口函数---------------/
void DS18b20_WriteByte(u8 dat);        //写一个字节
u8 DS18b20_ReadByte(void);                        //读取一个字节

//---------------用户功能函数---------------/
u16 DS18b20_ReadTemp(void);                        //读取并且换算温度,并返回


通过本视频学习实现了打印输出温度和数码管显示温度。

if(MinusFlag == 1)
                                {
                                        SEG0 = 20;                                                 //负数符号
                                        SEG1 = Temp/100%10;                //十位
                                        SEG2 = Temp/10%10+10; //个位带小数点
                                        SEG3 = Temp/1%10;                        //十分位
                                        printf( "当前温度:-%.01f\r\n",(float)((float)Temp/10) );
                                }
                                else
                                {
                                        SEG1 = Temp/100%10;                //十位
                                        SEG2 = Temp/10%10+10; //个位带小数点
                                        SEG3 = Temp/1%10;                        //十分位
                                        printf( "当前温度:%.01f\r\n",(float)((float)Temp/10) );
                                }


程序压缩如下附件:

26 DS18B20.rar

312.4 KB, 下载次数: 101

回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-18 17:18:06 | 显示全部楼层
本帖最后由 lclbf 于 2023-5-24 10:34 编辑

第二十七集:软件模拟SPI通信
  SPI通信是属于双工通信。试验箱应用电路如下:

1.png

通过软件模拟SPI通信,读取U11的ID号。
关键函数如下:
vovoid SPI_Init(void)
void SPI_WriteByte(u8 dat)
u8 SPI_ReadByte(void)id

实验程序压缩包如下:




27 软件模拟SPI.rar

328.46 KB, 下载次数: 119

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-24 08:14:18 | 显示全部楼层
本帖最后由 lclbf 于 2023-5-24 10:44 编辑

第二十八集:硬件SPI

      本视频介绍了用硬件SPI实现都芯片ID的读取,和用USART1实现SPI功能来读取芯片ID,冲哥实验是通过打印输出来验证的,我在上面还加入了数码管显示。

SPI 相关寄存器如下:
1.png
2.png

3.png



程序代码如下压缩包:


28 硬件SPI 1.rar

328.11 KB, 下载次数: 113

28 硬件SPI 2 USART1.rar

329.29 KB, 下载次数: 108

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 10:03:17

19

主题

205

回帖

820

积分

高级会员

积分
820
发表于 2023-5-24 08:23:56 | 显示全部楼层
第二十九集:SPI的应用,SPI读写W25X40CL
   实际应用中,不单要对单片机的SPI通信协议熟悉,还要对对应的外挂芯片的手册熟悉,才能更好的实现目的,现在很多芯片资料是英文的,对于我来说是个难点,冲哥视频说了借助翻译软件,看关键部分。
实验代码如下压缩包:

29.SPI读写W25X40CL 1.rar

335.58 KB, 下载次数: 121

29.SPI读写W25X40CL 2.rar

344.15 KB, 下载次数: 122

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 12:49 , Processed in 0.130164 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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