独闷闷网

 找回密码
 立即注册
搜索
楼主: jianhong_wu
打印 上一主题 下一主题
收起左侧

[原创] 从业十年,教你单片机入门基础。(连载)

[复制链接]
32#
 楼主| 发表于 2015-3-29 20:53:32 | 只看该作者
本帖最后由 jianhong_wu 于 2015-6-3 18:20 编辑

第八节:把.hex机器码下载到单片机的操作流程。
烧录程序也叫下载程序。下载程序的本质是什么?把单片机当做一个存储器,每一条程序指令都对应一个唯一的存储地址,把这些指令一条条存储到指定的存储地址中,这就是下载程序的本质。对于STC89C52RC单片机,在下载程序时需要上位机界面软件和一根USB转串口线。上位机界面软件负责把指定.hex格式的机器码文件打开,.hex格式的机器码文件里面记录着每条程序指令对应的地址信息,在下载过程中,上位机界面软件根据.hex记录的指令内容和对应的地址信息,经过USB转串口线,跟单片机的内置引导程序进行串口通讯,从而把.hex记录的信息传输到单片机内部的flash存储器中,实现了程序的下载。
在讲操作流程之前,请读者先把以下一个LED灯闪烁的代码编译成.hex格式的文件,这个.hex文件保存在D盘的”stc89c52rc”文件夹里。
  1. #include "REG52.H"

  2. void delay_long(unsigned int uiDelayLong); //延时函数

  3. sbit led_dr=P3^5;  

  4. void main()  
  5. {
  6.    while(1)
  7.    {
  8.        led_dr=1;  //LED亮
  9.        delay_long(100);    //延时50000个空指令的时间
  10.        led_dr=0;  //LED亮
  11.        delay_long(100);    //延时50000个空指令的时间
  12.    }
  13. }

  14. void delay_long(unsigned int uiDelayLong) //延时函数
  15. {
  16.    unsigned int i;
  17.    unsigned int j;
  18.    for(i=0;i<uiDelayLong;i++)
  19.    {
  20.       for(j=0;j<500;j++);  //内嵌循环的空指令数量
  21.    }
  22. }
复制代码


下面详细讲解把.hex机器码下载到单片机的操作流程。

第一步:安装USB转串口驱动程序的操作流程。所谓上位机界面软件就是安装在电脑端的界面软件,电脑跟单片机进行通讯,需要一根USB转串口线,欲使USB转串口线正常工作,必须预先安装一个USB转串口的驱动程序。具体的操作是这样的:在网盘中下载”51CTO下载-CH340SER(win7 64位可用).zip”这个压缩包文件,解压后分成“CH341SER”和“INSTALL”这两个文件夹,双击打开“CH341SER”这个文件夹,找到“SETUP.EXE”这个安装应用程序,双击启动,在弹出的界面中,单击“安装”按钮即可完成驱动程序的安装。
   第二步:记录串口号。我用的电脑是XP系统,现在以XP系统为例。插入USB转串口线,右击桌面“我的电脑”,选择下拉菜单的“设备管理器”,在弹出的窗口中,点击“端口”前面的+号,在展开的选项中,会看到“USB-SERTAL CH340(COM6)”这个信息,这个COM6就是要我们记住的串口号。你们的串口号不一定是COM6,请以你们电脑显示的串口号为准。
   第三步:打开上位机界面软件“STC_ISP”。这个软件可以在宏晶单片机的官网下载获取此软件。双击打开“STC_ISP.exe”这个上位机界面软件。
   第四步:选择单片机型号。在“单片机型号”的下拉菜单中选择“STC89C/LE52RC”这个型号。如果中途弹出推荐选用其它型号的窗口,可以按确定忽略它,我们只要认准“STC89C/LE52RC”这个型号就可以了。
   第五步:设置串口号。在“串口号”的下拉菜单中,选择跟前面第二步所记录一样的串口号。
   第六步:设置最高波特率。在“最高波特率”的下拉菜单中,选择9600波特率。
   第七步:连接硬件USB转串口线和电源线。USB转串口线一端已经连接电脑USB口,另外一端9针串口端跟坚鸿51学习板的串口端连接。电源线一端用智能手机充电器的USB端口供电5V,电源线另一端连接坚鸿51学习板的USB供电端口。

   第八步:导入.hex格式的机器码文件。点击上位机界面软件的“打开程序文件”的按钮,在弹出的对话框中,选择D盘下“stc89c52rc”文件夹目录下的“stc89c52rc.hex”,双击把“stc89c52rc.hex”导入到上位机界面软件。
   第九步:启动下载。点击上位机界面软件的“下载/编程”的按钮,发现“正在检测目标单片机..”的提示信息,此时需要把51学习板重新断电后再上电,很多人也把这个重新上电的过程称为“冷启动”。
   第十步:“冷启动”后观察是否操作成功的信息。执行完前面第九步的“冷启动”后,如果发现有“...操作成功!”的提示信息,就说明下载成功了。
   第十一步:坚鸿51学习板下载程序失败时的解决办法。
