xupota 发表于 2025-4-18 22:00:36

第15集定时器作为计数器的用法。

以前没用过计数器,以为计数一次要中断一次。学习这节课后,明白,原来跟定时器一样,也可以累积到n个脉冲后再中断一次。这样就能比较节约中断资源。

关于中断资源,中断次数越少越好。

xupota 发表于 2025-4-22 20:25:08

第16集
DS18B20温度测量
1 了解单总线系统。
2 DS18B20 两种供电模式;
3 基本的测温功能;
4 报警功能;
6 64位唯一ROM编码;
7 循环冗余校验码;
8 严格顺序:初始化-->ROM命令-->功能指令
9 代码编写:
a 底层驱动:
   复位:(输出0保持480us,输出1保持60us,读取当前电平,延时420us)【共需要约960us】
   写0:(输出0保持60us+,输出1保持1us+)【共需要约62us】
   写1:(输出0保持1us+,输出1保持60us)【共需要约62us】
   读0/1(输出0保持1us+,输出1保持1us+,读取当前电平,延时60us)【共需要约64us】
b 接口函数
   写1定节(先输出低位,再输出高位)【约需要62*8=496us】
    读1字节(先读到的是低位,后读到的是高位)【约需要64*8=512us】
c 用户功能函数
   温度读取换算函数
    (复位-CCH-44H-等待-复位-CCH-BEH-读到2字节温度数据-换算)
      (960+496+496+ +960+496+496+512*2=4928us,约为5000us=5ms),也就是说读取一次温度约需要5ms。

xupota 发表于 2025-5-2 12:58:45

第17集

串口通信

什么是通信: 设备之间通过一定的协议进行的信息交换。通信分并行通信(并口)和串行通信(串口)。
串口通信:分同步串口通信:USART1/USART2,异步串口通信:UART3/UART4,共4个串口通信。
               异步串口不需要统一的时钟信号;
               数据包有起始位,停止位,校验位
               异步通信速率较慢
分全双工和半双工和单工三种模式;
常用的串口协议:RS232,RS422,RS485(物理结果相同)

串口通信的步骤:
1 引脚选择(确定物理连接,底层);
2 串口初始化(协议层):包括系统频率,波特率,UART数据位,波特率发生器,定时器时钟,
3 数据接收与发射(应用层)。

2和3可以使用ISP进行帮助。

xupota 发表于 2025-5-3 08:39:25

第18集
串口通信的高级应用
一   校验码的必要性:
      数据在单向传输过程中容易出错,必须要有相应的手段来检测错误。
二奇偶校验码的优缺点:
   可以减少数据在传输过程中的错误,且使用简单;但是错误检出率只有50%,传输效率受影响;
三奇偶校验位的实现:
   1 可以利用二进制相加的特点;
   2 可以利用ACC和P(奇偶校验位)
四串口通信时的超时中断(三个寄存器)
   1 UR2TOCR串口2接收超时控制寄存器;
   2 UR2TOSR串口2超时状态寄存器;
   3 UR2TOTE/H/L串口2超时长度控制寄存器;

五超时中断发生时,可能是通信的一方掉线;或者损坏;或者出现异常。这时通知CPU切断通信,避免持续等待,特别是使用while语句时。避免一个外设出异常导致整个系统崩溃。

xupota 发表于 2025-5-3 18:00:39

第19集 ADC
ADC全称为:Analog to Digital Converter模数转换器。通常是指一个将模拟信号转换为数字信号的电子元件

基本原理:逐次逼进型
ADC的必要因素:1 基准;2 分度(分辨率)
8051U ADC分辨率为12位。最小为1/4096(即1/(2^12))
其基准电压引脚Vcc P41
相关寄存器:
ADC_CONTR               ADC控制寄存器;
ADCCFG                     ADC配置寄存器;
ADC_RES / ADC_RESL   ADC转换结果寄存器;
ADCTIM                     ADC时序控制寄存器;

特别注意:ADC引脚要配置为高阻输入;

课程还可以引申的知识点:
1 按键子程序中,256/512/,,,,4096这些数据是怎么来的?其实可以结合硬件电路图简单的说说。
2 按键子程序中,offset的必要性;如何缩小offset,提高精度。
2 PWM在ADC中的应用,这个估计要等到讲解完PWM之后才提及。
3 第16路ADC通道的应用。片内1.19V的应用。

xupota 发表于 2025-5-4 09:48:18

第20集   ADC_NTC测温
ADC有多种用途,比如测光线(光亮度),测声音,测气体(CO,CO2),测温度,测电流

NTC:Negative Temperature Coefficient负温度系数热敏电阻。

注意:ADC引脚要高阻输入,P51供电时,配置为推挽输出;
因时间关系,冲哥在查表时,显示有点异常。我用递归函数优化二分法。如下:

