davidyan 发表于 2025-5-23 06:51:03

aicube助手非常赞,不用再记寄存器名字了,只要了解原理,直接从软件中点击设置就能生成代码。而且生成的代码可读性非常高,结构清晰,注释明确,用户修改很容易。

davidyan 发表于 2025-5-23 10:23:23

<p>第八集:定时器应用<br />
代码debug小技巧分享,略过<br />
多周期任务触发,其实是把时钟作为信号源,在软件里又定义了几个(软)分频时钟,然后通过数组实现多组分频来精简代码。这样实现的软分频时钟可以一次管理多个同时钟源的软时钟,最好还能有响应函数的配置,这个应该可以通过函数指针的方式实现(视频后半段实现了这个功能,点赞冲哥)。</p>
<p>然后冲哥的代码存在一个并发的问题,主函数和时钟中断函数在操作同一个计数变量count,偶然的情况可能会出现一个操作被另一个操作覆盖的问题。</p>
<p>按键检测的问题,我以为会以按键中断的方式实现,没想到会是用定时器触发轮询的方式。两种方法各有优劣吧。</p>
<ul>
<li>按键触发,需要自己解决误触,反复触的问题。还需要自己想办法计算触摸时长。</li>
<li>定时器轮询,触摸时长的精度受定时器影响,在两个定时器中断期间隔的信号会被忽略,只会对两次轮询期间的状态进行对比。因此如果是高频信号,用这种方式就不能追踪到完整的信号变化形态了。</li>
</ul>
<p>总结:本集实现了一个软件时钟触发实现周期任务控制的功能,可以根据设置的时钟信号配置多个分频信号,每个信号单独触发调用一个响应函数。使用到了数组、结构体、计时器、中断、函数指针等技术栈。</p>
<p>从这集开始感觉有点伤脑了,非基础的高级功能。</p>

AI-32位8051 发表于 2025-5-23 11:14:14

提前获得 【免费+包邮送】的Ai8051U实验箱
=====现在送的,都可以利用MCU自带的 硬件USB直接仿真,硬件USB直接下载
【免费 + 包邮 送】 送/申样/采购 可上班时间加 如下您对应地区的客服 QQ或微信联系
加STC华南区客服司经理QQ: 2234917869 ;微信:18012226298要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服佘经理QQ: 614777595;   微信:18106296591 要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ: 1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ: 2593903262; 微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服吴经理QQ: 1463035472; 微信:19952583954要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服杨经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ; 微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服李经理QQ: 1017142298 ;微信:19952583534要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服曹经理QQ: 3897745450 ;微信:18012226281 要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服吴经理QQ: 1463035472 ;微信:19952583954 要求 【免费+包邮】 送, 还免费教仿真

davidyan 发表于 2025-5-23 13:57:27

<h4>数码管电路连接</h4>
<p><img src="data/attachment/forum/202505/23/115322ajz77gzzzggztz7o.png" alt="b129779d-47ed-4e57-8afe-6775481395d6.png" title="b129779d-47ed-4e57-8afe-6775481395d6.png" /></p>
<p>考虑到芯片的灌电流能力相对强,选择共阳极。不过做好电流限流也是必须的。</p>
<h4>通过74HC595芯片,单线控制多位数码管</h4>
<p><img src="data/attachment/forum/202505/23/115525uqu8yyutt25hhu5b.png" alt="46b22e5a-b726-4d12-9f60-6a8620c82d2f.png" title="46b22e5a-b726-4d12-9f60-6a8620c82d2f.png" /></p>
<p>SCK: 移位,表明要输入下一位</p>
<p>DATA: 数据为,0或1</p>
<p>RCK:将当前数据输出显示到数码管。</p>
<p>74HC595就是将收到的数据缓存8bit,溢出时将溢出的高位数据输出到下一个74HC595,最后一个则直接丢弃即可。</p>
<h4>2个74HC595控制8个数码管</h4>
<p>上门串联的方式控制几个数码管就需要几个74HC595芯片。另一种方式是用一个74HC595控制显示的数字,另一个74HC595用户数码管的选择器。然后通过高频率的点亮被选中的数码管(同时其它数码管为灭),在视觉上造成多个数码管同时显示的效果。</p>
<p><img src="data/attachment/forum/202505/23/133210gqyvmmciy0atn7gg.png" alt="a5b96902-32f5-4ece-a5f2-6166712f2211.png" title="a5b96902-32f5-4ece-a5f2-6166712f2211.png" /></p>
<p>上排数码管引脚由一个595控制,需要主控一个输出引脚;下面数码管引脚需要一个595控制,需要主控一个输出引脚。</p>
<p>知识点,8051单片机中,整型变量左移/右移操作后,高位溢出会自动保存到CY寄存器中。在普通8051单片机中,没有浮点数,也没有高位数的乘除法,需要通过这种溢出位的方式在软件中设计算法实现。</p>
<h4>时间显示</h4>
<ol>
<li>定义计时器,每1s中,内部时间数据加1s,满60s加1分钟,满60分钟加1h,满24h清零</li>
<li>每1ms刷一次,一次将时间数字、分隔符显示到数码管上。</li>
</ol>
<h4>仿真</h4>
<p>有点谜,为啥要为了仿真还要多学一套接口呢?</p>
<h4>总结</h4>
<p>本集写了一个2个595芯片控制8位数码管的驱动程序,然后做了一个时间显示效果。链一下源码以备忘。https://www.stcaimcu.com/forum.php?mod=attachment&amp;aid=NzY0ODR8N2NkZGZmNWV8MTc0Nzk2OTcxMXw0MTE4NXwxMTkwMg%3D%3D</p>