(1)可以先松一下卡座,稍微挪动一下单片机,然后再卡紧单片机。卡座必须卡紧单片机,              避免接触不良。
2)改变供电电源,很多电脑的USB口供电电源干扰非常大,严重影响下载程序,请把USB电源线插入到手机充电器5VUSB接口,效果显著,明显提高了下载的成功率。
3)检查确保选择单片机型号是STC89C/LE52RC,如果软件弹出推荐其它型号的单片机窗口,不用管它,我们就选STC89C/LE52RC
4)检查STC-ISP烧写软件是否选择匹配的COM口。
5)单片机是靠串口烧录程序进去的,单片机的串口是P3.0,P3.1两根线,在烧录程序时,确保P3.0,P3.1这两根线的黄颜色跳帽必须插上,同时P3.0,P3.1两个IO口不能跳线到外围器件上。
6)点击“下载/编程”后,记得再断电并且重新上电一次。看看是否烧录成功。
7)最低波特率一直设置为2400,然后把最高波特率先改成9600试一下,如果还不行再把最高波特率改成2400试试。
8)如果还不行,就退出软件,拔掉USB转串口线,同时断电(必须把整根电源线拔掉!),重新插入USB串口线,重新插入电源线开电,重新打开软件。
9)如果还不行,学习板先断电(必须把整根电源线拔掉!),然后重启一次电脑。
10)总之:如果还不行,就按上述步骤多折腾几次。最后实在不行,就尝试更换到其它USB口,或者尝试更换到其它电脑上试试。

下节预告:主程序的两个区域:初始化和循环。
(未完待续)









乐于分享,勇于质疑!
31#
 楼主| 发表于 2015-3-22 09:52:27 | 只看该作者
本帖最后由 jianhong_wu 于 2015-3-22 09:55 编辑

