自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 资源 (6)
  • 收藏
  • 关注

原创 基于数字频率合成技术的正弦波发生器设计

数字频率合成算法又称为DDS算法,实际上就是信号采样过程的一个逆用。当我们进行信号采样时,会使用一个大于信号频率2倍以上的采样频率去采点,把这个点存储在存储器中,称为波形ROM表。而DDS恰好相反,它是先把波形ROM表制作好,然后以等于采样频率的输出频率输出电压。由于在采样时,原始信号是经过了一个零阶保持器,然后被量化存储到存储器的;所以在输出电压时,也相应的加一个滤波器,把阶梯波滤除,来恢复原信号。 在这样的思想指导下,只要平台具有定时输出不同电压的功能,都能设计波形发生...

2021-07-21 19:40:16 1054 1

原创 C语言实现多人坦克大战

如何用C语言去实现一款小游戏?相信很多初学C的同学,面对控制台输出的"Hello World"感到头疼,甚至觉得学习C语言并没有什么用。其实,C语言也可以方便的实现一个小游戏,下面来看看一个经典的游戏,坦克大战。 如下图所示,是采用C语言编写的字符版坦克大战游戏。其中,坦克分为玩家坦克一辆,和敌方坦克若干。使用电脑键盘控制玩家坦克,按下'W','S','A','D'分别为上、下、左、右移动,按下‘J’可以发射子弹。另外,还有墙壁,方便玩家躲避敌方的进攻。子弹击中坦克,会在原...

2021-07-20 13:02:34 1036 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 1030 1

原创 低内存芯片的软件MMU方案

在51单片机编程中,经常出现内存不够用的情况。但是如果使用它的外扩RAM,又必须占用很多引脚,且接线复杂。如何用少量的引脚,对51单片机进行存储器扩展呢?首先我们可以接一个IIC的EEPROM或者Flash等其他的串口存储器。但光是这样,并不能较好的解决问题:因为这种存储器无法当做RAM使用。一般只适合存储一些参数,文件之类的。所以我们还需要继续做一些研究。我们知道,51单片机RAM是128Bytes.有的芯片是256Bytes.大了一点点,但终究是杯水车薪。我们可以外接一个1M的Flash存储器。

2021-05-25 14:35:00 588

原创 基于51单片机的多线程操作系统设计

我知道,在51单片机上运行一个操作系统,大多数情况下并不实用。但51单片机广为人知。所以我认为,用它来逐步的实现一个多线程操作系统,使得读者以更多的精力思考操作系统的设计,弱化芯片本身的概念。此处以STC89C52RC芯片为硬件平台,Keil5为编译平台,来实现一个简易的操作系统。实现一个多线程RTOS,前提是实现线程切换。毕竟,多线程实际上就是芯片不断的在线程之间切换执行的结果。通常的实现方法,是通过中断机制。中断时,芯片会保存现场,然后开始执行中断服务程序。我们在中断服务程序中,把所谓的“现场”偷偷

2021-05-23 17:08:44 7542 3

原创 C语言基于字符的计算

我们经常使用C语言来计算算式,甚至直接使用它来设计计算器。在这个过程中,不可避免的遇到一个问题,就是C语言数据类型对计算的限制。我们知道float类型是有一个精确度的,并不是有多少个小数位都能精确计算;即便换成double类型,也只能说精确度提升了,但仍然不能说完全准确。很多人怕麻烦,干脆所有小数都尽量扩大成整型计算。但整型Int有一个数据范围大小,太大的数字无法处理。所以基于字符的计算应运而生,它是把数字以字符串的形式存放,处理后的结果也是字符串,以字符串为载体进行运算。而字符串的长度,是可以定义的,理论

2021-05-19 11:41:29 887

原创 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 11624

原创 C语言大数字运算

什么是大数字运算?一般的C语言数据类型,如float,double,总是有数值范围的,不可能无限大。就算float这样的数据类型,可表示的数据范围已经很大了,可是它的小数点精度也非常有限,算出来的结果总是不太准确。于是人们在计算有限小数时,干脆把数字扩大10、扩大100...然后当成整形来计算。可是int的范围更加有限。于是想出了用字符串来存储数字,直接在字符串上进行运算得出结果的想法。由于字符串的长度是可以设置的,理论上只要内存足够,数字就可以无限大。这就是大数字四则运算。在大数字四则运...

2021-04-27 17:04:02 2434

原创 用数组方式实现的链表

链表是一种常用的线性表,可以快捷的进行插入和删除。但在常规的做法中,这些操作需要有动态内存分配的支持。偏偏有些编程环境,想要动态内存分配的话,需要额外添加一些库文件,比较繁琐。如何在没有动态内存分配函数的情况下,实现链表的随机删除和插入特性呢?首先,定义一个链表的节点。typedef struct Node{ }...

2021-04-26 11:46:02 4586

原创 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 826 2

原创 基于单片机的LCD菜单设计

