• 学习STM32必备:为什么要学习汇编语言?

    不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了

    4小时前 17浏览
  • 深入分析MCU堆栈空间:基于Keil MDK的探索与优化策略解析

    堆栈对于程序来说非常重要,程序能够快速运行,堆栈起到非常大的作用,但你了解堆栈吗?概述我们都知道堆栈位于RAM中,现在MCU的RAM相对较大(几十上百K),所以分配的堆栈也是足够大,很多人都不怎么关...

    12-04 39浏览
  • 为什么学习STM32

    STM32在大陆生态良好,学习参考资料丰富,很多公司都在用它开发产品。

    12-04 24浏览
  • 详解STM32的时钟系统:全面解析及应用实例

    STM32的时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。

    12-04 36浏览
  • 单片机编程中如何选择适当的头文件:有效管理和利用编程资源

    问: 初学单片机编程,在书上看到对于单片机的编程,无论是汇编还是C语言,都需要引入一个和板子相匹配的头文件,比如书中例子就有:#include。但是我想以后我随便拿到一块板子,我怎么确定对于这个板子编程使用的头文件名字呢? 答: 其实这个头文件与你的单片机型号是对应的 比如51单片机 芯片有AT89C51,AT89C52,AT89S51,AT89S52那么你在keil编译软件中都可以用reg52.h这个头文件, 因应他的内核是一样的,不同的只是flash大小ram大小,还有一些外设吧 所以要确定头文件,必须知道编译环境还有芯片.

    12-01 47浏览
  • WM341 & SWM34S系列MCU环境配置指南:快速设置开发环境以实现顺畅的开发流程

    华芯微特MCU的系列之SWM341&SWM34S,内核相同,34S在341基础上内置了SDRAM。341芯片使用M33内核,基于ARM-V8指令集的架构,对应的工具版本有更高的要求,详细如下:01、Keil 版本建议在v5.33以上,...

    12-01 49浏览
  • 在Keil5中创建基于寄存器的STM32工程:详细步骤及注意事项解析

    Keil5中新建基于寄存器的LED工程

    12-01 35浏览
  • 单片机模拟串口方案:延时法、计数法、中断法

    随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。 本文所说的模拟串口, 就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的时间越短。如波特率为9600BPS,即每一位传送时间为1000ms/9600=0.104ms,即位与位之间的延时为为0.104毫秒。单片机的延时是通过执行若干条指令来达到目的的,因为每条指令为1-3个指令周期,可即是通过若干个指令周期来进行延时的,单片机常用11.0592M的的晶振,现在我要告诉你这个奇怪数字的来历。用此频率则每个指令周期的时间为(12/11.0592)us,那么波特率为9600BPS每位要间融多少个指令周期呢?指令周期s=(1000000/9600)/(12/11.0592)=96,刚好为一整数,如果为4800BPS则为96x2=192,如为19200BPS则为48,别的波特率就不算了,都刚好为整数个指令周期,妙吧。至于别的晶振频率大家自已去算吧。现在就以11.0592M的晶振为例,谈谈三种模拟串口的方法。 51单片机三种模拟串口的设计方案解析 方法一:延时法 通过上述计算大家知道,串口的每位需延时0.104秒,中间可执行96个指令周期。 #define uchar unsigned char sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; #define RXD P1_0 #define TXD P1_1 #define WRDYN 44 //写延时 #define RDDYN 43 //读延时 //往串口写一个字节 void WByte(uchar input) { uchar i=8; TXD=(bit)0; //发送启始位 Delay2cp(39); //发送8位数据位 while(i--) { TXD=(bit)(input&0x01); //先传低位 Delay2cp(36); input=input》》1; } //发送校验位(无) TXD=(bit)1; //发送结束位 Delay2cp(46); } //从串口读一个字节 uchar RByte(void) { uchar Output=0; uchar i=8; uchar temp=RDDYN; //发送8位数据位 Delay2cp(RDDYN*1.5); //此处注意,等过起始位while(i--) { Output 》》=1; if(RXD) Output |=0x80; //先收低位 Delay2cp(35); //(96-26)/2,循环共占用26个指令周期} while(--temp) //在指定的时间内搜寻结束位。 { Delay2cp(1); if(RXD)break; //收到结束位便退出 } return Output; } //延时程序* void Delay2cp(unsigned char i) { while(--i); //刚好两个指令周期。 } 此种方法在接收上存在一定的难度,主要是采样定位存在需较准确,另外还必须知道每条语句的指令周期数。此法可能模拟若干个串口,实际中采用它的人也很多,但如果你用Keil C,本人不建议使用此种方法,上述程序在P89C52、AT89C52、W78E52三种单片机上实验通过。 方法二:计数法 51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。 //计数器初始化 void S2INI(void) { TMOD |=0x02; //计数器0,方式2 TH0=0xA0; //预值为256-96=140,十六进制A0 TL0=TH0; TR0=1; //开始计数 TF0=0; } void WByte(uchar input) { //发送启始位 uchar i=8; TR0=1; TXD=(bit)0; WaitTF0(); //发送8位数据位 while(i--) { TXD=(bit)(input&0x01); //先传低位 WaitTF0(); input=input》》1; } //发送校验位(无) //发送结束位 TXD=(bit)1; WaitTF0(); TR0=0; } //查询计数器溢出标志位 void WaitTF0( void ) { while(!TF0); TF0=0; } 接收的程序,可以参考下一种方法,不再写出。这种办法个人感觉不错,接收和发送都很准确,另外不需要计算每条语句的指令周期数。 方法三:中断法 中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位,当然程序中需对中断进行初始化,同时编写中断程序。本程序使用Timer0中断。 #define TM0_FLAG P1_2 //设传输标志位 //计数器及中断初始化 void S2INI(void) { TMOD |=0x02; //计数器0,方式2 TH0=0xA0; //预值为256-96=140,十六进制A0 TL0=TH0; TR0=0; //在发送或接收才开始使用 TF0=0; ET0=1; //允许定时器0中断 EA=1; //中断允许总开关 } //接收一个字符 uchar RByte() { uchar Output=0; uchar i=8; TR0=1; //启动TImer0 TL0=TH0; WaitTF0(); //等过起始位 //发送8位数据位 while(i--) { Output 》》=1; if(RXD) Output |=0x80; //先收低位 WaitTF0(); //位间延时 } while(!TM0_FLAG) if(RXD) break; TR0=0; //停止TImer0 return Output; } //中断1处理程序 void IntTImer0() interrupt 1 { TM0_FLAG=1; //设置标志位。 } //查询传输标志位 void WaitTF0( void ) { while(!TM0_FLAG); TM0_FLAG=0; //清标志位 } 中断法也是我推荐的方法,和计数法大同小异。发送程序参考计数法,相信是件很容易的事。另外还需注明的是本文所说的串口就是通常的三线制异步通信串口(UART),只用RXD、TXD、GND。

    11-29 60浏览
  • 设计4个16×16点阵LED模块组成的显示屏

    LED显示屏广泛应用于工矿企业、学校、商场、店铺、公共场所等进行图文显示,广告宣传,信息发布。本文设计一种由4个16×16点阵LED模块组成的显示屏,由单片机作控制器,平滑移动显示任意多个文字或图形符号,本电路可级联扩展实现由任意多个16×16点阵LED模块组成的显示屏。 1 电路设计 控制电路由AT89C51单片机作控制器,显示屏由4个16×16点阵LED模块组成,每个16×16点阵LED模块由4个8×8点阵LED模块组成,用户可根据需要扩展增加任意多个16×16点阵LED模块。8×8点阵LED模块结构如图1所示,共8行8列,每个发光二极管放置在行线和列线的交叉点上,共64个发光二极管。当某一列为高电平,某一行为低电平时,则对应的发光二极管点亮。 单片机P3.0引脚接串入并出移位寄存器74LS164(U10)的串行数据输入端,8个74LS164(U10~U17)级联,P3.1引脚接8个74LSl64的时钟脉冲输入端;8个74LS164分别接8个锁存器74LS373(U18~U25),8个锁存器的数据输出端接4个16×16点阵LED模块的行线,每个16×16点阵LED模块的行线是独立控制的。P1.O接8个74LS164(U2~U9)的时钟脉冲输入端,P1.1接U2、U4、U6、U8的串行数据输入端,每两个74LSl64(U2和U3,U4和U5,U6和U7,U8和U9)级联;U2~U9的并行数据输出端接4个16×16点阵LED模块的64条列线。P1.2接所有74LSl64的清0端,P1.3接锁存器的锁存控制端。 2 工作原理 本电路利用串行通信口工作于方式0,同时利用P1.O和P1.1模拟串行输出,来实现LED显示屏字符平滑移动显示。由于LED模块为16× 16点阵,所以字符点阵也为16×16点阵,即每个字符由32个字节即16个字数据组成,每个字数据决定了每列LED点亮的情况。16×16点阵字符数据由字符点阵提取软件获得。 首先单片机P1.1串行输出一位二进制位“1”,经4组74LSl64给4个16×16点阵LED模块的第1列送入一高电平,接着由P3.O串行输出4个16×16点阵LED模块的第1列行数据,即Y1,Y17,Y33,Y49列的行数据,经74LS373锁存后送LED显示屏的行线,此时每个LED模块第1列对应的LED点亮。每列的行数据为1个字数据,4列共4个字数据,每个字数据首字节在字符点阵数据表中的地址相差32,此时每个LED模块显示每个字符的第1列。接着P1.1串行输出一位二进制位“0”,经4组74LS164移位后给4个LED模块的第2列送入一高电平,再由P3.O串行输出4个16× 16点阵LED模块的第2列行数据,即Y2,Y18,Y34,Y50列的行数据,经74LS373锁存后送LED显示屏的行线,此时每个LED模块第2列对应的LED点亮,即显示每个字符的第2列。如此循环,依次点亮每个LED模块每列对应的LED,直到点亮每个LED模块的第16列,即依次显示每个字符的各列。只要每列交替显示的时间适当,利用人眼的视觉暂留特性,看上去16列LED同时点亮,即看上去整个字符同时显示。然后再从第1列依次扫描显示至16列,如此循环多次,以确保显示出的字符具有足够的亮度。 为实现字符平滑移动显示的效果,在上面实现的4个字符静态显示一定时间后,再次扫描显示时,每个LED模块的第1列从每个字符的第2列数据开始扫描显示,即第1个LED模块显示第1个字符的第2列、第3列、……、第16列和第2个字符的第1列,第2个LED模块显示第2个字符的第2列、第3列、……、第16列和第3个字符的第1列、第2列、……。当第三次扫描显示时,每个LED模块的第1列从每个字符的第3列数据开始扫描显示,即第1个LED模块显示第1个字符的第3列、第4列、……、第16列和第2个字符的第1列、第2列,第2个LED模块显示第2个字符的第3列、第4列、……、第16列和第3个字符的第1列、第2列、……。如此实现了字符的平滑移动显示。 3 程序设计 根据以上电路设计及工作原理,绘制出本电路的控制程序流程图。按程序流程图编写出控制程序,用Wave或Keil软件调试通过后,产生目标代码文件。 4 电路仿真 将目标代码文件加入用Proteus软件绘制的LED显示屏控制电路仿真图中的单片机中,仿真运行,运行结果如图4所示。 基于AT89C51单片机控制LED显示屏的电路设计 5 结语 该LED显示屏控制电路用单片机作为控制器,采用串行移位输出方式,实现了一行字符的平滑移动显示,在实际应用时还应加上相关驱动电路。本电路可扩展实现由任意多个16×16点阵LED模块组成的LED显示屏显示控制。经实际应用表明,该电路稳定可靠,效果良好。

    11-29 44浏览
  • 基于CW32的L9110风扇模块应用案例:实现智能风扇控制与优化

    例程资料链接如下:BD网盘链接:链接:https://pan.baidu.com/s/1nkBLRwc6rv2qnBTfgyBdgQ提取码:1kxe一、简介 1. L9110风扇模块是一种常见的电机驱动模块,可以用于控制小型直流风扇的转动,常被用于:...

    11-28 61浏览
正在努力加载更多...
EE直播间
更多
广告