第七节:重复利用现有工程模板进行程序开发的方法以及代码备份管理技巧。
    是不是每做一个新项目都要新建一个工程?在同一个项目中,是不是每修改一次源代码都要新建一个工程?很多情况下都不用。这节介绍如何重复利用现有工程模板进行程序开发的方法以及代码备份管理技巧。
    重复利用现有工程模板,有三个必须。第一个必须是一个源文件的,而不是多文件编程(大家暂时不了解啥叫多文件编程也没关系)。第二个必须是同样的厂家同样的单片机型号。第三个必须进行代码备份管理,每完成一个项目的小进度,都要及时把源代码存储到电脑硬盘里,电脑硬盘里每个项目对应一个项目文件夹,每个项目文件夹里包含很多不同版本编号的源代码文件,每个源代码文件名必须有流水编号,方便识别最新版本的程序,每天下班前都要把最新版本的源代码文件上传到网盘备份,在互联网时代,把源代码存到自己的网盘,可以随时异地存取,即使遇到电脑故障损坏也不担心数据永久丢失。
    现在举一个例子来介绍它的操作流程。要修改一个LED项目的源代码,电脑D盘上已经有一个“LED项目”的文件夹,文件夹里已经有一个名称为LED_1的源代码文件,这个文件是.txt格式的文本文档,文件名称的后缀_1代表流水编号,要求修改此源代码后,再保存在此文件夹目录下的LED_2文本文档里,并且上传到网盘进行备份。
     第一步:打开一个现有的keil工程。双击桌面”keil uVision4”的图标启动keil软件,如果发现此软件默认打开了一个之前已经存在的工程,请点击上面Project选项,在弹出的下拉菜单中选择“Close Project”先关闭当前工程。然后,继续点击上面”Project”选项,在弹出的下拉菜单中选择“Open Project...”,在弹出的文件对话框中,在D盘目录下找到之前已经建立的工程文件夹stc89c52rc,单击选中“stc89c52rc.uvproj”这个文件名,点击“打开”,就可以打开一个现有的工程了。
     第二步:把当前keil工程的全部源代码清空。Ctrl+A快捷键选中当前工程的全部源代码,按下Backspace退格按键就可以清空当前工程的全部源代码。
     第三步:把最新版本的源代码导入到当前的keil工程中。在电脑D盘的“LED项目”文件夹目录下,双击打开“LED_1”的文本文档,用Ctrl+A快捷键选中文本文档的全部源代码,再用Ctrl+C快捷键复制此源代码,切换到keil工程中,把光标移动到工程的源代码编辑区,再用Ctrl+V快捷键粘贴此源代码到keil工程里。以下是复制粘贴到keil工程的源代码:

  1. #include "REG52.H"

  2. void delay_long(unsigned int uiDelayLong); //延时函数

  3. sbit led_dr=P3^5;

  4. void main()
  5. {
  6. while(1)
  7. {
  8. led_dr=1; //LED亮
  9. delay_long(100); //延时50000个空指令的时间
  10. led_dr=0; //LED灭
  11. delay_long(100); //延时50000个空指令的时间
  12. }
  13. }

  14. void delay_long(unsigned int uiDelayLong) //延时函数
  15. {
  16. unsigned int i;
  17. unsigned int j;
  18. for(i=0;i<uiDelayLong;i++)
  19. {
  20. for(j=0;j<500;j++); //内嵌循环的空指令数量
  21. }
  22. }
复制代码




     第四步:在keil工程中修改此源代码。把“led_dr=0;  //LED灭”这行代码删掉,修改后变成以下代码:
  1. #include "REG52.H"

  2. void delay_long(unsigned int uiDelayLong); //延时函数

  3. sbit led_dr=P3^5;

  4. void main()
  5. {
  6. while(1)
  7. {
  8. led_dr=1; //LED亮
  9. delay_long(100); //延时50000个空指令的时间

  10. delay_long(100); //延时50000个空指令的时间
  11. }
  12. }

  13. void delay_long(unsigned int uiDelayLong) //延时函数
  14. {
  15. unsigned int i;
  16. unsigned int j;
  17. for(i=0;i<uiDelayLong;i++)
  18. {
  19. for(j=0;j<500;j++); //内嵌循环的空指令数量
  20. }
  21. }
复制代码

第五步:启动编译。点击上面”Project”选项,在弹出的下拉菜单中点击“Rebuild all target files”编译命令,编译结束后显示编译操作成功。



第六步:把在keil工程里修改后的源代码备份到电脑硬盘里。
(1)先在D盘的”LED项目”文件夹目录下,点击鼠标右键新建一个文本文档,再右键选中此文本文档图标,重命名为”LED_2”,然后双击打开此文本文档。

(2)切换到keil工程的源代码中,用Ctrl+A快捷键选中keil工程的全部源代码,用Ctrl+C快捷键复制此代码,接着切换回D盘的”LED_2”的文本文档,用Ctrl+V快捷键把修改后的代码粘贴到D盘的”LED_2”的文本文档,并且打开文本文档左上角“文件”的下拉菜单,点击“保存”按钮保存,最后关闭此文本文档。
第七步:把"LED_2"文本文档上传到网盘里备份。我本人比较喜欢用115网盘。关于115网盘的操作,大家可以百度搜索“115网盘”。
下节预告:把.hex机器码下载到单片机的操作流程。
(未完待续)




乐于分享,勇于质疑!
30#
 楼主| 发表于 2015-3-18 22:32:02 | 只看该作者
zengmiao 发表于 2015-3-18 19:30
不错的比喻,值得引用,引用你的思路没关系吧!

当然没关系啦。写出来就是跟大家分享的。
乐于分享,勇于质疑!
29#
发表于 2015-3-18 19:30:58 | 只看该作者
jianhong_wu 发表于 2015-2-24 14:40
第一节:跟我学单片机到底是学什么?我的两个比喻和一个规则。

    开篇第一节,我问大家一个问题,跟我 ...

