打印
[51单片机]

从单片机基础到程序框架(连载)

[复制链接]
楼主: jianhong_wu
手机看帖
扫描二维码
随时随地手机跟帖
81
jianhong_wu|  楼主 | 2016-2-28 11:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 jianhong_wu 于 2016-3-25 00:22 编辑

第六节:把.c源代码编译成.hex机器码的操作流程。
第六节_pdf文件.pdf (406.18 KB)

【6.1   详细步骤。】

         第一步:启动keil2软件。
         双击桌面”keil uVision2”的图标启动keil2软件。

----------------------------------步骤之间的分割线----------------------------------------

         第二步:关闭默认被打开的已有工程。
         启动keil2软件后,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程让keil2软件处于“空”的状态,如果没有发现此软件默认打开已有工程,这一步可以忽略跳过。关闭已有工程的操作是这样子的:点击上面”Project”选项,在弹出的下拉菜单中选择“Close Project”即可。这时keil2软件处于“空”的状态,没有打开任何工程了。

----------------------------------步骤之间的分割线----------------------------------------

         第三步:打开一个现成的工程。
        点击上面”Project”选项,在弹出的下拉菜单中选择“Open Project”,在弹出的文件对话框中,找到需要被打开工程文件夹(本例程是上一节在D盘下建的“stc89c52rc”文件夹),在此文件夹目录下单击选中“stc89c52rc.Uv2”这个工程文件名,然后点击“打开”,就可以打开一个现有的工程文件了。

----------------------------------步骤之间的分割线----------------------------------------

         
                                 图6.1.4.1


         
                                 图6.1.4.2

         第四步:设置编译环境让keil2软件允许产生.hex格式的机器码文件。
         鼠标右键点击选中左边选项框里面的”Target 1”选项,在右键下拉菜单中选择“  Options for Target‘Target 1’ ”选项,弹出一个编译环境设置对话框,左键单击上面子菜单切换到“Output”窗口下,把“Create Hex File”勾选上。点击“确定”。

     
   补充说明:
       (1)这个选项很重要,必须把“Create Hex File”选项勾上,否则后续的操作不能在工程文件夹的目录里生成.Hex的机器码文件。对于一个文件夹的工程模板,只需要设置一次就可以保存起来了,下次开电脑重新打开此工程模板时不需要再设置,这些被设置的参数都是能掉电保存起来的。


----------------------------------步骤之间的分割线----------------------------------------


         
                                 图6.1.5.1

         第五步:启动编译。
         在确保stc89c52rc.c源文件里面有C语言源代码的情况下(如果没有,请先复制上一节的例程源代码),点击上面”Project”选项,在弹出的下拉菜单中点击“Rebuild all target files”编译命令,编译器开始编译工作。

----------------------------------步骤之间的分割线----------------------------------------

         
                                 图6.1.6.1

         第六步:在”Output Window”窗口下观察编译结果。
         可以在最下方的”Output Window”窗口下观察到编译的过程提示。”Output Window”窗口默认出现在源代码区的最下方,如果没有发现”Output Window”窗口,请把鼠标的光标移动到最下方的滑动条下边,当它呈现移动光标的形状时,按住左键往上拖动就可以看到“Output Window”窗口了。当“Output Window”窗口最后一行显示“"stc89c52rc" - 0 Error(s), 0 Warning(s).”等信息时,表示翻译工程结束了。其中0 Error(s)代表编译成功,没有任何错误。0 Warning(s)代表没有任何警告。

   
    补充说明:
       (1)只要有一个错误Error产生,就说明编译不通过。如果没有任何错误Error产生,但是有几个警告Warning产生,在这种情况下很多时候都不影响程序的正常运行,只有少数情况下是会影响代码的正常运行的,因此我本人建议哪怕是一个警告,大家也不要放过它,也要找到产生这个警告的原因。



           
                                 图6.1.6.2

      
