以前没用过计数器,以为计数一次要中断一次。学习这节课后,明白,原来跟定时器一样,也可以累积到n个脉冲后再中断一次。这样就能比较节约中断资源。
关于中断资源,中断次数越少越好。 第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。
第17集
串口通信
什么是通信: 设备之间通过一定的协议进行的信息交换。通信分并行通信(并口)和串行通信(串口)。
串口通信:分同步串口通信:USART1/USART2,异步串口通信:UART3/UART4,共4个串口通信。
异步串口不需要统一的时钟信号;
数据包有起始位,停止位,校验位
异步通信速率较慢
分全双工和半双工和单工三种模式;
常用的串口协议:RS232,RS422,RS485(物理结果相同)
串口通信的步骤:
1 引脚选择(确定物理连接,底层);
2 串口初始化(协议层):包括系统频率,波特率,UART数据位,波特率发生器,定时器时钟,
3 数据接收与发射(应用层)。
2和3可以使用ISP进行帮助。
第18集
串口通信的高级应用
一 校验码的必要性:
数据在单向传输过程中容易出错,必须要有相应的手段来检测错误。
二奇偶校验码的优缺点:
可以减少数据在传输过程中的错误,且使用简单;但是错误检出率只有50%,传输效率受影响;
三奇偶校验位的实现:
1 可以利用二进制相加的特点;
2 可以利用ACC和P(奇偶校验位)
四串口通信时的超时中断(三个寄存器)
1 UR2TOCR串口2接收超时控制寄存器;
2 UR2TOSR串口2超时状态寄存器;
3 UR2TOTE/H/L串口2超时长度控制寄存器;
五超时中断发生时,可能是通信的一方掉线;或者损坏;或者出现异常。这时通知CPU切断通信,避免持续等待,特别是使用while语句时。避免一个外设出异常导致整个系统崩溃。 第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的应用。
第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); //回调此函数
}
}
}
第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)
《8051U深度入门到32位51大型实战教学视频》打卡
第22集比较器的应用看了规格书,比较器的硬件资源也挺多,应用也很多,只是受硬件限制,冲哥选择掉电保存这个点切入,也是无奈之举。
视频看了几遍,还真有几点感想想说说。
1 比较器的应用这一集之后,冲哥停更快两个月了。猜想冲哥也发现了一些问题,估计是在重想整理思路。
2 单片机的学习,重来就不是单独的软件逻辑学习,一定是硬件与软件的结合。希望冲哥在接一来的教学中,多一些经典电路(硬件方面)的讲解。
3 在掉电存储这个过程中,有一个关键点,没有讲到,系统是如何触发掉电存储这一功能的?程序中有一个LowVolFlag变量,用来标识低电压状态。这个变量是程序定义的,不是系统自带的,如何触发, 我还没有理解。这一集的代码也没有放上来,还不好自查。
4 隔空喊话:冲哥,加油!
页:
1
[2]