不错的比喻,值得引用,引用你的思路没关系吧!
乐于分享,勇于质疑!
28#
 楼主| 发表于 2015-3-18 10:59:15 | 只看该作者
本帖最后由 jianhong_wu 于 2015-3-18 14:30 编辑

第六节:把.c源代码编译成.hex机器码的操作流程。
     第一步:打开一个现成的工程。双击桌面”keil uVision4”的图标启动keil软件,如果发现此软件默认打开了一个之前已经存在的工程,请点击上面”Project”选项,在弹出的下拉菜单中选择“Close Project”先关闭当前工程。然后,继续点击上面”Project”选项,在弹出的下拉菜单中选择“Open Project...”,在弹出的文件对话框中,在D盘找到上一节已经建立的工程文件夹stc89c52rc,单击选中“stc89c52rc.uvproj”这个文件名,点击“打开”,就可以打开一个现有的工程了。
     
第二步:设置编译环境让它允许产生.hex格式的机器码文件。鼠标右键点击选中左边”Porject”选项框里面的”Target 1”选项,在右键下拉菜单中选择“Options for Target‘Target 1’...”选项,弹出一个编译环境设置对话框,左键单击上面子菜单切换到“Output”窗口下,把“Create Hex File”勾选上。点击“OK”退出。
     有1个地方需要解释:
1)这个选项很重要,必须把“Create Hex File”选项勾上,否则后续的操作不能在工程文件夹的目录里生成.Hex的机器码文件。对于一个工程模板,只需要设置一次就可以保存起来的,下次开电脑重新打开此工程模板时不需要再设置,这些被设置的参数都是能掉电保存起来的。

第三步:启动编译。在确保stc89c52rc.c源文件里面有C语言源代码的情况下,点击上面”Project”选项,在弹出的下拉菜单中点击“Rebuild all target files”编译命令,编译器开始编译工作。
第四步:在”Build Output”窗口下观察编译结果。可以在最下方的”Build Output”窗口下观察到编译的过程提示。如果没有发现”Build Output”窗口,请把鼠标的光标移动到最下方的滑动条下边,当它呈现移动光标的形状时,按住左键往上拖动就可以看到“Build Output”窗口了。当“Build Output”窗口提示显示“creating hex file from "stc89c52rc"..."stc89c52rc" - 0 Error(s), 0 Warning(s).”等信息时,表示翻译工程结束了。其中0 Error(s)代表编译成功,没有任何错误。0 Warning(s)代表没有任何警告。只要有一个错误Error产生,就说明编译不通过。如果没有任何错误Error产生,但是有几个警告Warning产生,在这种情况下很多时候都不影响程序的正常运行,只有少数情况下是会影响代码的正常运行的,因此我本人建议哪怕是一个警告,大家也不要放过它,要找到产生这个警告的原因。查找错误的时候,只需要双击错误提示error那行内容,光标就会自动跳到源代码错误的附近,方便大家寻找语法错误。
最终观察到的Build Output窗口如下:
     第五步:编译后生成.hex机器码文件的目录位置。以上编译成功后,我们只要打开电脑D盘的stc89c52rc文件夹,就可以找到.hex扩展名的机器码文件,这个文件就是我们要下载到单片机的机器码文件。
下节预告:利用现有工程模板编译不同项目源代码的方法以及代码备份管理技巧。
(未完待续)







乐于分享,勇于质疑!
27#
发表于 2015-3-18 10:28:22 | 只看该作者
通俗易懂,非常适合初学者 顶一个{:soso_e179:}
乐于分享,勇于质疑!
26#
 楼主| 发表于 2015-3-17 15:13:26 | 只看该作者
本帖最后由 jianhong_wu 于 2015-3-17 15:56 编辑

第五节:用keil软件新建,关闭,打开一个完整工程的操作流程。
     Keil平台软件的安装我就不多讲了,网上这方面的资料很多,大家可以百度一下如何安装keil的教程。下面开始讲解用keil软件新建,关闭,打开一个完整工程的操作流程。
     第一步:新建一个工程文件夹。先在电脑D盘目录下新建一个文件夹,取名为“stc89c52rc”。
     
     有2个地方需要解释:
1)文件夹以及后面所取的文件名不要用中文,请全部用英文,数字,或者下划线这些字符。keil软件支不支持中文名无所谓,但是在单片机这个行业,有一些单片机厂家的平台软件,某些版本是不支持中文名的,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。
2)新建的文件夹请直接放在某盘的根目录下,而不要放到某个已有文件夹的目录下。一方面是因为已有的文件名往往带有中文字,另外一方面是有一些单片机厂家的平台软件不支持嵌入层次太深的文件目录,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。

第二步:启动keil软件。双击桌面”keil uVision4”的图标启动keil软件。
第三步:关闭默认被打开的已有工程。打开keil软件时,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程。如果默认没有打开已有工程,这一步可以忽略跳过。关闭已有工程的操作是这样子的:点击上面”Project”选项,在弹出的下拉菜单中选择“Close Project”即可。
第四步:利用工具向导新建一个工程。点击上面”Project”选项,在弹出的下拉菜单中选择“new  uVision Project...”,在弹出的对话框中,选择保存的目录是刚才第一步新建的文件夹“stc89c52rc”目录下,输入跟文件夹名称一样的文件名“stc89c52rc”,然后单击“保存”按键,此时会弹出一个选择单片机型号的对话框,双击”Atmel”这个厂家,在展开的下拉选项中选中“AT89C52”这个型号,然后点击“OK”,此时会弹出一个英文询问框“是否要复制STARTUP.A51这个文件到工程里?”我们单击“否”即可。

     有3个地方需要解释:
(1)以上新建的保存文件名应该跟我们第一步在D盘新建的文件夹名称一致,因为有一些单片机厂家的平台软件是有这个要求的,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。
(2)上面之所以选择Atmel厂家的AT89C52单片机,是因为朱兆祺51学习板所用的单片机是STC89C52RC这个单片机,而STC89C52RCAT89C52是兼容的。
(3)在弹出的询问框“是否要复制STARTUP.A51这个文件到工程里?”中,STARTUP.A51这个文件有什么含义?STARTUP.A51是一个启动程序文件,在单片机进入.c程序执行main函数之前,先去执行这个启动程序,这个启动程序是专门用来初始化RAM和设置堆栈等,如果我们选“否”不添加这个启动程序,编译器也会自动加入一段我们不能更改的默认启动程序。如果选“是”,那么这个文件就会出现在我们工程里,我们可以根据需要进行更改。但是大多数的情况下,我们都不会去更改这个文件的,所以无论你选“是”还是“否”,只要你不更改START.A51这个文件,对我们都是一样的。我本人一般情况下都是选“否”。

     第五步:新建一个.c源文件。点击上面”File”选项,在弹出的下拉菜单中选择“New  ...”,会看到出来一个名字为”Text1”的文件。再一次点击上面”File”选项,在弹出的下拉菜单中选择“Save”,会弹出一个保存的对话框,还是选择保存在第一步新建的文件夹目录下,文件名取“stc89c52rc.c”,单击“保存”。
     

     有2个地方需要解释:
(1)以上所取的文件名必须带.c这个扩展名,表示此文件是C文件格式。
(2)第五步仅仅相当于在工程文件夹里新建了一个.c格式的C文件,此C文件目前跟工程还没有任何关联。

第六步:把刚才新建的.c源文件添加到工程里,跟工程建立起关联的关系。点击左边”Porject”选项框里面的”Target 1”前面的“+”号(如果没有发现Project,请按以下第2条解释操作),在展开的下拉菜单下看到“Source Group 1”。右键单击“Source Group 1”选项,在下拉菜单中选择“Add Existing Files to Group ‘Source Group 1’...”选项,弹出一个文件选择对话框,单击选中刚才新建的.c源文件,然后单击一次“Add”按钮,此时虽然对话框没有关闭,但是已经把.c源文件添加到工程里了,这时只要再点击一次“Close”按钮即可把此对话框关闭。这时发现左边的“Source Group 1”前面多了一个”+”号,单击此”+”号展开,发现下面刚才我们新添加进去的.c源文件“stc89c52rc.c”。
     有2个地方需要解释:
1)以上有一个地方,我本人觉得keil软件的用户体验做得不够好,容易引起误解。在弹出一个文件选择对话框时,先单击选中刚才新建的.c源文件,此时单击一次“Add”按钮,已经相当于把.c文件添加进工程了,但是此时keil软件并没有自动关闭对话框,这样很容易让初学者误以为.c源文件还没有被添加进去。
2)如果没有以上操作的时候没有发现左边Project窗口,请点击左下角的Project选项来切换。
第七步:双击打开左边被添加进工程的“stc89c52rc.c.c源文件,就可以在此“stc89c52rc.c”文件下输入我们的C语言代码了,请把以下范例代码复制进去,然后再一次点击”File”选项,在弹出的下拉菜单中选择“Save”保存。此时,新建一个工程的步骤已经完成。
供复制的范例代码:
  1. #include "REG52.H"

  2. void delay_long(unsigned int uiDelayLong); //延时函数

  3. sbit led_dr=P3^5;  

  4. void main()  
  5. {
  6.    while(1)
  7.    {
  8.        led_dr=1;  //LED亮
  9.        delay_long(100);    //延时50000个空指令的时间
  10.        led_dr=0;  //LED灭
  11.        delay_long(100);    //延时50000个空指令的时间
  12.    }
  13. }

  14. void delay_long(unsigned int uiDelayLong) //延时函数
  15. {
  16.    unsigned int i;
  17.    unsigned int j;
  18.    for(i=0;i<uiDelayLong;i++)
  19.    {
  20.       for(j=0;j<500;j++);  //内嵌循环的空指令数量
  21.    }
  22. }
复制代码

1个地方需要解释:
(1)把代码复制到keil4时,中文注释出现乱码怎么办?解决办法如下:
     点击左上角"Edit",在下拉菜单中选最后一项“Configuration”,在弹出的对话框中把Encoding的选项改成“Chinese GB2312(Simplified)”.

重新复制一次代码进去就恢复正常了。


第八步:打开一个现成的工程。前面七步已经讲解完了如何新建一个工程,现在教如何打开一个现成的工程。先单击右上角”X”关闭整个keil软件,然后双击桌面”keil uVision4”的图标重新启动keil软件,如果发现此软件默认打开了一个之前已经存在的工程,请先按照前面第三步关闭此工程。然后,点击上面”Project”选项,在弹出的下拉菜单中选择“Open Project...”,在弹出的文件对话框中,找到第一步新建的工程文件夹,单击选中“stc89c52rc.uvproj”这个文件名,然后点击“打开”,就可以打开一个现有的工程文件了。

下节预告:把.c源代码编译成.hex机器码的操作流程。
(未完待续)







乐于分享,勇于质疑!
25#
 楼主| 发表于 2015-3-14 10:23:18 | 只看该作者
海强 发表于 2015-3-14 10:00
你这是什么脑瓜子!什么东西都能写到一块去!

哈哈...用心,多读书,就可以融会贯通。
乐于分享,勇于质疑!
24#
发表于 2015-3-14 10:00:06 | 只看该作者
你这是什么脑瓜子!什么东西都能写到一块去!
乐于分享,勇于质疑!
23#
 楼主| 发表于 2015-3-14 09:24:11 | 只看该作者
第四节:平台软件和编译器软件的简介。
      C语言代码写在哪里,谁负责把它翻译成Hex格式机器码?这就涉及到编辑和编译,从而诞生了平台和编译这两种软件。平台软件负责编辑源代码,编译软件负责把源代码翻译成Hex格式的机器码。
      不同厂家的单片机,它所用的平台和编译器软件都不一样。即使是同样一个厂家的单片机,它也有可能存在多种不同的第三方平台软件和编译器软件,下面列举的一些例子只是主流的平台和编译软件,并不是说它们是唯一的。
      PIC单片机的平台软件是MPLAB,8位单片机是PICC编译器,12位单片机是PIC18编译器,16位单片机是C30编译器。这个例子从侧面也说明了一个平台软件可以嵌入多种不同的编译器软件,平台软件和编译器软件存在一对多的关系。
      51单片机的平台软件是keil,编译器是C51。
      以上所述,单片机程序开发需要用到两种软件,但是实际项目开发的时候,我们只是跟平台软件打交道就可以了,因为编译器软件是当做一种独立配件嵌入到平台软件里,统一受平台软件控制。我在用PIC的8位单片机时,需要安装一次MPLAB平台软件,也需要独立再安装一次PICC编译器软件,然后运行MPLAB平台软件,在里面操作某个菜单设置选项,把PICC编译器跟MPLAB平台软件关联起来,也就是我所说的把PICC编译器嵌入到MPLAB平台软件里,统一接受平台软件的控制,但我写代码只需要跟MPLAB平台软件打交道就可以了。我早期在做51单片机开发时,也是需要把keil平台软件和C51软件分开安装,然后再把它们关联起来,但是现在从keil2版本开始,在安装keil平台软件时就已经默认把C51安装好了,并且自动把C51嵌入到了keil平台软件。我现在用keil4这个版本的平台软件,只需要安装一次keil平台软件就可以了,不需要像早期那样再单独安装C51编译器。
      下节预告:用keil软件新建,关闭,打开一个完整工程的操作流程。