(2)查找错误的时候,只需要双击错误提示error那行内容,光标就会自动跳到源代码错误的附近,方便大家寻找语法错误。
  (3)还有一种很实用的方法,就是直接把提醒出错那一整行英文复制粘贴到网上去搜索,往往能搜索到所需的正确答案或者重要提示。


  ----------------------------------步骤之间的分割线----------------------------------------


         
                                 图6.1.7.1

        第七步:编译后生成.hex机器码文件的目录位置。
        以上编译成功后,只要打开电脑D盘的stc89c52rc文件夹,就可以找到.hex扩展名的机器码文件,这个文件就是我们要下载到单片机的机器码文件。

【6.2   注意!最后,还有一个非常重要的keil编译环境需要设置。】

        STC89C52单片机与AT89C52单片机是兼容的,它们程序容量ROM都是8K字节,而它们的数据容量RAM容量是不一样的,STC89C52的RAM是512字节,而AT89C52的RAM是256字节,尽管两者的RAM容量有一些小差异,但是对于我们用来入门学习来说,这些都是无所谓的,所以本教程硬件平台虽然是用STC89C52单片机,但是keil的编译环境其实是用AT89C52的芯片环境,因此本教程就以AT89C52为准。 刚才提到AT89C52的程序容量ROM是8K字节,数据容量RAM是256字节,那么问题来了,很多初学者经常遇到,有一些程序代码ROM明明没有超过8K,或者数据容量明明还没超过256字节,编译器居然报错提醒容量不够!什么原因?怎么解决?
        什么原因?是单片机的内存分配模式问题引起的,具体原因暂时不深入讲解。
        怎么解决?最后还要有一个非常重要的keil编译环境需要要设置,设置步骤是:
        
                        图6.2.1

        如上图所示,在一个已经打开的工程里,鼠标右键点击选中左边选项框里面的”Target 1”选项,在右键下拉菜单中选择“  Options for Target‘Target 1’ ”选项,弹出一个编译环境设置对话框,第一步单击上面子菜单切换到“Target”窗口下,第二步在Memory Model选项的下拉菜单中选中“Compact: variables in PDATA”,第三步在Code Ram Size选项的下拉菜单中选中“Large: 64K program”,第四步点击“确定”。


使用特权

评论回复
82
yanxinboy| | 2016-2-28 19:30 | 只看该作者
又来了。执着的人!帮顶。

使用特权

评论回复
83
liuxin_ph| | 2016-2-28 20:38 | 只看该作者
赞一个

使用特权

评论回复
84
stalker张| | 2016-2-29 07:41 | 只看该作者
加油,**下去

使用特权

评论回复
85
奥卡姆剃刀| | 2016-2-29 09:21 | 只看该作者
顶,谢谢分享!

使用特权

评论回复
86
phcstar| | 2016-3-1 16:05 | 只看该作者
写的太好了 牛人

使用特权

评论回复
87
xzhui00| | 2016-3-2 00:03 | 只看该作者
留个座位,必须顶起

使用特权

评论回复
88
m564522634| | 2016-3-2 08:53 | 只看该作者
jianhong_wu 发表于 2016-2-28 11:33
第六节:把.c源代码编译成.hex机器码的操作流程。

谢谢,请教下一个软项目软件的设计中, 怎么能做好模块化,层次化。

使用特权

评论回复
89
second_chan| | 2016-3-2 10:48 | 只看该作者
没有持续更新呀

使用特权

评论回复
90
1261867136| | 2016-3-5 15:29 | 只看该作者

既然7年磨一剑
能否磨出把宝剑来
让初学者看了就可以有方式,方法的
入门到其他类的单片机乃至嵌入式开发中

要求不过分吧?

使用特权

评论回复
91
lzcqust| | 2016-3-5 22:25 | 只看该作者
楼主,加油!!看得不过瘾。

使用特权

评论回复
92
jianhong_wu|  楼主 | 2016-3-6 13:25 | 只看该作者
本帖最后由 jianhong_wu 于 2016-8-1 17:59 编辑

第七节:本节预留。

       本节预留。

使用特权

评论回复
93
64xiaodian| | 2016-3-7 14:33 | 只看该作者
跟踪学习中

使用特权

评论回复
94
laolangxunsi| | 2016-3-7 17:52 | 只看该作者
深受感动!

使用特权

评论回复
95
luochangqing112| | 2016-3-9 16:57 | 只看该作者
顶一下,强烈支持

使用特权

评论回复
96
木鱼21| | 2016-3-9 17:33 | 只看该作者
赞个