davidyan 发表于 2025-5-23 19:09:06

第10集,仿真模拟器
仿真模拟的原理是在单片机中通过串口发送指令给电脑上位机ISP,ISP解析相关命令并在界面上显示仿真结果。
底层有定好的协议,因为现在库已经封装了这些指令接口,所以不需要专门研究这些数据协议,只要知道去哪里查这些指令接口就行了。
1. include usb头文件,链接相应的lib文件
2. 在ISP软件中查找对应仿真的接口函数

davidyan 发表于 2025-5-24 07:35:22

第11集,实现了一个按键矩阵扫描功能,感觉这个代码很冗,我不喜欢。这集不做总结。

davidyan 发表于 2025-5-24 08:13:14

<p>第12集,复位</p>
<ul>
<li>硬件复位
<ul>
<li>上电复位,通电自动复位</li>
<li>低压复位,电压过低时复位(复位又解决不了低压问题)</li>
<li>复位脚复位,下拉复位脚P4.7</li>
<li>看门狗复位,需要定期喂狗(WDT_FLAG=0),不喂就会被迫复位。相关寄存器:WDT_CONTR</li>
</ul>
</li>
<li>软件复位
<ul>
<li>IAP控制寄存器:IAP_CONTR,进行软复位出发,及设置从哪里开始复位。这是不停电下载的实现基础。
<ul>
<li>系统ISP区:进行下载检测,所有寄存器数据复位</li>
<li>用户系统区:用户数据保留,</li>
<li>用户程序区:用户数据保留,两者什么区别?</li>
</ul>
</li>
</ul>
</li>
</ul>

davidyan 发表于 2025-5-24 10:22:31

<p>51单片机特有的C语法</p>
<ul>
<li>idata, xdata修饰变量的存储区域</li>
<li>sbit: 单位寄存器</li>
<li>sfr: 8位寄存器</li>
<li>far:32位指针(地址)</li>
<li>P2^0: 取寄存器P2的第0位(右边起)</li>
</ul>

davidyan 发表于 2025-5-24 10:34:57