(未完待续)

乐于分享,勇于质疑!
22#
发表于 2015-3-11 19:50:45 | 只看该作者
学习了  很好,楼主幸苦
乐于分享,勇于质疑!
21#
发表于 2015-3-10 15:01:06 | 只看该作者
仔细的看了遍  写的很通熟易懂
乐于分享,勇于质疑!
20#
 楼主| 发表于 2015-3-8 09:04:04 | 只看该作者
本帖最后由 jianhong_wu 于 2015-3-8 09:08 编辑

第三节:单片机一个最重要的特性。
      “道生一,一生二,二生三,三生万物。”《道德经》认为,世间万物,缤纷多彩,它们都起源自一个东西,这个“一”的东西就是“道”。电子世界也存在“一”这个东西,这个“一”繁衍出手机,电脑,电视机,机器人等丰富多彩的电子世界。这个“一”就是单片机一个最重要的特性:程序下载进单片机的内存后,可以识别管脚上的高低电平信号,管脚也可以输出不同时间长度的高低电平。下面我把这句话的5个重要关健词提取出来,详细解读它的含义。
       程序。有3种,C程序,汇编程序,机器程序。能下载进单片机的只有机器程序,C程序和汇编程序都不能直接下载进单片机,所以C程序和汇编程序最终要经过专用编译软件翻译成机器程序后,才能下载进单片机执行。程序就是语言,语言就是用来交流的,交流就必须存在两个对象,这两个对象分别是程序员和单片机。程序员用C语言或者汇编语言,单片机只用机器语言,他们两者交流就必需一个翻译家,这个翻译家就是编译软件,俗称编译器,它专门把C语言或者汇编语言翻译成单片机能识别的机器语言。现在单片机开发的主流是用C语言,我本人出来工作后就从来没有用过汇编语言,所以我的观点是,C语言是必修课,汇编语言是选修课;C语言是白话文简单易懂,汇编语言是文言文繁琐难读。当然汇编也有它的优点和不可替代的场合,汇编的翻译效率高,往往是一句汇编语言对应一句机器语言,而一句C语言有可能对应几句机器语言,所以很多嵌入式系统某段要求简洁高效的源代码都是用汇编来写的,也有少数一些很便宜的单片机不提供C编译器,只能用汇编语言开发。所以要不要学汇编,我的建议是最好根据个人的工作需求来决定。
       内存。既然程序可下载进单片机,那么单片机必然有一个存储程序的内存。单片机内存包括ROM和RAM两部分。ROM的优点是掉电后存储的内容不会丢失,缺点是除非在烧录(下载)过程中,否则上电后它存储的内容也不能更改。并且,虽然ROM在烧录(下载)过程中可以更改内容,但是更改的次数有限制,也就是烧录(下载)的次数有限制,一般最大次数是10万次,当然这里所说ROM是指FLASH的单片机,如果是OTP的单片机,那么最大次数是1次。而RAM恰好反过来,RAM的优点是上电后存储的内容可以被程序指令随时更改,而且还没有更改次数限制,缺点是掉电后内容会丢失。正因为ROM和RAM各有特点,所以它们的分工有所不同。程序包括指令和数据两部分。指令是指程序中的判断,跳转,赋值等指令,这些内容是程序烧录进单片机时就固定下来的,不可更改的,所以存储在ROM中。数据也分两种,程序指令可更改的数据和程序指令不可更改的数据。程序指令可更改的数据存储在RAM中,程序指令不可更改的数据存储在ROM中。那么谁在幕后进行这些分类存储?是编译器软件和下载器(烧录器)。编译器除了把C语言翻译成机器语言之外,还帮我们分好了类,分配好了存储的地址和位置,下载器(烧录器)再根据这些信息把程序存储到内存中。
       管脚。它是单片机与外部电路进行能量和信息交互的桥梁。有电源,复位,晶振和IO口这4种类型管脚。第一种电源管脚。是给单片机内部电路供电的接口。单片机有两种常用的供电电压,一般不是3.3V就是5V,有的单片机两种电压都兼容。第二种复位管脚。单片机上电后需要外部电路给它一个瞬间高电平或者低电平的复位信号,才能启动工作。这类外部的复位电路通常是用电容和电阻组成的充电电路来实现,也有一些系统是用专门的复位芯片来实现。第三种晶振管脚。任何单片机想要工作必须要有晶振。单片机执行程序指令是按一个节拍一个节拍来执行的。而晶振产生固定频率的脉冲就是这个节拍的基础源泉。所以把晶振比喻成单片机的心脏是非常恰当的。当然,现在很多单片机都把晶振集成到内部了,不用再外接晶振。第四种IO口管脚。这是跟我们编写程序关联最密切的管脚。前面提到的电源,复位,晶振这3种管脚是为了让单片机能工作,俗称单片机工作的三要素。而单片机工作的具体内容就是通过IO口管脚来体现的。比如,IO口能识别按健的输入,也能驱动继电器的开关,也能跟外围器件进行通信。
       电平。单片机IO口管脚检测到的电压低于或等于0.8V时是低电平,程序里读取到的是0数字。检测到的电压高于或等于2.4V时是高电平,程序里读取到的是1数字,当然IO口输入的最大电压不能超过单片机的供电电压。单片机输出的低电平是0V,单片机输出的高电平等于它的供电电压值。
       时间。时间是单片机程序必不可少的一个元素。跟外围芯片通信的时序节拍需要时间,驱动发光二极管闪烁需要时间,工控自动化的某些延时需要时间。单片机的时间来源自两方面。第一方面源自指令的周期时间。单片机是根据节拍来执行程序指令的,所以每执行一条指令都要消耗一点时间,只要让程序执行一些无实际意义的指令,并且通过调整所执行指令的条数就可以得到所需要的时间长度。第二方面源自单片机内部自带的定时器。假如设置定时器每20毫秒产生一次中断,现在要获取10秒钟的时间,只需程序统记500次定时中断就可以了,因为1秒等于1000毫秒。
       下节预告,平台软件和编译器软件的简介。
