发帖数

53

原创数

53

关注者

11

阅读数

9260

点赞数

1

黄忠

  • 51单片机DIY抽奖-技术分享(一)

       

    想着年底临近了一年一度的年会都开始陆续开始了,抽奖的方式算是样式很多了,我们在商场看到过那种转盘抽奖自己用力让它转起来然后停下来指针指向哪里就是奖项的结果了这种是常见的了再有就是我们年会抽奖箱更是常见的基本都是一个抽奖箱,里面放了跟发放到自己手里的号牌是一样的一组序号,抽到哪个对照就可以了,这样是最传统的了,我想着能做个DIY效果的抽奖器,不是好玩又实用吗?想到就来做,外形呢可以仿照商场那种转盘样式,两个按键就够了,开始和停止啊,然后就是数字显示了,想着先实现以下,就做了两位数码管的样式,DIY效果嘛,就选择了LED(主要还有便宜哦),这样其实占用单片机管脚还是多了,资料搜索和同事推荐,选择了好用还实惠的一款芯片(CH455G),太好用了,显示和按键只要一个I2C接口就够了,这款芯片简直解决了大问题,主要的管脚确定了,然后我想做个抽奖结束可以唱歌,可以通过蜂鸣器实现,写个谱子和调调就可以了,这个还是要下功夫来研究下的,对于我这个五音不全的人来说简直是难到不行啊,既然想做到有创意,我还是硬着头皮上的啊,不能太死板了吧,做小东西可以很好玩的。

       转盘效果我们知道是人为转起来,有转的效果,那我既然做这个,就可以显示数字快速轮训显示,然后周边做一圈不同颜色的LED快速轮转就可以了,那这样是不是光脑子想想都觉得好玩呢。

    既然大体的都想到了,最后就是根据需求来定单片机了,显示和按键需求最大的都解决了,我就可以选择一款管脚少的单片机了,我选择了下面这款:

    图片7.jpg

    下面是管脚图:

    图片8.jpg


       附件内我放了这款单片机的数据手册,有需要的可以自行下载啊,没准就是很适合你做项目的款呢。

       现在我们知道大部分产品都是用USB供电,那我这个小产品也选择用USB供电(要紧跟潮流啊),这款单片机好的一点是用串口下载和仿真,其实性价比还是很好的啊,之前我做过一款USBTTL,刚好这里用上了。

       到这里万事俱备了,那就开干了,先把选择好的芯片数据手册研读好,不能觉得简单就直接进入设计,每个芯片的规则不一样,还是要认真点好,不然做出板子又出问题不是更麻烦吗(费时费力还费钱不是)。芯片手册需要的部分很有必要反复确认,然后就开始我的设计之旅了,哇,想想成品都是开心的,接下来就是原理图设计和PCB画板了,原理图设计还要把控好一些电阻电容的部分,话不多说,我会持续分享我后面踩坑避坑的过程,如果有兴趣的就关注我这个产品的实现过程吧,过程坎坷又收货满满。如果有其他想法的可以跟我交流啊,下个DIY可能会更有思路了呢。


    附件资料领取:

    163272329500046e4.pdf


    收藏 0 回复 0 浏览 36
  • ​单片机C语言程序的存储区域解读


    C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-链接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,链接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。

    C语言编写的程序经过编译-链接后,将形成一个统一文件,它由几个部分组成。在程序运行时又会产生其他几个部分,各个部分代表了不同的存储区域:

    1、代码段(CodeText

    代码段由程序中执行的机器代码组成。在C语言中,程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段的每一条机器代码,并由处理器依次运行。

    2、只读数据段(RO data

    只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置在只读存储器中即可。

    3、已初始化读写数据段(RW data

    已初始化数据是在程序中声明,并且具有初值的变量,这些变量需要占用存储器的空间,在程序执行时它们需要位于可读写的内存区域内,并具有初值,以供程序运行时读写。

    4、未初始化数据段(BSS

    未初始化数据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间。

    5、堆(heap

    堆内存只在程序运行时出现,一般由程序员分配和释放。在具有操作系统的情况下,如果程序没有释放,操作系统可能在程序(例如一个进程)结束后回收内存。

    6、栈(stack

    栈内存只在程序运行时出现,在函数内部使用的变量、函数的参数以及返回值将使用栈空间,栈空间由编译器自动分配和释放。

    C语言目标文件的内存布局如下图:

    图片32.png

    代码段、只读数据段、读写数据段、未初始化数据段属于静态区域,而堆和栈属于动态区域。代码段、只读数据段和读写数据段将在连接之后产生,未初始化数据段将在程序初始化的时候开辟,而堆和栈将在程序的运行中分配和释放。

    C语言程序分为映像和运行时两种状态。在编译-链接后形成的映像中,将只包含代码段(Text)、只读数据段(RO Data)和读写数据段(RW Data)。在程序运行之前,将动态生成未初始化数据段(BSS),在程序的运行时还将动态形成堆(Heap)区域和栈(Stack)区域。

    一般来说,在静态的映像文件中,各个部分称之为节(Section),而在运行时的各个部分称之为段(Segment)。如果不详细区分,可以统称为段。

    每一个源文件生成的目标代码有了这些段的区分,那么每个段就能表示出源文件想要表达的信息和功能。下一篇我们一起深入分析下在这些段中是怎么体现的源码的信息的。


    收藏 1 回复 0 浏览 33
×
黄忠