在小型的单片机设备中,需要使用LCD菜单进行人机交互。对于这种交互的实现,一来无需像在手机上做APP一样,做出花哨的界面效果;二来这种小设备也不支持那样太消耗资源的界面系统。所以这种场合下,需要我们亲自使用C语言去编写一套精简的界面框架代码。定义菜单项的数据类型一个菜单项,有自身的唯一标志码ID,和显示的字符串ItemDisplayStr,和选中它时执行的函数ItemFun。但仅仅这样还不够,因为很多菜单项之间是有逻辑关联的。在一个菜单项下点击跟进、回退,都会转到不同的页面。所以还需要有表...

2021-02-21 13:37:02 3194

原创 对传统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 1627

原创 STM32进入HardFault的调试方法

STM32进入HardFault的调试方法我们在设计STM32程序时,经常由于内存越界等,使得程序意外进入了HardFault中断。但我们一时半会又不知道,这个中断,究竟是代码运行到哪里,才触发的。常规的做法,我们只能在线调试,一步步寻找异常点,但由于发生异常的时机是不确定的,有可能在线调试的时候就不出现异常了,所以相当头疼。但本文介绍一种方法,可以直接定位到异常点,节省排查问题的时间。这个方法的关键是,由于STM32中断前会由硬件保护现场,这个所谓的“现场”正是中断前程序运行的位置。我..

2021-02-04 21:34:23 3909 4

原创 ARM C语言的裸机开发

本文介绍如何搭建一个ARM实验环境今天,我看了某些教程,做了一个C语言的,裸机开发ARM的实验。但我依然觉得教程讲得过于复杂,没有在最少的篇幅内讲清楚实验的来龙去脉。我根据自己的理解,记录实验过程如下。我使用的芯片是IMX6ULL,以下简称"芯片"。芯片刚上电,会执行内部的ROM,把代码从SD卡复制到运行地址,然后从运行地址处开始执行。这里设定运行地址为=0x87800000.它位于DDR中,开发板的DDR地址范围是(0X80000000~0X9FFFFFFF)。如此一来,在ARM上用.

2020-09-29 18:09:37 627

原创 ARM的纯汇编实验(001)-LED闪烁

这篇文章的内容是记录笔者学习ARM时的第一次汇编语言实验,LED闪烁我从淘宝买了一块主控制芯片为IMX6ULL(之后简称芯片)的开发板,上面有很多外设。但我想,学习开发的第一步是点亮一个LED。一,硬件原理分析我首先把开发板的电路原理图打开,查看这个LED与我们的芯片是如何建立物理联系的;这样我们才能知道如何控制它。连接LED的引脚被称为"LED0"。所以我们知道对应关系是LED0 = 0时,亮;LED0=1时,灭。但LED0依然不是连接到芯片的引脚名,我在原理图中跟踪到,LED0又

2020-09-23 17:24:27 1777

原创 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 2185 2

原创 ARM纯汇编实验环境的搭建

本文讲解,如何通过MDK进行ARM纯汇编实验环境的搭建。有时需要进行ARM纯汇编代码的学习,却苦于没有一个能实际操作的环境。本文使用MDK5.23完成ARM纯汇编实验平台的搭建。1,首先新建一个ARM的工程。我以STM32F103VET6(后面简称芯片)为例子。按照正常新建工程的流程即可,但需要注意以下设置a.设置IROM1和IRAM1的参数。为什么要设置这些数值?这是根据芯片的参数来的,这款芯片的确就是这个参数,这没什么好玄乎的,可以查查芯片手册。b.设置...

2020-09-17 15:59:56 921

STC89C52单片机PID温度控制仿真.pdf

单片机,PID温度控制仿真

2020-12-24

单片机LCD12864下的页面式菜单设计.rar

在单片机+LCD12864上实现翻页菜单逻辑的一套源码。可以实现菜单的选择,跟进,回退。代码扩展性好,非常方便新增和删除菜单,便于代码的维护。此外,显示字符的函数和具体的菜单逻辑是分开的,所以代码方便移植。此代码在51单片机移植成功,且能在Windows控制台进行仿真运行,各有一套工程文件。

2020-09-17

基于51单片机的正弦波发生器.rar

51单片机,正弦信号发生器。频率 0 -200Hz可调,步进 0.5Hz。 包含C语言代码 和 电路仿真图。

2019-05-12

贪吃蛇C语言设计源代码___

C语言设计 VC6.0编译器可以编译执行 贪吃蛇源码(带地图)

2019-02-09

学生信息管理系统C语言

文件名称: *.c 3 文件描述: 链表 + 文件 简易的学生信息管理系统 4 编译环境: Windows 7.0 _ VC6.0 或者 DEV 5.9.2 5 最后修改: 6 功 能: 查找 显示 修改 删除 存档 学生信息 7 说 明: 存档在C:\\student_file.txt

2019-02-05

C语言实践项目_俄罗斯方块游戏

C语言,彩色显示,俄罗斯方块 电脑操作系统: Windows 7 64位 编译环境: DOSBOX0.74 TC2.0

2019-02-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除