(未完待续)



乐于分享,勇于质疑!
19#
 楼主| 发表于 2015-3-6 16:12:31 | 只看该作者
f晨星 发表于 2015-3-5 13:42
鸿哥的更新速度真的能等的黄花菜都凉了

更新慢是为了每一节的高质量。慢工出细活。
乐于分享,勇于质疑!
18#
发表于 2015-3-5 21:37:15 | 只看该作者
很不错哦,多谢鸿哥分享                    
乐于分享,勇于质疑!
17#
发表于 2015-3-5 13:42:52 | 只看该作者
鸿哥的更新速度真的能等的黄花菜都凉了{:soso__3669389859068460655_4:}
乐于分享,勇于质疑!
16#
发表于 2015-3-5 09:32:09 | 只看该作者
期待。。。。。。。。
乐于分享,勇于质疑!
回复

使用道具 举报

15#
发表于 2015-3-4 22:07:46 | 只看该作者
鸿哥能把复杂的问题讲的深入浅出,特别好。
乐于分享,勇于质疑!
14#
发表于 2015-3-4 12:57:48 | 只看该作者
很不错哦,多谢鸿哥分享,很希望鸿哥能够马上开始分享电路和外设的连载,,,,,,,,,,,
乐于分享,勇于质疑!
13#
发表于 2015-3-4 11:00:12 来自手机 | 只看该作者
我要把这个帖子分享给我那些正在学,基础又很差的同学
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-5-17 15:14 , Processed in 0.236597 second(s), 16 queries .

快速回复 返回顶部 返回列表