- 博客(17)
- 资源 (6)
- 收藏
- 关注
原创 基于数字频率合成技术的正弦波发生器设计
数字频率合成算法又称为DDS算法,实际上就是信号采样过程的一个逆用。当我们进行信号采样时,会使用一个大于信号频率2倍以上的采样频率去采点,把这个点存储在存储器中,称为波形ROM表。而DDS恰好相反,它是先把波形ROM表制作好,然后以等于采样频率的输出频率输出电压。由于在采样时,原始信号是经过了一个零阶保持器,然后被量化存储到存储器的;所以在输出电压时,也相应的加一个滤波器,把阶梯波滤除,来恢复原信号。 在这样的思想指导下,只要平台具有定时输出不同电压的功能,都能设计波形发生...
2021-07-21 19:40:16
1416
1
原创 C语言实现多人坦克大战
如何用C语言去实现一款小游戏?相信很多初学C的同学,面对控制台输出的"Hello World"感到头疼,甚至觉得学习C语言并没有什么用。其实,C语言也可以方便的实现一个小游戏,下面来看看一个经典的游戏,坦克大战。 如下图所示,是采用C语言编写的字符版坦克大战游戏。其中,坦克分为玩家坦克一辆,和敌方坦克若干。使用电脑键盘控制玩家坦克,按下'W','S','A','D'分别为上、下、左、右移动,按下‘J’可以发射子弹。另外,还有墙壁,方便玩家躲避敌方的进攻。子弹击中坦克,会在原...
2021-07-20 13:02:34
1218
3
原创 傅里叶变换公式的物理意义
在不少的信号处理教材中,都有关于傅里叶变换的公式。但是,却很少有对公式的来由进行说明,仅仅只是用一句“不在教学范围内”草草了事。现在我也并不打算上一大堆公式。我们试着绕开复杂的数学证明,仅仅从感官的角度理解傅里叶变换。我们首先手算一个傅里叶变换。且先假设时域信号xn=[1,0,0,0,0,0,0,0,0,0],即它只在n=0时为1,其它时刻为0。我们可以根据离散信号的傅里叶变换,得出F(w) = 1.也就是说,这个信号的频谱分量非常丰富,不论频率取何值,它都有1的幅度。也就是说,这种类似于针刺的信号
2021-06-30 01:14:59
1165
1
原创 低内存芯片的软件MMU方案
在51单片机编程中,经常出现内存不够用的情况。但是如果使用它的外扩RAM,又必须占用很多引脚,且接线复杂。如何用少量的引脚,对51单片机进行存储器扩展呢?首先我们可以接一个IIC的EEPROM或者Flash等其他的串口存储器。但光是这样,并不能较好的解决问题:因为这种存储器无法当做RAM使用。一般只适合存储一些参数,文件之类的。所以我们还需要继续做一些研究。我们知道,51单片机RAM是128Bytes.有的芯片是256Bytes.大了一点点,但终究是杯水车薪。我们可以外接一个1M的Flash存储器。
2021-05-25 14:35:00
801
原创 基于51单片机的多线程操作系统设计
我知道,在51单片机上运行一个操作系统,大多数情况下并不实用。但51单片机广为人知。所以我认为,用它来逐步的实现一个多线程操作系统,使得读者以更多的精力思考操作系统的设计,弱化芯片本身的概念。此处以STC89C52RC芯片为硬件平台,Keil5为编译平台,来实现一个简易的操作系统。实现一个多线程RTOS,前提是实现线程切换。毕竟,多线程实际上就是芯片不断的在线程之间切换执行的结果。通常的实现方法,是通过中断机制。中断时,芯片会保存现场,然后开始执行中断服务程序。我们在中断服务程序中,把所谓的“现场”偷偷
2021-05-23 17:08:44
9379
3
原创 C语言基于字符的计算
我们经常使用C语言来计算算式,甚至直接使用它来设计计算器。在这个过程中,不可避免的遇到一个问题,就是C语言数据类型对计算的限制。我们知道float类型是有一个精确度的,并不是有多少个小数位都能精确计算;即便换成double类型,也只能说精确度提升了,但仍然不能说完全准确。很多人怕麻烦,干脆所有小数都尽量扩大成整型计算。但整型Int有一个数据范围大小,太大的数字无法处理。所以基于字符的计算应运而生,它是把数字以字符串的形式存放,处理后的结果也是字符串,以字符串为载体进行运算。而字符串的长度,是可以定义的,理论
2021-05-19 11:41:29
1013
原创 C语言计算三角函数
最近接触到CORDIC算法,说是一种使用迭代去计算三角函数的做法。我看了原理,感觉写的晦涩难懂,但本质上先计算一个小角度,然后从小角度的基础上慢慢增加,从而得出大角度的值。但是我转念一想,既然大角度的值可以分解为小角度来计算,我何必搞得这么复杂呢?我们知道sin(A+B) = sin(A)*cos(B)+cos(A)*sin(B);cos(A+B) = cos(A)*cos(B)-sin(A)*sin(B);假设我需要计算sin(30).那么由于:sin(2)=sin(1+1)= sin
2021-04-29 16:37:25
12569
1
原创 C语言大数字运算
什么是大数字运算?一般的C语言数据类型,如float,double,总是有数值范围的,不可能无限大。就算float这样的数据类型,可表示的数据范围已经很大了,可是它的小数点精度也非常有限,算出来的结果总是不太准确。于是人们在计算有限小数时,干脆把数字扩大10、扩大100...然后当成整形来计算。可是int的范围更加有限。于是想出了用字符串来存储数字,直接在字符串上进行运算得出结果的想法。由于字符串的长度是可以设置的,理论上只要内存足够,数字就可以无限大。这就是大数字四则运算。在大数字四则运...
2021-04-27 17:04:02
2611
原创 用数组方式实现的链表
链表是一种常用的线性表,可以快捷的进行插入和删除。但在常规的做法中,这些操作需要有动态内存分配的支持。偏偏有些编程环境,想要动态内存分配的话,需要额外添加一些库文件,比较繁琐。如何在没有动态内存分配函数的情况下,实现链表的随机删除和插入特性呢?首先,定义一个链表的节点。typedef struct Node{ }...
2021-04-26 11:46:02
4766
原创 Linux设备驱动思想在STM32编程中的应用
这几天看了一下Linux设备驱动,发现这套思想其实也可以用在普通的单片机编程上。这种思想较好的分割了驱动层和应用层的任务,方便分层开发。以前,我们开发STM32驱动的时候,会给设备写一套函数来控制它。假设现在有一块单片机开发板,外接设备UART和LCD。我们会这样写函数-----------------UART驱动--------------void UART_Init();int UART_Send(const char *str,int size);int UART_Rec(ch
2021-04-17 09:35:31
1101
2
原创 基于单片机的LCD菜单设计
在小型的单片机设备中,需要使用LCD菜单进行人机交互。对于这种交互的实现,一来无需像在手机上做APP一样,做出花哨的界面效果;二来这种小设备也不支持那样太消耗资源的界面系统。所以这种场合下,需要我们亲自使用C语言去编写一套精简的界面框架代码。定义菜单项的数据类型一个菜单项,有自身的唯一标志码ID,和显示的字符串ItemDisplayStr,和选中它时执行的函数ItemFun。但仅仅这样还不够,因为很多菜单项之间是有逻辑关联的。在一个菜单项下点击跟进、回退,都会转到不同的页面。所以还需要有表...
2021-02-21 13:37:02
3869
原创 对传统PID控制算的优化改善
针对传统PID控制算法的优化 一,原理图根据原理图,MCU通过输出0~100%占空比的PWM来控制温度;通过ADC0808来采集温度二,PID控制代码void PIDCalu(PID_para *pid ){ pid->Yn = 0.3906*GetADC(); pid->En = pid->Rn - pid->Yn; pid->SumOfEn += Pid.En; pid->...
2021-02-21 11:44:54
1820
原创 STM32进入HardFault的调试方法
STM32进入HardFault的调试方法我们在设计STM32程序时,经常由于内存越界等,使得程序意外进入了HardFault中断。但我们一时半会又不知道,这个中断,究竟是代码运行到哪里,才触发的。常规的做法,我们只能在线调试,一步步寻找异常点,但由于发生异常的时机是不确定的,有可能在线调试的时候就不出现异常了,所以相当头疼。但本文介绍一种方法,可以直接定位到异常点,节省排查问题的时间。这个方法的关键是,由于STM32中断前会由硬件保护现场,这个所谓的“现场”正是中断前程序运行的位置。我..
2021-02-04 21:34:23
4441
4
原创 ARM C语言的裸机开发
本文介绍如何搭建一个ARM实验环境今天,我看了某些教程,做了一个C语言的,裸机开发ARM的实验。但我依然觉得教程讲得过于复杂,没有在最少的篇幅内讲清楚实验的来龙去脉。我根据自己的理解,记录实验过程如下。我使用的芯片是IMX6ULL,以下简称"芯片"。芯片刚上电,会执行内部的ROM,把代码从SD卡复制到运行地址,然后从运行地址处开始执行。这里设定运行地址为=0x87800000.它位于DDR中,开发板的DDR地址范围是(0X80000000~0X9FFFFFFF)。如此一来,在ARM上用.
2020-09-29 18:09:37
752
原创 ARM的纯汇编实验(001)-LED闪烁
这篇文章的内容是记录笔者学习ARM时的第一次汇编语言实验,LED闪烁我从淘宝买了一块主控制芯片为IMX6ULL(之后简称芯片)的开发板,上面有很多外设。但我想,学习开发的第一步是点亮一个LED。一,硬件原理分析我首先把开发板的电路原理图打开,查看这个LED与我们的芯片是如何建立物理联系的;这样我们才能知道如何控制它。连接LED的引脚被称为"LED0"。所以我们知道对应关系是LED0 = 0时,亮;LED0=1时,灭。但LED0依然不是连接到芯片的引脚名,我在原理图中跟踪到,LED0又
2020-09-23 17:24:27
2155
原创 ARM 汇编和C语言代码的相互调用
汇编和C语言混合编程是一种常见的技术。这里以MDK5.23,ARM工程为环境进行实验。(至于如何使用MDK搭建ARM汇编语言实验环境,令一个)该形式分为三种:1.在.c文件中嵌入汇编代码void my_strcpy(char *src,char *dest){ char ch; __asm //1.C代码中嵌入汇编代码 { loop: LDRB ch,[src],#1 STRB ch,[dest],#1 ...
2020-09-21 15:50:56
2447
2
原创 ARM纯汇编实验环境的搭建
本文讲解,如何通过MDK进行ARM纯汇编实验环境的搭建。有时需要进行ARM纯汇编代码的学习,却苦于没有一个能实际操作的环境。本文使用MDK5.23完成ARM纯汇编实验平台的搭建。1,首先新建一个ARM的工程。我以STM32F103VET6(后面简称芯片)为例子。按照正常新建工程的流程即可,但需要注意以下设置a.设置IROM1和IRAM1的参数。为什么要设置这些数值?这是根据芯片的参数来的,这款芯片的确就是这个参数,这没什么好玄乎的,可以查查芯片手册。b.设置...
2020-09-17 15:59:56
1112
单片机LCD12864下的页面式菜单设计.rar
2020-09-17
学生信息管理系统C语言
2019-02-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人