使用特权

评论回复
97
星星ARM| | 2016-3-11 07:13 | 只看该作者
跟踪学习

使用特权

评论回复
98
jianhong_wu|  楼主 | 2016-3-12 17:47 | 只看该作者
本帖最后由 jianhong_wu 于 2016-3-12 17:52 编辑

第八节:把.hex机器码程序烧录到单片机的操作流程。
第八节_pdf文件.pdf (721.09 KB)

USB转串口的驱动程序CH340.zip (132.42 KB)


【8.1   烧录程序的本质。】

       “烧录”是比较专业的说法,很多初学者第一次听这词还以为跟火有关,莫名其妙的“烧录”是啥意思?烧录其实就是下载,烧录程序就是下载程序。下载好理解了吧,下载电影,下载歌曲,让播放器去播放。此处的下载程序跟下载歌曲的“下载”完全是一回事。有人会问,下载歌曲到手机,手机是成品,下载程序到单片机,单片机也是成品?新买回来的单片机不是一张白纸的电子元件吗?其实,新买回来的单片机就是一个成品,它不是白纸,它内部已经嵌入了一段系统程序,这个系统程序就像你刚买回来的手机就帮你预装了安卓系统一样,只是它的用户存储区是空白的。比如手机,你往这个存储区里存电影就可以看电影,存音乐就可以听音乐。比如单片机,你往这个存储区存不同的程序就可以让单片机做不同的事。而预装在新单片机内部的系统程序就是专门负责跟外部接口通讯,同时负责把hex格式的程序代码存放在单片机内部正确的位置,这个就是烧录程序(下载程序)的本质。这样一比喻,所以.hex格式的烧录文件跟.MP3格式的音乐文件在存储本质上是一样的。
        再回顾总结一下,烧录程序的本质是:把单片机当做一个存储器,每一条程序指令都对应一个唯一的存储地址,把这些指令以字节为单位一条条存储到指定的存储地址中,这就是烧录程序的本质。对于STC89C52RC单片机,在下载程序时需要上位机软件和一根USB转串口线。上位机软件负责把.hex格式的机器码文件打开,机器码文件里面记录着每条程序指令所对应的地址信息,下载过程时,上位机软件根据.hex文件记录的指令内容和对应的地址信息,经过USB转串口线,跟单片机的预置系统程序进行串口通讯,从而把.hex记录的信息传输到单片机内部的flash存储器中,实现了程序的烧录下载。

【8.2   烧录程序所需的工具和软件。】

      (1)装有XP或者WIN7系统的电脑一台。
       其它更高系统的我还没测试过,应该问题也不大。


        

                                  图8.2.2

      (2)带9针串口、1颗LED灯、电源拨动开关、能5V电源供电的stc89c52rc单片机核心板一块。
        单片机的学习离不开硬件平台的编程练习,本教程用的是坚鸿51学习板,此学习板的原理图在第七节已经分享到附件资料里。大家也可以根据原理图自己焊接一块学习板来学习,或者用其它厂家带有串口的单片机学习板来学习。
        串口是用来单片机跟电脑通讯的接口,是STC89C52RC单片机下载程序的通道。LED灯用来观察单片机是否正常运行程序。电源拨动开关方便烧录程序时提供所需的断电和上电的操作。本单片机系统是5V供电。


        
                                  图8.2.3

      (3)主控芯片是CH340的USB转RS232串口线一条。
       我之所以推荐主控芯片是CH340的USB转RS232串口线,因为CH340的下载线在烧录程序时很稳定可靠。这款USB转串口线可以在淘宝购买到。


      
                                  图8.2.4

     (4)5V供电的USB电源线一条。
      此USB线可以从电脑的USB口取电,也可以从输出5V的手机充电器处取电。但是我建议大家用输出5V的手机充电器来供电,因为很多电脑的USB口供电干扰比较大,会影响程序烧录。


      
                                  图8.2.5

     (5)主控芯片是CH340的USB转RS232串口线驱动安装程序。
      此驱动程序USB转RS232串口线的厂家通常都会提供,但是建议用我在附件资料里推荐给大家的驱动程序,毕竟这个程序经过我本人验证测试过。


      
                                  图8.2.6

     (6)烧录程序和串口助手功能都具备的“stc-isp-15xx-v6.85I”上位机软件。
       这是宏晶单片机官方免费提供的上位机软件,可以在宏晶单片机的官网上下载获取。这款软件有很多功能,除了有下载程序和串口助手的功能外,还可以用来配置自动生成所需的初始化代码。当然,本教程后面主要是用到此软件的下载程序和串口助手这两个功能。所以大家所选的软件版本必须是v6.85I版本或者以上的版本,因为早些年有一些版本只有烧录功能但是没有串口助手的功能。