/*
递归函数查询,优化二分法
数组NTC_Value用于存放NTC的阻值对温度的对应关系
为简化处理,这个3代表25℃,7代表26℃,33代表34℃
阻值应该程指数关系,而不是递差数列,故意使用随机数数列,从小到大排列
为简化运算,这里只显示25-34这10个温度数。
若ADC读取到4,5,6,均表示25.5℃,
为方便显示,不使用浮点数,温度显示值会乘10.比如25℃显示250,25.5℃显示255
NTC_Temp_Read函数中,adc是读取到的NTC值,
a表示NTC阻值数组中查询范围的下限,
b表示NTC阻值数组中查询范围的上限
*/
u8 NTC_Value[]={3,7,8,11,14,25,26,27,29,33};//定义NTC阻值数组
u16 NTC_Temp_Read(u8 adc,u8 a,u8 b)
{       
        u8 min=a;                                                                                        //替换下限,因为要回调函数本身,区分形参与实参
        u8 max=b;                                                                                //替换上限
        if( adc < NTC_Value)                                                                //判断读取的NTC阻值是否超温度对应阻值的下限
                return 0xfffe;                       
        else if(adc > NTC_Value)
                return 0xffff;                                                                        //判断读取的NTC阻值是否超温度对应阻值的上限
        else if(adc == NTC_Value)
                return ((min+25)*10);                                                        //判断读取的NTC阻值是否刚好等于温度对应阻值的下限
        else if(adc == NTC_Value)               
                return ((max+25)*10);                                                        //判断读取的NTC阻值是否刚好等于温度对应阻值的上限               
        else if((max - min) == 1)                                                                //判断是否刚好处于两个相邻温度对应的阻值中间               
                return ((min+25)*10+5);                                                        //如果是,返回(相对较低温度+0.5)               
        else
        {
                if( adc == NTC_Value[(u8)((min+max)/2+0.5)])                       //如果读取的NTC阻值刚为查询范围内的中间值,+0.5的效果等同于四舍五入
                        return (((u8)((min+max)/2+0.5)+25)*10);                     //返回中值对应的温度
                else if( adc < NTC_Value[(u8)((min+max)/2+0.5)])            //如果读取的NTC阻值小于查询范围内的中间值
                {
                        max=(u8)((min+max)/2+0.5);                                       //更新上限,+0.5的效果等同于四舍五入
                        NTC_Temp_Read(adc,min,max);                                        //回调此函数
                }
                else if( adc > NTC_Value[(u8)((min+max)/2+0.5)])            //如果读取的NTC阻值大于查询范围内的中间值,
                {
                        min=(u8)((min+max)/2+0.5);                                        //更新下限,+0.5的效果等同于四舍五入
                        NTC_Temp_Read(adc,min,max);                                        //回调此函数                       
                }
        }               
}

xupota 发表于 2025-5-5 10:46:52

第21集   flash 模拟EEPROM

介绍了Flash与EEPROM的作用与区别,及IAP和ISP。

其基本逻辑是数据的掉电存储。

应用范围比较多,如商务锁机;系统配置信息保存;多用户数据保存。密码变更等。

主要涉及IAP功能。

相关寄存器如下:
IAP_DAT                读写数据
IAP_ADDRE/H/L   数据地址高 中低(24位)
IAP_CMD               命令:1读 2写 3擦除
IAP_TRIG            触发命令,先后写5a a5
IAP_CONRE         操作,写入0x80才能操作EEPROM
IAP_TPS                等待时间,时钟/1M(四舍五入,向上比如时间:11.05926MHz配置为12,22.11852MHz配置为23)

xupota 发表于 2025-5-5 16:50:14

《8051U深度入门到32位51大型实战教学视频》打卡

第22集比较器的应用

看了规格书,比较器的硬件资源也挺多,应用也很多,只是受硬件限制,冲哥选择掉电保存这个点切入,也是无奈之举。

视频看了几遍,还真有几点感想想说说。

1 比较器的应用这一集之后,冲哥停更快两个月了。猜想冲哥也发现了一些问题,估计是在重想整理思路。

2 单片机的学习,重来就不是单独的软件逻辑学习,一定是硬件与软件的结合。希望冲哥在接一来的教学中,多一些经典电路(硬件方面)的讲解。

3 在掉电存储这个过程中,有一个关键点,没有讲到,系统是如何触发掉电存储这一功能的?程序中有一个LowVolFlag变量,用来标识低电压状态。这个变量是程序定义的,不是系统自带的,如何触发, 我还没有理解。这一集的代码也没有放上来,还不好自查。

4 隔空喊话:冲哥,加油!
页: 1 [2]
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》打卡第一集