<p>VSCODE开发环境搭建</p>
<p>VSCODE的代码提示、跳转比Keil优秀的多,只是对51本身需要进行一些适配。编译没问题,下载还需要依赖ISP软件。</p>
<ol>
<li>
<p>安装VSCODE,安装VSCODE的C/C++插件</p>
</li>
<li>
<p>安装配置Keil,按网上教程设置</p>
</li>
<li>
<p>安装VSCODE插件Keil uVission Assistant,按照插件说明设置. (另一个人气比较往的Keil Assistant不支持C251)</p>
<p><img src="data/attachment/forum/202505/24/104329znhtj3uq6q6dinnj.png" alt="0c4946a5-f70e-440c-930b-62e441bd2c68.png" title="0c4946a5-f70e-440c-930b-62e441bd2c68.png" /></p>
</li>
<li>
<p>建立一个专门的51工作区,</p>
<ul>
<li>文件 -&gt; 将工作区另存为,保存.code-workspace文件</li>
<li>打开.code-workspace文件,在其中添加</li>
</ul>
<pre><code>&quot;settings&quot;: {
                &quot;C_Cpp.default.defines&quot;:[
                        &quot;__C251__&quot;,
                        &quot;__VSCODE_C251__&quot;
                ],
                &quot;C_Cpp.default.includePath&quot;:[
                        &quot;${workspaceFolder}/**&quot;,
                        &quot;Keil安装目录/C251/INC&quot;,
                        &quot;Keil安装目录/C251/INC/STC&quot;,
                ],
                &quot;files.encoding&quot;: &quot;gbk&quot;
}
</code></pre>
<p><img src="data/attachment/forum/202505/24/104619g9xzrkuijiujx8u0.png" alt="a5b1d54f-d209-4e13-9512-dee3d8b44504.png" title="a5b1d54f-d209-4e13-9512-dee3d8b44504.png" /></p>
</li>
<li>
<p>在VSCODE中,因为51的C语言跟标准C不兼容,而出现一些错误提示。</p>
<ul>
<li>将如下头文件内容放到一个头文件里,头文件可放到项目里或者Keil INC头文件目录中</li>
<li>并在项目主程序一开始的地方include。</li>
<li>其中的__VSCODE_C251__宏是在上面的.code-workspace中定义的,只在vscode环境中生效,不会对keil编译产生影响。</li>
</ul>
<pre><code class="language-#ifdef">#ifdef __VSCODE_C251__
#define INTERRUPT(x)
#define bit BOOL
#define sbit BOOL
#define sfr char
#define xdata
#define far
#else
#define INTERRUPT(x) interrupt x
#endif
</code></pre>
<p><img src="data/attachment/forum/202505/24/104753ujins6on7ulsz49c.png" alt="b4826185-fb2c-42e6-9626-aba19a350fce.png" title="b4826185-fb2c-42e6-9626-aba19a350fce.png" /></p>
</li>
<li>
<p>将Keil项目文件夹加入到VSCODE的工作区,进行开发、编译</p>
<p><img src="data/attachment/forum/202505/24/104945jj2jlnd96vnl7ttc.png" alt="d5d41a8f-aa10-4bf3-ae03-ce54641a9e2d.png" title="d5d41a8f-aa10-4bf3-ae03-ce54641a9e2d.png" /></p>
</li>
</ol>

davidyan 发表于 2025-5-25 08:06:16

<p>第13、14集,中断</p>
<p>中断类型很多,对我目前不是很必需,先做一些总结吧。</p>
<p><a href="https://www.stcaimcu.com/forum.php?mod=redirect&amp;goto=findpost&amp;ptid=18026&amp;pid=166786">中断号列表</a></p>
<p>外部中断(INT)中断类型,触发引脚,中断号,使能,配置</p>
<table>
<thead>
<tr>
<th>中断类型</th>
<th>触发源</th>
<th>信号配置</th>
<th>使能</th>
</tr>
</thead>
<tbody>
<tr>
<td>外部中断INT</td>
<td>INTn引脚</td>
<td>上升沿、下降沿、双边沿</td>
<td>全局,INTx</td>
</tr>
<tr>
<td>端口中断</td>
<td>所有端口<br/>(共享中断号)</td>
<td>上升沿、下降沿、高低电平</td>
<td>全局,端口,端口x</td>
</tr>
<tr>
<td>定时器</td>
<td>时钟</td>
<td>预分频,1/12T分频,C/T=0,<br/>gate(仅T0,T1, 开启后通过INTx使能),<br/>重载模式及重载值(最大值-时钟数),<br/>信号输出(TxCLKO)</td>
<td>全局,定时器x,<br/>GATEx,TxCLKO</td>
</tr>
<tr>
<td>计数器(定时器变种)</td>
<td>Tn引脚</td>
<td>C/T=1,gate,重载模式及重载值,<br/>信号输出(TxCLKO)</td>
<td>同上</td>
</tr>
</tbody>
</table>
<p>定时器原理图</p>
<p><img src="data/attachment/forum/202505/25/080443bzj2fnpepqm92np8.png" alt="f6341036-da37-4640-b7c0-95cbc8c72dd2.png" title="f6341036-da37-4640-b7c0-95cbc8c72dd2.png" /></p>
页: 1 [2] 3
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》||建议提前赠送实验箱