【8.3   把.hex文件烧录到单片机的操作流程。】

       前面第6节内容已经教大家把一个驱动LED灯闪烁的C源代码编译成.hex文件的操作流程,同时在D盘的“stc89c52rc”文件夹里已经生成了一个“stc89c52rc.hex”的机器码文件,现在就要教大家如何烧录此文件到单片机内。此程序的功能是让单片机驱动一颗LED灯闪烁。



        
                               图8.3.1.1

        
                               图8.3.1.2

      
                               图8.3.1.3

       第一步:安装USB转串口驱动程序。
       上位机“stc-isp-15xx-v6.85I”烧录软件就是安装在电脑端的用户软件,电脑跟单片机进行通讯,需要一根USB转串口线,欲使USB转串口线正常工作,必须预先安装USB转串口的驱动程序。具体的操作是这样的:在本连载贴附件资料处下载“USB转串口的驱动程序CH340.zip”文件压缩包,解压后打开此文件夹,找到“SETUP.EXE”这个安装应用程序,双击启动,在弹出的界面中,单击“安装”按钮即可完成驱动程序的安装。

----------------------------------步骤之间的分割线----------------------------------------

        
                               图8.3.2.1

        
                               图8.3.2.2

      
                               图8.3.2.3

      
                               图8.3.2.4

        第二步:硬件线路连接,同时记录串口号。
        把USB转串口线插入电脑USB口,此时USB转串口线的另外一端连接51学习板的9针串口。同时,电源线一端用输出的5V手机充电器USB端口供电,电源线另一端连接51学习板的USB供电端口,此时可以通过51学习板的电源拨动开关来控制断电和上电。然后是查找串口号,方法是:以电脑WIN7系统为例,右击桌面“计算机”,单击选择下拉菜单的“管理”选项,在弹出的窗口中,点击“设备管理器”选项切换到对应的设置窗口,双击“端口(COM和LPT)”选项,在展开的下拉选项中,会看到“USB-SERTAL CH340(COM3)”,这个COM3就是我们要记住的串口号,记住此串口号,后面的步骤要用到。你们的串口号不一定是COM3,请以你们电脑显示的串口号为准。

----------------------------------步骤之间的分割线----------------------------------------


      
                                 图8.3.3

       第三步:打开上位机用户软件“stc-isp-15xx-v6.85I.exe”。
       这个软件可以在宏晶单片机的官网下载获取,获取到的软件压缩包只需解压后就可以使用,不用安装,
直接双击打开“stc-isp-15xx-v6.85I.exe”,此时会弹出“温馨提示”的窗口,我们按“确定”就可以进入到真正的工作界面了。

----------------------------------步骤之间的分割线----------------------------------------


      
                                  图8.3.4

       第四步:选择单片机型号。
       在“单片机型号”的下拉菜单中选择“STC89C/LE52RC”这个型号。如果中途弹出推荐选用其它型号的窗口,可以忽略它,我们用来学习只要认准“STC89C/LE52RC”这个型号就可以了。

----------------------------------步骤之间的分割线----------------------------------------

       第五步:设置串口号。
       点击“串口号”右侧的选项,在“串口号”的下拉菜单中,选择跟前面第二步所记录一样的串口号COM3(你们的串口号不一定是COM3,请根据你们的电脑实际显示情况来选择)。


----------------------------------步骤之间的分割线----------------------------------------

        第六步:设置最低波特率和最高波特率。
       “最低波特率”设置为2400,,“最高波特率”设置为9600。波特率如果设置太高,可能会导致烧录(下载)不成功。

----------------------------------步骤之间的分割线----------------------------------------

        第七步:导入.hex格式的机器码文件。
        点击“打开程序文件”的按钮,在弹出的对话框中,选择D盘下“stc89c52rc”文件夹目录下的“stc89c52rc.hex”,双击把“stc89c52rc.hex”导入到上位机用户软件。


----------------------------------步骤之间的分割线----------------------------------------

      
                                   图8.3.8            

        第八步:启动下载。
        点击“下载/编程”的按钮,发现“正在检测目标单片机..”的提示信息,此时需要通过电源波动开关把51学习板重新断电然后再上电才能正常下载,很多人也把这个重新上电的过程称为“冷启动”。之所以要重新断电再上电,是因为单片机内部预置的系统程序只在上电短暂的瞬间才会检查一下是否接收到需要重新烧录程序的指令,如果没有接收到烧录指令,单片机整个话语权就由原来的系统程序转交给我们的用户程序来接管,所以此串口后面的时间就给我们用户程序来使用。因此每次烧录程序时,先启动上位机的下载命令,此时上位机不断发送请求下载的命令给单片机,但是此时单片机并不理会这些指令,因为此时单片机的话语权已经交给了我们的用户程序,此时并不是预置系统程序在掌控,所以除非重新断电然后再上电那一瞬间才会让系统内置程序去检测并且响应此下载命令。另外多说一句,其实不是所有厂家的单片机在烧录程序时都需要“冷启动”,也不是所有单片机都支持串口烧录,各厂家的单片机烧录程序方式会有一些差异,但基本原理是一样的,大同小异。


----------------------------------步骤之间的分割线----------------------------------------

      
                                   图8.3.9

        第九步:“冷启动”后观察是否操作成功的信息。
        执行完前面第九步的“冷启动”后,如果发现有“...操作成功!”的提示信息,就说明程序下载成功了。此时会发现51学习板上面的一颗LED灯不断闪烁,是因为我们的LED灯程序驱动它才开始闪烁的,说明我们的程序在单片机上正常工作了。

       补充说明:
      (1)以后只要每次重新编译了C源代码后,都会生成最新版本的.hex格式文件,所以每次烧录程序时,必须重新返回第七步,重新执行一次导入最新版本.hex格式文件的操作,确保被烧录的程序是最新版本的.hex烧录文件。


【8.4   51学习板下载程序失败时的解决办法。】

      (1)可以先松一下单片机卡座,稍微挪动一下单片机,然后再卡紧单片机。卡座必须卡紧单片机,避免接触不良。
      (2)改变供电电源,很多电脑的USB口供电电源干扰非常大,严重影响下载程序,请把USB电源线插入到手机充电器5V的USB接口,效果显著,明显提高了下载的成功率。
      (3)检查确保所选择的单片机型号是STC89C/LE52RC,如果软件弹出推荐其它型号的单片机窗口,不用管它,我们就选STC89C/LE52RC。
      (4)检查STC-ISP烧写软件是否选择匹配的COM口。
      (5)单片机是靠串口烧录程序进去的,单片机的串口是P3.0,P3.1两根线经过232转换芯片,然后才与USB转串口线连接的。因此,在烧录程序时,请确保P3.0,P3.1两个IO口不能跳线连接到其它外围元器件上。
      (6)点击“下载/编程”后,记得再断电并且重新上电一次。看看是否烧录成功。
      (7)确保最低波特率一直设置为2400,最高波特率为9600。如果还不行再把最高波特率也改成2400试试。
      (8)如果还不行,就退出软件,拔掉USB转串口线,同时断电(必须把整根电源线拔出!),重新插入USB串口线,重新插入电源线开电,重新打开软件。
      (9)如果还不行,学习板先断电(必须把整根电源线拔出!),然后重启一次电脑。
      (10)总之:如果还不行,就按上述步骤多折腾几次。
      (11)最后实在不行,就尝试更换到其它USB口,或者尝试更换到其它电脑上试试。


使用特权

评论回复
99
222942| | 2016-3-14 08:32 | 只看该作者
頂!

使用特权

评论回复
100
linxinglin| | 2016-3-15 14:38 | 只看该作者
:handshake

使用特权

评论回复
发新帖 本帖赏金 42.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则