51单片机最小系统一个疑惑求解,困扰好几天了啊

51单片机一个疑惑求解,困扰好几天了啊_百度知道
51单片机一个疑惑求解,困扰好几天了啊
51单片机一个疑惑求解,困扰好几天了啊要求:
1. 通过键盘实现数字控制D/A输出模拟电压
2. A/D采集D/A输出模拟电压,并在数码管上以mV为单位进行显示;
单片机硬件关于DA的是LM358芯片
看手册是 LM358是PWM输出
那我的问题是,怎么实现要求1?
我有更好的答案求助知道网友
LM358是双运放,跟DA好象关系不大
LM358不是DA芯片吗
LM358是双运放这是确定无疑的,如果说与DA有关,很可能 是用于DA转换后进行电压或电流放大的
那输出PWM是什么意思
这个原理图DA是指的哪里?
这也看不清呀,关键要知道另外一个芯片的型号
麻烦看一下这个提问
LM358是运放,如果要用的话是用来加强电流驱动用的。PWM是脉冲,用占空比脉冲,用电容滤波,来得到模拟电压,应该直接用单片机GPIO就可以了。键盘,自己设定用键入几个数值组合来决定值,还是单个键对应值。对应值的话,根据实际输出调整代码。
LM358不是DA芯片吗,最后输出的电压是占空比乘上单片机的那个电压吗?
现在不太明白怎么让键盘和LM358联系起来,让键盘控制值
运放不是DA,PMW对应占空比就对应电压值键K1按下 - 输出 &10mv ; & & k2按下 -输出20mv 这个都是自定义的,你想怎么办就怎么办。是输入,告诉单片机我要做什么动作,然后单片机执行PWM。
对应占空比就是对应电压值?占空比范围也就是0到1,所以对应电压值范围也是0到1V是吗
1秒内,50% 5V,50% 0V, 1秒内平均电压?30% 5V 70% 0V呢?通过IO高速变换调整占空比比例,再经过电容滤波就得到电压值了。你这个只是固定电压,还不用正弦变换,上面那图是正弦变换的,但变换规律有了。
这个原理图哪里指的是DA
SCL是时钟线也就是高低变换占空比的,另一头应该接单片机,后面104电容就是滤波得到模拟电压,经过运放输出,就这样的原理了。
这就实现DA转换了?
那你以为DAC是怎样的变换?
麻烦看一下这个提问
本回答被网友采纳
1条折叠回答
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
举报视频:
举报原因(必填):
请说明举报原因(300字以内):
请输入您的反馈
举报理由需要输入300字以内
感谢您的反馈~
请勿重复举报~
请刷新重试~
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
郭天祥10天学会51单片机 视频1-1(共13课时)_
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
郭天祥10天学会51单片机 视频1-1(共13课时)_">郭天祥10天学会51单片机 视频1-1(共13课时)_
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
热门短视频推荐
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
后才可以领取积分哦~
每观看视频30分钟
+{{data.viewScore}}分
{{data.viewCount}}/3
{{if data.viewCount && data.viewCount != "0" && data.viewCount != "1" && data.viewCount != "2" }}
访问泡泡首页
+{{data.rewardScore}}分
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}1{{else}}0{{/if}}/1
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}
+{{data.signScore}}分
{{data.signCount}}/1
{{if data.signCount && data.signCount != 0}}
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制分享学习51单片机的一点感悟
我的图书馆
分享学习51单片机的一点感悟
  首先总体上谈一谈看法:
  1、我从不说51是基础,如果我这么说,也请把这句话理解为微机原理是基础。
  2、对51单片机的操作本质上就是对寄存器的操作,对其他单片机也是如此。库只是一个接口,方便使用者使用而已。
  3、汇编语言在工作中很少用到,了解就好。
  4、51的P0口很特别。
  5、C语言就是C语言,51单片机就是51单片机,算法就是算法,外围电路就是外围电路,传感器就是传感器,通信器件就是通信器件,电路图就是电路图,PCB图就是PCB图,仿真就是仿真。
  当你以后再也不使用51了,C语言的知识还在,算法的知识还在,搭建单片机的最小系统的技能还在,传感器和通信器件的使用方法还在,还会画电路图和PCB图,当然也会仿真。
  6、51单片机是这个:
  而不是这个:
  7、当程序调试不如人意的时候,静下心来好好查资料,51单片机最大的好处就是网上资料非常多,你遇到的问题别人肯定也遇到过。作为学习者,问人可能更方便点,但一直这样是培养不出解决问题的能力的。
  接下来上点干货:
  首先要放清51的定位,跟我一起再念一遍:51只是个工具51只是个工具51只是个工具。当然51还有一个地位就是大学生单片机启蒙教程。换句话说:单片机只是个工具单片机只是个工具单片机只是个工具。
  然后什么是基础:模电数电微机原理,然后熟练翻阅数据手册,可以试着做一些模块或者最小系统练练手,C语言其实也可以算工具吧,就单片机来说,作为必要条件也算作基础吧。
  再然后是要尽早搞明白自己的专业方向或者自己准备发展的方向,然后不同方向又有不同的专业基础,你学测控,就需要各种传感器、控制原理、理论、算法//买测量模块用不叫测控啊喂;你学信号处理,就需要信号与系统、数字信号处理基础,然后慢慢接触DSP、FPGA//信号处理真的不是result=(AD+0.5)/啊喂;你想做嵌入式开发,就慢慢研究ARM的架构,跑一些实时系统甚至高端ARM跑Linux开发驱动或应用;你要是想做通信,每天晚上拜一拜香农好了,这茬貌似挺苦的,什么通信原理编码论电磁场blablabla……
  总之51/单片机可以实现很多事情,但这不是一定说51重要,而是你如何利用51。哦对了,当你使用更高级的芯片的时候,很多底层的东西慢慢可以忽略了,甚至很多芯片厂商都会提供库给你,你可以安心的专注于自己的算法而不是如何去控制单片机。当然你最好还是要有一个芯片怎么通过寄存器及各种逻辑电路工作的概念。
  还有说一下你大学课余生活的选择、首先那种机器人实验室或者学生领导的实验室,适合打比赛刷奖状、长期下来你的模数电技能能有很大的锻炼,甚至你可以收货一些专利,而且学生之间气氛也还不错。另外一种就是找个导师跟着学习、帮忙、做项目,尽管最开始可能感觉导师分配给你的任务怎么都和单片机无关啊好无聊,但是你能在某个领域收获不一样的技术。当然前提是你要喜欢导师的研究方向了,一般院网站都有或者去知网看这个老师发表的论文。
  谈谈我的经历吧。
  1、一个没有C基础的的我,从师兄老师那打听到学51从郭天祥的视频开始,所以我就下载了全套来看。刚开始看真是头都晕了,点亮一个LED灯还可以,到了第二课的延时函数就吃不消了,可以说我耐力差吧,没有坚持,可以说我没恒心吧,不是真正想学东西的人,当时的我没有把它放心上,只是看了4课而已,其实对里面的程序不太理解的,于是就停下来不学了。到了大二下学期,我发现要学点技术,所以重抄旧业,学期单片机,然后再重第1课开始看起,结果发现以前不明白的东西现在豁然开朗。我写这经历是想说,如果当时我坚持下去,不懂的地方看多几遍,不懂再看再看,就不会浪费大半年的时间了。有些知识理论靠时间的积累,第一遍看不懂,第二遍看不懂,第三遍可能就懂一点了,刚开始上手一件事是会遇到类似的情况的。
  2、当我学了1个月后,学校里有个比赛,团队需要一个人搞硬件,于是我自己提出搞硬件,为什么?因为在学单片机的过程中发现,自己只会跑程序,连原理图都不怎么会看,单片机的接线我都是看开发板提供的资料来接的,很狗血吧。。。于是我就开始接触Altium Designer了,这是我这学期学的第二个软件。是看视频入门的,刚开始看的是郭天祥的视频,结果发现看不下去啊,太长太累了,看完一集好痛苦啊,于是我搜搜,结果发现一个很好的教学视频,用的也是比较新的版本,叫《边学边玩Altium Designer》 四人行工作室开的。我真的提感谢作者这种开源的精神的,对我们初学者帮助很大。跟着他的视频学习1个月,会画出51最小系统,基本布线,不过我觉得还是不够(当然不够啦,你才学了一个月……)
  3、在学Altium Designer的过程中涉及到电路分析,也就是我们现在学的《电子电路基础》,于是爱折腾的我开始捣鼓起Multisim 12.0,这是一款电路模拟仿真的软件。跟着老师学挺慢的,但是教材又高深了一点,比如说分析放大电路,稳压电源,教材上的东西大多列出公式,对于零基础学习的朋友是挺苦逼的,而且老师也是赶鸭子式,讲考试内容。这里建议大家买一本书《电子设计零基础》第二版,这本书是我在图书馆偶然发现的,但从此就迷恋上了他。刚开始他不会介绍一大堆公式,以一个例子开始教学,一步一步教你认识元器件(这里对学PCB是有帮助的),然后从电路图的一步分开始分析,接着分析怎么系统,书本结合Multisim 仿真,教你一步一步使用里面的控件。
  写到这里自己总结下:
  对于1:学单片机最重要的是
  1.先认识单片机,了解单片机的主要组成和各个管脚的定义及功;推荐书《单片机原理及其接口技术》胡汉才(很熟悉吧。。呵呵这就是我们大学的单片机教材啊!!经典中的经典啊!基础中的基础啊!!人家几十年的教材没有变是有道理的,原理这种东西不会变到哪里去的。不用专门去看,当作了解,对你理解编程是很有帮助的。)
  2.了解一些单片机汇编知识,方便后续调试;这本书《单片机原理及其接口技术》里面就是讲汇编的,一举两得。
  3.掌握单片机中断机制;
  4.掌握单片机定时和计数器;(3和4是对单片机内部寄存器的控制,要熟练掌握。那些外部拓展功能大多都基于这些内部控制)
  5.掌握单片机的串口通信。
  以上是对想从事单片机学习的人必须掌握的基本内容。
  对于2、3:2、3可以在一起讲,这是硬件部分的。Altium Designer主要学原理图库设计,PCB库设计,布线。没入门的朋友看下视频,不要求什么都会画,起码要会用人家的库,把人家的库移植过来自己用,这样可以快速上手这个软件。到后来再慢慢完善自己不熟悉的地方,这在里一直头疼我的就是封装的问题,当时我连封装是什么都不懂,自己看视频查了资料,才慢慢有点认识。
[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢51单片机pic单片机avr单片机的区别是什么?
51单片机pic单片机avr单片机的区别是什么?
09-08-20 &
如果说基本的,那么所有的单片机使用起来都差不多.对于初学来讲:大部分初学者都从学习51系列开始的--它存在资料丰富,软件方面也有大量的资源(KEILC51就是其中最好的一个).学习完51再学习其它的两种基本上是没多大的困难.那种适合中\高级水平:每种单片机每没有多大的差别.只要是精通其中的一种就可以了.至于你想学习中\高级一点的,等学习完51后可以去学习ARM DSP这些芯片.那种在实际的找工作或产品中用的多而且好的:这个要根据许多的因素决定的,可能以上的单片机都不合适.找工方面可能你精于51就已经找到很不错的工了.用那种开发板(实验板)能完成程序的编写及试验的操作:基本上讲如果你学习基础的话,就用软件编写及软仿真就可以学习到大量的知识.现在存在大量的实验板,这也不用急于去找(等学习完汇编,学习到软仿真再找也不迟).每一种单片机都有对应的汇编语言,学习汇编是最基础的,入门应该从汇编入手.同样可以用C语言.
请登录后再发表评论!
基本上没啥区别  随便努力学好一个就行,其它的触类旁通不要认为你以后找工作只用一种,遇到项目有需要,是一定要先选品牌型号的,最合适的那个才会被公司同意,所以你都要学会
请登录后再发表评论!
1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术, 共同研发出RISC精简指令集的高速8位单片机,简称AVR。差别不大,只要学会一种就行,原理是一样的。学会一个另一个自然就回了
请登录后再发表评论!
驱动能力不一样
请登录后再发表评论!查看: 14844|回复: 123
从单片机基础到程序框架(连载)
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 jianhong_wu 于
12:18 编辑
(920.78 KB, 下载次数: 119)
14:13 上传
点击文件名下载附件
(471.53 KB, 下载次数: 492)
14:13 上传
点击文件名下载附件
& && & 《从单片机基础到程序框架(2020版)》计划写到2020年左右就可以完稿,后续每两年左右我都会更新一次版本,不断推出2022版,2024版,2026版……2040版……以最简单的51单片机平台和外设,去挖掘最有逻辑最有深度最有队形最有实用的单片机艺术,以及如何像电影导演一样埋包袱,抖包袱,镜头之间如何完美切换,如何把故事讲连贯,如何全场无尿点,这些都是值得我用一生的时间去追求和完善的。同时,该教程免费授权给所有的出版社和做单片机学习板的厂家和各大培训机构以及全国各大院校,我本人不从中赢利也不收取任何版权费用,我本人也不卖书也不卖学习板也不搞线下培训。该教程的版权无偿捐给全社会。
& && & 等到2020年左右完成初稿后,我也会把所有章节整合成一个带目录的pdf文档免费分享给大家。感谢大家关注。
乐于分享,勇于质疑!
我抢个沙发鸿哥不会生气吧?
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
14:52 编辑
第一节:我的价值观。
(62.92 KB, 下载次数: 1448)
14:52 上传
点击文件名下载附件
& && &我2006年毕业,2009年就出来做自由职业者在深圳以接单片机项目谋生,到现在我有自己的机器人技术有限公司,做数控机器人系统,运动卡,三轴五轴联动之类的产品。目前公司的ARM单片机编程,DSP编程,FPGA编程,电路板设计,上位机软件都是由我带领的研发团队在做。我只专心做技术,而市场,生产,行政,资金,财务,采购都不用我分心去管,有我另外的合伙人雷总去打理,所以我常感恩能过上研发创作的日子,是因为有雷总的关照。& && &光有经济保障还是不够的,人最重要的是要找到自己的归宿自己的位置。我最爱看老子,庄子,孔子,王阳明的圣人书,王阳明说人人皆可成为圣人,所以我一直在追求圣人之道,我渴望成为圣人,圣人之道有真三不朽之说,立功,立言,立德。在立功层面,我这一辈子的定位就是做技术,我想做超级宇宙技术大牛,特别牛的那种牛,然后以我的技术协助雷总把我们的机器人公司做大做强。在立言层面,在不涉及我公司商业机密的前提下,我的天命和归宿就是做单片机技术分享,写一辈子源源不断的技术分享连载帖,然后写一本《从单片机基础到程序框架》的书,帮助更多单片机初学者,出书可以满足我在立言方面的追求。在立德层面,我平时信因果,在生活中多传播正能量。& && & 我有自知之明,我的天命就是传播单片机技术。人最宝贵的东西是生命,生命属于人只有一次,人的一生应当这样度过:当他回首往事的时候,他不因虚度年华而悔恨,也不应碌碌无为而羞愧。在他临死的时候,他能够这样说:我的整个生命和全部精力,都献给了世界上最壮丽的事业——为传播单片机技术而奋斗。
乐于分享,勇于质疑!
本帖最后由 szdzjs 于
19:08 编辑
来欣赏鸿哥的佳作,就算没了沙发,已无板凳,坐个地板也别无遗憾!
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
15:54 编辑
第二节:初学者的疑惑。
(89.52 KB, 下载次数: 3846)
15:54 上传
点击文件名下载附件
【2.1& &单片机应用的核心技术是什么?】
& && &&&单片机应用的核心技术是什么?是按键,数码管,流水灯,串口。是它们的程序框架。按键和数码管是输入是人机界面,把它们的程序框架研究透了,以后做彩屏或者更花销的显示界面,程序框架也可以通用。流水灯是应用程序是APP,把它的程序框架研究透了,以后控制飞机大炮的程序框架也是一样。串口是通讯是接口,把它的程序框架研究透了,以后搞SPI,CAN,USB等通讯项目时,上层的程序框架也可以通用。如果某天你突然腰酸背痛可能是缺钙了,如果某天你第一次做项目时突然发现无从下手,你缺的可能是程序框架。
【2.2& &跟我学单片机到底是学什么?】
& && &&&跟我学单片机到底是学什么?我的回答是像驾驶汽车一样驾驭单片机。我教给大家的是驾驶汽车的技术而不是研发汽车的技术。因此每当别人问我学51单片机,PIC,AVR,stm32哪个更加有前途,应该先学哪个再学哪个时,我的回答是既然你是学驾驶技术,那么用桑塔纳车来学还是用宝马车来学有差别吗?差别很小的,它们只是不同的厂家而已,只要会一种其它的就触类旁通了。把学单片机当作考驾照这是我常用的一个比喻。
【2.3& &单片机神奇的工作原理是什么?】
& && &&&单片机神奇的工作原理是什么?初学者不用纠结这个问题,这不是我们学习的方向。考驾照只要大概知道汽车是由四个轮,发动机,制动系统,离合器,方向盘等部分构成就够了,再深入的细节不用纠结。学单片机只要大概知道单片机内部由运算器,寄存器,IO口,复位电路,晶振电路等部分组成就够了,再深入的不用纠结。说实话,我本人做单片机开发有很多年了,但是我对单片机的工作原理也很模糊,就像人为什么能通过大脑来灵活控制双手,对于我仍然是一个迷。有这样的疑惑时咋办?我建议用“游戏规则”这个概念去应付它。游戏规则是不需要解释的,只要遵守就可以了。在应用的技术领域,把暂时不解的东西当作游戏规则来解读和遵守是我常用的思维方式。
【2.4& &很难记住繁杂的寄存器?】
& && & 很难记住繁杂的寄存器?寄存器不用死记硬背,只要知道它大概的操作流程,有哪几类就够了。配置寄存器时,可参考别人已经配置好的代码,这些代码都很容易通过网络或者书本获得。也可以查找芯片数据手册,有很多单片机厂家会给出各个功能的代码范例。
【2.5& &C语言很难学?】
& && &C语言很难学?暂时不用学指针,暂时不用学结构体,暂时不用学多文件编程,暂时不用学链表,暂时不用学宏定义,暂时不用学文件操作,暂时不用学所有的数据类型。只要会:
& && &5条指令语句switch语句,if else语句,while语句,for语句,=赋值语句。
& && &7个运算符+,-,*,/,|,&,!。
& && &4个逻辑关系符||,&&,!=,==.
& && &3个数据类型unsigned char, unsigned int, unsigned long。
& && &3个进制相互转化,二进制,十六进制,十进制。
& && &1个void函数。
& && &1个一维数组code(或const) unsigned char array[]。
& && &只要会上述一些知识点,应付任何一种逻辑功能的单片机软件都足够了。
& && &我在学校时只学了汇编程序,出来工作后才知道用C语言也能开发单片机,一开始只用常见的几条语句就把项目做出来了,没有用到printf这类繁琐格式的语句,第一次感觉C语言原来是那么容易那么简单,我是到后来才陆陆续续用到C语言其他的高级功能。
【2.6& &汇编语言很难学怎么办?】
& && & 汇编语言很难学怎么办?我提个建议,对于初学者,一开始就学汇编语言确实难学,不如先学C语言,学会了C语言再学汇编,这样理解起来就容易多了。也可以把C语言列入必修课,汇编语言列入选修课,因为实际工作中也是C语言为主。
【2.7& &很难记住各种繁杂的通信协议?】
& && &&&很难记住繁杂的各种通信协议?IIC,SPI,232,CAN,USB等等。不用记那么多,你只要理解串行和并行通讯方式的基本原理就可以了,剩下的只是不同的协议而已,工作时再根据需要去看看相关资料就可以上手。不管世上有多少种通讯协议,物理世界上只有这两种通讯方式。
【2.8& &很难写出短小精悍的程序?】
& && &&&很难写出短小精悍的程序?初学者不用纠结于此。很多项目开发,程序容量不是刻意追求的目标,多一点少一点没关系,不会是寸土寸金的事情,现在大容量的单片机品种也非常多,反而更值得关注的是程序的运行效率,可读性和可修改性。当然,一些成本敏感的消费类电子不在此讨论范围,这类项目往往对程序容量也要求很苛刻。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
21:07 编辑
第三节:单片机最重要的一个特性。
(125.94 KB, 下载次数: 3778)
21:07 上传
点击文件名下载附件
【3.1& &单片机的“一”。】& && && && && && && && && && && && && && &
图3.1.png (33.57 KB, 下载次数: 43)
21:07 上传
& && && && && && && && && && && && &&&图3.1
& & “道生一,一生二,二生三,三生万物。”《道德经》认为,世间万物,缤纷多彩,都源自一个东西,这个“一”的东西就是“道”。电子世界也存在“一”,这个“一”繁衍出手机,电脑,电视机,机器人等丰富多彩的电子世界,这个“一”就是单片机最重要的一个特性:“程序下载进内存后,单片机既可以通过管脚识别外部输入的高低电平信号,也可以通过管脚对外部输出不同时间长度的高低电平。”这句话有5个关键词“程序,内存,管脚,电平,时间。”下面我详细解读每个关键词的含义,涉及到某些专用名词如果不理解也没关系,主要是让大家有个感性的认识就足矣。
【3.2& &程序。】
& & 单片机程序有3种:C程序,汇编程序,机器程序。能下载进单片机的只有机器程序,C程序和汇编程序都不能直接下载进单片机,所以C程序和汇编程序都要经过编译软件翻译成机器程序后,才能下载进单片机。程序是语言,语言是用来交流,交流就必须存在两个对象,对象分别是程序员和单片机。程序员是人所以用C或者汇编语言,单片机是机器所以用机器语言,人和机是不同的世界,两者交流就需要一个翻译家,翻译家就是编译软件,俗称编译器,它能把C语言或者汇编语言翻译成单片机能识别的机器语言。机器语言就是0101的代码,一般以十六进制的形式呈现。& & 理论上,程序员也可以抛开C和汇编语言,直接用机器语言做项目。我读书时老师让我们做实验就是这么整。那时我还不知有烧录器,老师让我们先用汇编语言写好程序,然后自己充当编译器,对照汇编语言和机器语言的指令表,人工把汇编语言翻译成十六进制的机器语言,最后把机器语言按字节一个一个的输入到特定的实验设备来观察现象。现在回想起来,老师当时的初衷是让我们了解编程语言的本质。& & 既然可以直接用机器语言做项目,为什么还要C语言或者汇编语言?在C语言或者汇编语言没有诞生前,程序员就是通过在纸带上打孔来代表01的机器语言,此时相当于结绳记事的原始阶段。后来人类发明了汇编语言,通过英语单词来表示01机器语言特定的指令语句,此时开始诞生了汇编语言的编译器相当于进入象形文字的阶段。再到后来人类又发明了C语言,通过数学符号和英语单词来表达自己的逻辑,诞生了C语言的编译器相当于进入了汉字白话文阶段,从此程序员写出来的C程序就非常方便移植,编辑,阅读,传播,继承。现在单片机开发的主流是C语言,我本人出来工作后就没有用过汇编做项目开发。C语言是必修课,汇编语言是选修课;C语言是白话文简单易懂,汇编语言是文言文繁琐难读。当然汇编也有它的应用场合,汇编的翻译效率高,往往是一句汇编语言对应一句机器语言,而一句C语言有可能对应几句机器语言,这样C程序的代码效率在很大程度上取决于编译器的水平,编译器能不能帮你翻译出高效的机器语言对于我们来说往往像黑盒子,不像汇编语言那么可控制。所以很多嵌入式系统某段要求简洁高效的源代码往往用汇编来写,也有少数一些很便宜的单片机不提供C编译器,只能用汇编语言开发。要不要学汇编,最好根据个人的工作需求来决定。
【3.3& &内存。】
& & 单片机就像MP3,程序代码就像歌曲,把不同的歌曲下载到MP3里就可以听到不同的音乐,把不同的程序下载到单片机里,单片机就能做不同的事。能装程序的单片机必然有内存,内存由ROM和RAM组成,ROM和RAM都能装东西,但各有不同。& & ROM的优点是存储的东西断电后不会丢失,缺点是存储的东西上电后不能更改,想要改变ROM的内容除非重新下载程序,而且下载次数有限制,FLASH的ROM最大次数通常是10万次,而OTP的ROM只能下载1次,所以平时上电工作时ROM存储的东西是不能更改的,某些具有IAP功能的高级单片机不在此讨论范围内。而RAM恰好反过来,RAM的优点是存储的东西上电后可以随时被单片机更改,更改次数没有限制,缺点是存储的东西断电后会丢失,没有记忆功能。& & ROM和RAM各有特点,单片机从中各取所长。ROM用来存储不可更改的指令代码和常量数据,ROM的容量往往相当于代码的容量。RAM用来存储可以被更改的变量数据,RAM的容量往往相当于全局变量和局部变量的容量。不管是用C语言还是汇编,所写的程序代码就自然包含了指令代码、常量数据、全局变量、局部变量,那么谁在幕后帮我们进行分类存储,谁把一个程序代码的一分为二让它们在ROM和RAM里各就各位?是编译器软件和下载器(烧录器),编译器除了把C语言翻译成机器语言之外,还帮我们分好了类,分配好了存储的地址和位置,下载器(烧录器)再根据这些信息把程序存储到内存中,这些工作一般不用程序员干预,它们自动完成。
【3.4& &管脚。】
& & 管脚是单片机与外部电路进行能量和信息交互的桥梁。有电源,复位,晶振和IO口这4类管脚。& && & 第一类电源管脚。是给单片机内部电路供电的接口。单片机有两种常用的供电电压,一般是3.3V或者5V,有的单片机两种电压都兼容。& & 第二类复位管脚。单片机上电后需要外部电路给它一个瞬间高电平或者低电平的复位信号,才能启动工作。复位电路通常是由电容和电阻组成的充电电路来实现,也有一些系统是用专门的复位芯片来实现。& & 第三类晶振管脚。任何单片机想要工作必须要有晶振。单片机执行程序指令是按一个节拍一个节拍来执行的。这个节拍的时间就是由晶振产生,所以把晶振比喻成单片机的心脏是非常恰当的。现在也有很多单片机直接把晶振集成到内部,这类单片机不用外接晶振也可以。& & 第四类IO口管脚。这是跟我们编写程序关联最密切的管脚。前面提到的电源,复位,晶振这3种管脚是为了让单片机能工作,俗称单片机工作的三要素。而单片机工作的具体内容就是通过IO口管脚来体现的。比如,IO口能识别按健的输入,也能输出驱动继电器工作的开关信号,也能跟外围器件进行通信。
【3.5& &电平。】
& & 电平就是电压的两种状态,低或者高,低相当于程序里的0,高相当于程序里的1。单片机IO口管脚检测到的电压低于或等于0.8V时是低电平,程序里读取到的是0数字。单片机IO口管脚检测到的电压高于或等于2.4V时是高电平,程序里读取到的是1数字。必须注意的是,IO口输入的最大电压不能超过单片机的供电电压。单片机输出的低电平是0V,单片机输出的高电平等于它的供电电压值,往往是3.3V或者5V。
【3.6& &时间。】
& & 时间是单片机程序必不可少的元素。跟外围芯片通信的时序节拍需要时间,驱动发光二极管闪烁需要时间,工控自动化的某些延时需要时间。单片机的时间来源自两方面。第一方面源自指令的周期时间。单片机是根据节拍来执行程序指令的,每执行一条指令都要消耗一点时间,只要让程序执行的指令数量越多,产生的时间就越长,通过调整所执行指令的数量就可以得到所需的时间长度。第二方面源自单片机内部自带的定时器。假如设置定时器每20毫秒产生一次中断,现在要获取10秒钟的时间,只需在程序里统记500次定时中断就可以了,因为1秒等于1000毫秒。指令和定时器这两者的时间最后都来源于晶振。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
10:47 编辑
第四节:平台软件和编译器软件的简介。
(48.84 KB, 下载次数: 3805)
10:46 上传
点击文件名下载附件
【4.1& &平台软件和编译器软件的各自分工。】
& && &&&C语言写在哪?谁来把C语言翻译成单片机可以识别的机器语言?这就是平台软件和编译器软件的分工。平台软件负责编辑C语言,编译软件负责把C语言翻译成单片机可以识别的机器语言。
【4.2& &每一种单片机的平台软件和编译器软件不一定是唯一的。】
& && &&&C语言在单片机的应用也是最近这些年发展起来的,早期做单片机的原厂更关注芯片硬件本身,配套的C语言开发软件方面涉入不深,他们往往只管把单片机芯片生产出来后,给大伙提供一个汇编语言的编译器软件就草率了事,所以给了很多第三方商家做平台软件和C编译器的机会,后来单片机原厂也乐意支持和配合这些第三方开发软件的厂商,也有一些单片机原厂直接收购这类第三方软件公司。因此,不同厂家的单片机,它所用的平台和编译器软件可能都不一样。即使是同样一个厂家的单片机,它也有可能存在多种不同的第三方平台软件和编译器软件,每一种单片机所用的平台软件和编译器不一定是唯一的。比如stm8单片机可以用 STVD软件平台,也可以IAR平台。stm32单片机可以用keil平台,也可以用IAR平台。
【4.3&&平台软件和编译器软件的宿主与寄生关系。】
& && &&&平台软件选定了之后,所用的编译器软件也可能存在多种选择,并不是一种平台软件就绑定一种编译器软件。生物学的比喻,平台软件是宿主,编译器软件是寄生在平台软件里的。一个平台软件可以嵌入多种不同的编译器软件,平台软件和编译器软件存在一对多的关系。比如,PIC单片机的平台软件是MPLAB,8位PIC单片机是PICC编译器,12位PIC单片机是PIC18编译器,16位PIC单片机是C30编译器。而且MPLAB平台软件与上述各种编译器软件都要单独一个一个分开来安装,最后运行MPLAB平台软件,在里面操作某个菜单设置选项,把各种C编译器软件跟MPLAB平台软件关联起来。
【4.4&&51单片机的平台软件和编译器软件。】
& && &&&我后面的讲解,51单片机的平台软件用keil2,编译器软件用C51。单片机程序开发需要用到这两种软件,但在项目开发的时候,只要跟平台软件打交道就可以了,因为编译器软件是当做一种独立配件嵌入到平台软件里,统一接受平台软件的控制。我在用PIC的8位单片机时,需要安装一次MPLAB平台软件,也需要独立再安装一次PICC编译器软件,然后运行MPLAB平台软件,在里面操作某个菜单设置选项,把PICC编译器跟MPLAB平台软件关联起来,也就是我所说的把PICC编译器嵌入到MPLAB平台软件里,统一接受平台软件的控制,但我平常写代码时只需要跟MPLAB平台软件打交道就可以了。我早期在做51单片机开发时,也是需要把keil平台软件和C51软件分开安装,然后再把它们关联起来,但是现在从keil2版本开始,在安装keil平台软件时就已经默认把C51安装好了,并且自动把C51嵌入到了keil平台软件。我现在用keil2这个版本的平台软件,只需要安装一次keil2平台软件就可以了,不需要像早期那样再单独安装C51编译器。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
06:42 编辑
第五节:用keil2软件关闭,新建,打开一个工程的操作流程。
(607.21 KB, 下载次数: 3382)
06:39 上传
点击文件名下载附件
【5.1& &本教程选择keil2软件版本的原因。】
& && &&&Keil软件目前有Keil2,Keil4,Keil5等版本。本教程之所以选用keil2版本,是因为keil2版本比较单纯,它本身内置了C51编译器,并且只适用于51单片机不能适用于stm32这类单片机。而Keil4,Keil5等版本不仅可以适用于51单片机的,还可以适用于ARM类的单片机,它们有C51编译器和MDK-ARM编译器两种选择,在同一个keil4或者keil5版本里,C51和MDK-ARM两者往往只能二选一,MDK-ARM编译器是针对stm32这类单片机,如果你电脑上用了MDK-ARM编译器想再切换到C51编译器就很麻烦了往往不兼容,为了电脑上既能用C51编译器,又能兼容MDK-ARM编译器,我的电脑上是同时安装了C51编译器的keil2和MDK-ARM编译器的keil4,一台电脑同时安装keil2和keil4不会冲突,能兼容的。
【5.2& &如何在不用关闭keil2软件的前提下又能关闭当前被打开的工程?】
& && && &要关闭当前工程,最简单的方法是直接点击keil2软件右上角的“X”直接把keil2软件也一起关了,这种方法不在讨论范围,现在要介绍的是如何在不关闭keil2软件的前提下又能关闭当前被打开的工程。
5.2.1.png (50.77 KB, 下载次数: 34)
10:33 上传
& && && && && && && && &图5.2.1& && && && &
& && && &第一步:启动keil2软件。& && && &双击桌面”keil uVision2”的图标启动keil2软件。
----------------------------------步骤之间的分割线----------------------------------------
5.2.2.png (30.36 KB, 下载次数: 33)
10:33 上传
& && && && && && && && &图5.2.2& && &
& && &&&第二步:关闭被打开的已有工程。& && &&&启动keil2软件后,假设发现此软件默认打开了一个之前已经存在的工程。关闭已有工程的操作是这样子的:点击上面”Project”选项,在弹出的下拉菜单中选择“Close Project”即可。这时keil2软件处于“空”的状态,没有打开任何工程了。
【5.3& &keil2如何新建一个工程?】
5.3.1.png (27.39 KB, 下载次数: 34)
10:33 上传
& && && && && && && && &图5.3.1&&
& && & 第一步:新建一个工程文件夹。& && & 在电脑D盘目录下新建一个文件夹,取名为“stc89c52rc”。
& &补充说明:
& &&&(1)文件夹的命名以及后面涉及到的工程文件名统统都不要用中文,请全部用英文,数字,或者下划线这些字符。即使keil软件支持中文名,我建议也不要用中文名,因为在单片机这个行业,有一些单片机厂家提供的平台软件,某些版本是不支持中文名的,所以大家从一开始就养成这个习惯,以后可以避免遇到一些不必要的麻烦。
& &&&(2)新建的文件夹请直接放在某盘的根目录下,而不要放到某个已有文件夹的目录下。一方面是因为已有的文件名目录往往带有中文单词,另外一方面是有一些单片机厂家的平台软件不支持嵌入层次太深的文件目录,所以大家从一开始就养成这个习惯,以后可以避免遇到一些不必要的麻烦。
复制代码
----------------------------------步骤之间的分割线----------------------------------------
& && & 第二步:启动keil2软件。& && & 双击桌面”keil uVision2”的图标启动keil2软件。
----------------------------------步骤之间的分割线----------------------------------------
& && & 第三步:关闭默认被打开的已有工程。& && & 启动keil2软件后,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程让keil2软件处于“空”的状态,如果没有发现此软件默认打开已有工程,这一步可以忽略跳过。关闭已有工程的操作是这样子的:点击上面”Project”选项,在弹出的下拉菜单中选择“Close Project”即可。这时keil2软件处于“空”的状态,没有打开任何工程了。
----------------------------------步骤之间的分割线----------------------------------------
5.3.4.1.png (22.88 KB, 下载次数: 32)
10:33 上传
& && && && && && && && && && & 图5.3.4.1&&
5.3.4.2.png (21.33 KB, 下载次数: 39)
10:33 上传
& && && && && && && && && && & 图5.3.4.2&&
5.3.4.3.jpg (60.62 KB, 下载次数: 31)
10:33 上传
& && && && && && && && && && & 图5.3.4.3&&
5.3.4.4.png (15.76 KB, 下载次数: 33)
10:33 上传
& && && && && && && && && && & 图5.3.4.4&&
& && &&&第四步:利用工具向导新建一个工程。& && &&&点击上面”Project”选项,在弹出的下拉菜单中选择“New Project...”,在弹出的对话框中,选择保存的目录是刚才第一步新建的文件夹“stc89c52rc”,同时输入跟文件夹名称一样的工程文件名“stc89c52rc”,然后单击“保存”按键(一个新工程模板就建成了),单击“保存”按键后此时会弹出一个选择单片机型号的对话框,单击”Atmel”这个厂家前面的“+”号,在展开的下拉选项中选中“AT89C52”这个型号,然后点击“确定”,此时会弹出一个英文询问框,大概意思是“是否要复制STARTUP.A51这个文件到工程里?”我们单击“否”即可。
&&补充说明:
& && &(1)以上新建的保存文件名应该跟我们第一步在D盘新建的文件夹名称一致,确保都是“stc89c52rc”,因为有一些单片机厂家的平台软件是有这个要求的,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。
& && &(2)上面之所以选择Atmel厂家的AT89C52单片机,是因为本教程选用的单片机STC89C52RC跟AT89C52是兼容的。
& && &(3)在弹出的英文询问框,大致意思是“是否要复制STARTUP.A51这个文件到工程里?”,那么STARTUP.A51这个文件有什么含义?STARTUP.A51是一个启动程序文件,在单片机进入.c程序执行main函数之前,先去执行这个启动程序,这个启动程序是专门用来初始化RAM和设置堆栈等,如果我们选“否”不添加这个启动程序,编译器也会自动加入一段我们不能更改的默认启动程序。如果选“是”,那么这个文件就会出现在我们工程里,我们可以根据需要对它进行更改。但是大多数的情况下,我们都不会去更改此文件,所以无论你选“是”还是“否”,只要你不更改START.A51文件,对我们来说都是一样的。因此我本人一般情况下都是选“否”。复制代码
----------------------------------步骤之间的分割线----------------------------------------
5.3.5.1.png (19.95 KB, 下载次数: 33)
10:33 上传
& && && && && && && && &图5.3.5.1&&
5.3.5.2.png (24.16 KB, 下载次数: 35)
10:33 上传
& && && && && && && &&&图5.3.5.2&&
5.3.5.3.png (21.91 KB, 下载次数: 36)
10:33 上传
& && && && && && && &&&图5.3.5.3&&
& && & 第五步:新建一个.c源文件。& && & 点击上面”File”选项,在弹出的下拉菜单中选择“New...”,会看到弹出来一个名字为”Text1”的文件。再一次点击上面”File”选项,在弹出的下拉菜单中选择“Save”,会弹出一个保存的对话框,此时还是选择保存在第一步新建的文件夹目录下,并且把“Text1”文件名更改为“stc89c52rc.c”(注意后缀是.c扩展名),单击“保存”。
& & 补充说明:
& & (1)此时你如果打开D目录下“stc89c52rc”的文件夹,你会发现此文件夹有一个“stc89c52rc.c”的文件,这个文件就是在这一步被新建添加进来的,但是此文件“stc89c52rc.c”目前跟整个工程还没有关联,还需要在接下来的第六步那里进行关联操作。
& & (2)上面新建添加的文件,它的文件名必须是带.c这个扩展名,表示此文件是C文件格式,这一个很重要不要搞错了。往后我们所写的C语言程序代码就是写在此C格式的文件里。此文件也俗称C源文件。复制代码
----------------------------------步骤之间的分割线----------------------------------------
5.3.6.1.png (33.61 KB, 下载次数: 36)
10:33 上传
& && && && && && && && && && && &&&图5.3.6.1&&
5.3.6.2.png (19.79 KB, 下载次数: 35)
10:33 上传
& && && && && && && && && && && &&&图5.3.6.2&&
5.3.6.3.png (20 KB, 下载次数: 34)
10:33 上传
& && && && && && && && && && && & 图5.3.6.3&&
& && &&&第六步:把刚才新建的.c源文件添加到工程里,跟当前工程关联起来。& && &&&点击左边竖着的选项框里面的”Target 1”前面的“+”号,在展开的下拉菜单下看到“Source&&Group 1”。右键单击“Source&&Group 1”选项,在下拉菜单中选择“Add Files to Group ‘Source&&Group 1’”选项,弹出一个文件选择对话框,单击选中刚才新建的.c源文件,然后单击一次“Add”按钮,此时虽然对话框没有关闭,但是已经悄悄地把.c源文件添加到工程里了(这个地方keil的用户体验设计得不够好,容易让人误解还没有把文件添加进来),这时再点击一次“Close”按钮先把此对话框关闭,然后发现左边的“Source Group 1”前面多了一个”+”号,单击此”+”号展开,发现下面的文件恰好是刚才新添加进去的.c源文件“stc89c52rc.c”。
& &补充说明:
& && & (1)在刚才的操作中,我本人觉得keil软件有一个地方的用户体验做得不够好,容易引起误解。就是在弹出一个文件选择对话框时,先单击选中刚才新建的.c源文件,此时单击一次“Add”按钮,已经相当于把.c文件添加进工程了,但是此时keil软件并没有自动关闭对话框,这样很容易让初学者误以为.c源文件还没有被添加进去。复制代码
& &----------------------------------步骤之间的分割线----------------------------------------
5.3.7.png (49.51 KB, 下载次数: 35)
06:41 上传
& && && && && && && && &&&图5.3.7&&
& && &&&第七步:至此,可以正常的编辑C语言代码了。& && &&&双击打开左边Target1里面Source Group1下刚刚被添加进工程的“stc89c52rc.c”源文件,就可以在此“stc89c52rc.c”文件下输入C语言代码了,请把以下范例代码复制进去,然后再一次点击”File”选项,在弹出的下拉菜单中选择“Save”保存。此时,新建一个工程的步骤已经完成。供复制的范例代码如下:
#include &REG52.H&
void delay_long(unsigned int uiDelayLong); //延时函数
sbit led_dr=P1^6;&&
void main()&&
{
& &while(1)
& &{
& && & led_dr=1;&&//LED亮
& && & delay_long(100);& & //延时50000个空指令的时间
& && & led_dr=0;&&//LED灭
& && & delay_long(100);& & //延时50000个空指令的时间
& &}
}
void delay_long(unsigned int uiDelayLong) //延时函数
{
& &
& &
& &for(i=0;i&uiDelayLi++)
& &{
& && &for(j=0;j&500;j++);&&//内嵌循环的空指令数量
& &}
}复制代码
------------------此处为分割线,上面的是代码的结束,下面的是补充说明的开始------------------
&&补充说明:
& && & (1)可能有些朋友不是用keil2版本,如果他们是用keil4的版本,当把代码复制到keil4时,如果中文注释出现乱码怎么办?解决办法是这样的:点击keil4软件的左上角&Edit&,在下拉菜单中选最后一项“Configuration”,在弹出的对话框中把Encoding的选项改成“Chinese GB2312(Simplified)”.然后删除所有C代码,重新复制一次代码进去就恢复正常了。当然,我们用keil2版本不会遇到这个问题,况且keil2版本的&Edit&下拉菜单也没有“Configuration”这个选项,所以keil2和keil4还是有一些差别的。
复制代码
【5.4& &keil2如何打开一个现有的工程?】
& && &&&第一步:启动keil2软件。& && &&&双击桌面”keil uVision2”的图标启动keil2软件。
----------------------------------步骤之间的分割线----------------------------------------
& && &&&第二步:关闭默认被打开的已有工程。& && &&&启动keil2软件后,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程让keil2软件处于“空”的状态,如果没有发现此软件默认打开已有工程,这一步可以忽略跳过。关闭已有工程的操作是这样子的:点击上面”Project”选项,在弹出的下拉菜单中选择“Close Project”即可。这时keil2软件处于“空”的状态,没有打开任何工程了。
----------------------------------步骤之间的分割线----------------------------------------
5.4.3.1.png (26.44 KB, 下载次数: 35)
10:33 上传
& && && && && && && && && && && && &&&图5.4.3.1
5.4.3.2.png (22.09 KB, 下载次数: 31)
10:33 上传
& && && && && && && && && && && && &&&图5.4.3.2
& && &&&第三步:打开一个现成的工程。& && &&&点击上面”Project”选项,在弹出的下拉菜单中选择“Open Project”,在弹出的文件对话框中,找到需要被打开工程文件夹(本例程是D盘下的“stc89c52rc”文件夹),在此文件夹目录下单击选中“stc89c52rc.Uv2”这个工程文件名,然后点击“打开”,就可以打开一个现有的工程文件了。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
00:06 编辑
第六节:把.c源代码编译成.hex机器码的操作流程。
(406.18 KB, 下载次数: 2732)
00:02 上传
点击文件名下载附件
【6.1& &详细步骤。】
& && && &第一步:启动keil2软件。
& && && &双击桌面”keil uVision2”的图标启动keil2软件。
----------------------------------步骤之间的分割线----------------------------------------
& && && &第二步:关闭默认被打开的已有工程。
& && && &启动keil2软件后,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程让keil2软件处于“空”的状态,如果没有发现此软件默认打开已有工程,这一步可以忽略跳过。关闭已有工程的操作是这样子的:点击上面”Project”选项,在弹出的下拉菜单中选择“Close Project”即可。这时keil2软件处于“空”的状态,没有打开任何工程了。
----------------------------------步骤之间的分割线----------------------------------------
& && && & 第三步:打开一个现成的工程。
& && && & 点击上面”Project”选项,在弹出的下拉菜单中选择“Open Project”,在弹出的文件对话框中,找到需要被打开工程文件夹(本例程是上一节在D盘下建的“stc89c52rc”文件夹),在此文件夹目录下单击选中“stc89c52rc.Uv2”这个工程文件名,然后点击“打开”,就可以打开一个现有的工程文件了。
----------------------------------步骤之间的分割线----------------------------------------
6.1.4.1.png (31.18 KB, 下载次数: 35)
11:18 上传
& && && && && && && && && && && &图6.1.4.1
6.1.4.2.jpg (67.36 KB, 下载次数: 33)
11:18 上传
& && && && && && && && && && && &图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.png (37.88 KB, 下载次数: 39)
11:18 上传
& && && && && && && && && && && &图6.1.5.1
& && && &第五步:启动编译。
& && && &在确保stc89c52rc.c源文件里面有C语言源代码的情况下(如果没有,请先复制上一节的例程源代码),点击上面”Project”选项,在弹出的下拉菜单中点击“Rebuild all target files”编译命令,编译器开始编译工作。
----------------------------------步骤之间的分割线----------------------------------------
6.1.6.1.png (15.49 KB, 下载次数: 34)
11:18 上传
& && && && && && && && && && && &图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.png (26.55 KB, 下载次数: 32)
11:18 上传
& && && && && && && && && && && &图6.1.6.2
& && && &(2)查找错误的时候,只需要双击错误提示error那行内容,光标就会自动跳到源代码错误的附近,方便大家寻找语法错误。复制代码(3)还有一种很实用的方法,就是直接把提醒出错那一整行英文复制粘贴到网上去搜索,往往能搜索到所需的正确答案或者重要提示。
复制代码
&&----------------------------------步骤之间的分割线----------------------------------------
& && && &&&
6.1.7.1.png (83.77 KB, 下载次数: 32)
11:18 上传
& && && && && && && && && && && &图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.jpg (67.64 KB, 下载次数: 35)
00:02 上传
& && && && && && && && &图6.2.1
& && &&&如上图所示,在一个已经打开的工程里,鼠标右键点击选中左边选项框里面的”Target 1”选项,在右键下拉菜单中选择“&&Options for Target‘Target 1’ ”选项,弹出一个编译环境设置对话框,第一步单击上面子菜单切换到“Target”窗口下,第二步在Memory Model选项的下拉菜单中选中“Compact: variables in PDATA”,第三步在Code Ram Size选项的下拉菜单中选中“Large: 64K program”,第四步点击“确定”。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
10:28 编辑
第七节:本节预留。
& && && &本节预留。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
18:31 编辑
第八节:把.hex机器码程序烧录到单片机的操作流程。
(721.09 KB, 下载次数: 3300)
18:26 上传
点击文件名下载附件
(132.42 KB, 下载次数: 2596)
18:26 上传
点击文件名下载附件
【8.1& &烧录程序的本质。】
& && & “烧录”是比较专业的说法,很多初学者第一次听这词还以为跟火有关,莫名其妙的“烧录”是啥意思?烧录其实就是下载,烧录程序就是下载程序。下载好理解了吧,下载电影,下载歌曲,让播放器去播放。此处的下载程序跟下载歌曲的“下载”完全是一回事。有人会问,下载歌曲到手机,手机是成品,下载程序到单片机,单片机也是成品?新买回来的单片机不是一张白纸的电子元件吗?其实,新买回来的单片机就是一个成品,它不是白纸,它内部已经嵌入了一段系统程序,这个系统程序就像你刚买回来的手机就帮你预装了安卓系统一样,只是它的用户存储区是空白的。比如手机,你往这个存储区里存电影就可以看电影,存音乐就可以听音乐。比如单片机,你往这个存储区存不同的程序就可以让单片机做不同的事。而预装在新单片机内部的系统程序就是专门负责跟外部接口通讯,同时负责把hex格式的程序代码存放在单片机内部正确的位置,这个就是烧录程序(下载程序)的本质。这样一比喻,所以.hex格式的烧录文件跟.MP3格式的音乐文件在存储本质上是一样的。
& && &&&再回顾总结一下,烧录程序的本质是:把单片机当做一个存储器,每一条程序指令都对应一个唯一的存储地址,把这些指令以字节为单位一条条存储到指定的存储地址中,这就是烧录程序的本质。对于STC89C52RC单片机,在下载程序时需要上位机软件和一根USB转串口线。上位机软件负责把.hex格式的机器码文件打开,机器码文件里面记录着每条程序指令所对应的地址信息,下载过程时,上位机软件根据.hex文件记录的指令内容和对应的地址信息,经过USB转串口线,跟单片机的预置系统程序进行串口通讯,从而把.hex记录的信息传输到单片机内部的flash存储器中,实现了程序的烧录下载。
【8.2& &烧录程序所需的工具和软件。】
& && &(1)装有XP或者WIN7系统的电脑一台。
& && & 其它更高系统的我还没测试过,应该问题也不大。
8.2.2.png (67.89 KB, 下载次数: 34)
18:26 上传
& && && && && && && && && && && & 图8.2.2
& && &(2)带9针串口、1颗LED灯、电源拨动开关、能5V电源供电的stc89c52rc单片机核心板一块。
& && &&&单片机的学习离不开硬件平台的编程练习,本教程用的是坚鸿51学习板,此学习板的原理图在第七节已经分享到附件资料里。大家也可以根据原理图自己焊接一块学习板来学习,或者用其它厂家带有串口的单片机学习板来学习。
& && &&&串口是用来单片机跟电脑通讯的接口,是STC89C52RC单片机下载程序的通道。LED灯用来观察单片机是否正常运行程序。电源拨动开关方便烧录程序时提供所需的断电和上电的操作。本单片机系统是5V供电。
8.2.3.png (190.03 KB, 下载次数: 40)
18:26 上传
& && && && && && && && && && && & 图8.2.3
& && &(3)主控芯片是CH340的USB转RS232串口线一条。
& && & 我之所以推荐主控芯片是CH340的USB转RS232串口线,因为CH340的下载线在烧录程序时很稳定可靠。这款USB转串口线可以在淘宝购买到。
8.2.4.png (221.4 KB, 下载次数: 39)
18:26 上传
& && && && && && && && && && && & 图8.2.4
& &&&(4)5V供电的USB电源线一条。
& && &此USB线可以从电脑的USB口取电,也可以从输出5V的手机充电器处取电。但是我建议大家用输出5V的手机充电器来供电,因为很多电脑的USB口供电干扰比较大,会影响程序烧录。
8.2.5.png (45.2 KB, 下载次数: 35)
18:26 上传
& && && && && && && && && && && & 图8.2.5
& &&&(5)主控芯片是CH340的USB转RS232串口线驱动安装程序。
& && &此驱动程序USB转RS232串口线的厂家通常都会提供,但是建议用我在附件资料里推荐给大家的驱动程序,毕竟这个程序经过我本人验证测试过。
8.2.6.png (41.47 KB, 下载次数: 39)
18:26 上传
& && && && && && && && && && && & 图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.png (64.59 KB, 下载次数: 36)
18:26 上传
& && && && && && && && && && & 图8.3.1.1
8.3.1.2.png (18.05 KB, 下载次数: 37)
18:26 上传
& && && && && && && && && && & 图8.3.1.2
8.3.1.3.png (10.78 KB, 下载次数: 34)
18:26 上传
& && && && && && && && && && & 图8.3.1.3
& && & 第一步:安装USB转串口驱动程序。
& && & 上位机“stc-isp-15xx-v6.85I”烧录软件就是安装在电脑端的用户软件,电脑跟单片机进行通讯,需要一根USB转串口线,欲使USB转串口线正常工作,必须预先安装USB转串口的驱动程序。具体的操作是这样的:在本连载贴附件资料处下载“USB转串口的驱动程序CH340.zip”文件压缩包,解压后打开此文件夹,找到“SETUP.EXE”这个安装应用程序,双击启动,在弹出的界面中,单击“安装”按钮即可完成驱动程序的安装。
----------------------------------步骤之间的分割线----------------------------------------
8.3.2.1.png (64.37 KB, 下载次数: 35)
18:26 上传
& && && && && && && && && && & 图8.3.2.1
8.3.2.2.png (47.57 KB, 下载次数: 34)
18:26 上传
& && && && && && && && && && & 图8.3.2.2
8.3.2.3.png (72.34 KB, 下载次数: 37)
18:26 上传
& && && && && && && && && && & 图8.3.2.3
8.3.2.4.png (79.86 KB, 下载次数: 38)
18:26 上传
& && && && && && && && && && & 图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.png (58.59 KB, 下载次数: 30)
18:26 上传
& && && && && && && && && && && &图8.3.3
& && & 第三步:打开上位机用户软件“stc-isp-15xx-v6.85I.exe”。
& && & 这个软件可以在宏晶单片机的官网下载获取,获取到的软件压缩包只需解压后就可以使用,不用安装,
直接双击打开“stc-isp-15xx-v6.85I.exe”,此时会弹出“温馨提示”的窗口,我们按“确定”就可以进入到真正的工作界面了。
----------------------------------步骤之间的分割线----------------------------------------
8.3.4.jpg (132.39 KB, 下载次数: 33)
18:27 上传
& && && && && && && && && && && & 图8.3.4
& && & 第四步:选择单片机型号。
& && & 在“单片机型号”的下拉菜单中选择“STC89C/LE52RC”这个型号。如果中途弹出推荐选用其它型号的窗口,可以忽略它,我们用来学习只要认准“STC89C/LE52RC”这个型号就可以了。
----------------------------------步骤之间的分割线----------------------------------------
& && & 第五步:设置串口号。
& && & 点击“串口号”右侧的选项,在“串口号”的下拉菜单中,选择跟前面第二步所记录一样的串口号COM3(你们的串口号不一定是COM3,请根据你们的电脑实际显示情况来选择)。
----------------------------------步骤之间的分割线----------------------------------------
& && &&&第六步:设置最低波特率和最高波特率。
& && & “最低波特率”设置为2400,,“最高波特率”设置为9600。波特率如果设置太高,可能会导致烧录(下载)不成功。
----------------------------------步骤之间的分割线----------------------------------------
& && &&&第七步:导入.hex格式的机器码文件。
& && &&&点击“打开程序文件”的按钮,在弹出的对话框中,选择D盘下“stc89c52rc”文件夹目录下的“stc89c52rc.hex”,双击把“stc89c52rc.hex”导入到上位机用户软件。
----------------------------------步骤之间的分割线----------------------------------------
8.3.8.png (20.52 KB, 下载次数: 34)
18:27 上传
& && && && && && && && && && && &&&图8.3.8& && && && &
& && &&&第八步:启动下载。
& && &&&点击“下载/编程”的按钮,发现“正在检测目标单片机..”的提示信息,此时需要通过电源波动开关把51学习板重新断电然后再上电才能正常下载,很多人也把这个重新上电的过程称为“冷启动”。之所以要重新断电再上电,是因为单片机内部预置的系统程序只在上电短暂的瞬间才会检查一下是否接收到需要重新烧录程序的指令,如果没有接收到烧录指令,单片机整个话语权就由原来的系统程序转交给我们的用户程序来接管,所以此串口后面的时间就给我们用户程序来使用。因此每次烧录程序时,先启动上位机的下载命令,此时上位机不断发送请求下载的命令给单片机,但是此时单片机并不理会这些指令,因为此时单片机的话语权已经交给了我们的用户程序,此时并不是预置系统程序在掌控,所以除非重新断电然后再上电那一瞬间才会让系统内置程序去检测并且响应此下载命令。另外多说一句,其实不是所有厂家的单片机在烧录程序时都需要“冷启动”,也不是所有单片机都支持串口烧录,各厂家的单片机烧录程序方式会有一些差异,但基本原理是一样的,大同小异。
----------------------------------步骤之间的分割线----------------------------------------
8.3.9.png (24.77 KB, 下载次数: 34)
18:28 上传
& && && && && && && && && && && &&&图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口,或者尝试更换到其它电脑上试试。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
10:29 编辑
第九节:本节预留。
& && && & 本节预留。
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
11:22 编辑
第十节:程序从哪里开始,要到哪里去?
(85.68 KB, 下载次数: 2841)
11:22 上传
点击文件名下载附件
& && & 程序从哪里开始,要到哪里去?为了让初学者了解C语言程序的执行顺序,我把程序分成三个区域:进入主程序前的区域,主程序的初始化区域,主程序的循环区域。当然,这里三个区的分类暂时没有把中断程序的情况考虑进去,中断程序的内容我会在后面相关的章节中再详细介绍,这里暂时不考虑中断。
& && & 进入主程序前的区域。这是上电后,在单片机执行主程序代码之前就已经完成了的工作。包括头文件的包含,宏定义,内存分配这些工作。这部分的内容可以暂时不用去了解,我会在后面的一些章节中陆续深入讲解。
& && & 主程序的初始化区域。这是上电后,单片机进入主程序后马上就要执行的程序代码,这部分区域的代码有一个特点,大家也必须记住的,就是单片机只执行一次。只要单片机不重启,不复位,那么上电后这部分的代码只被执行一次。
& && & 主程序的循环区域。单片机在主程序中执行完了初始化区域的代码,紧接着就进入这片循环区域的代码。单片机一直在逐行循环执行这些代码,执行到末尾时又返回到循环区域的开始处继续开始新一轮的执行,周而复始,往复循环,这就是上电后单片机的最终归宿,一直处在循环的状态。
& && & 下面我跟大家分析一个程序源代码的三个区域和执行顺序,大家先看中文解释部分的内容,暂时不用理解每行指令的语法,有个整体的认识就可以了。此源代码实现的功能是:上电后,蜂鸣器鸣叫一声就停止(初始化区域),然后看到一个LED灯一直在不停的闪烁(循环区域)。
10.1.png (38.73 KB, 下载次数: 37)
11:22 上传
& && && && && && && && && && && && && &&&图10.1
源代码如下:
#include &REG52.H&& && && && & //进入主程序前的区域:头文件包含
sbit beep_dr=P3^4;& && && && &//进入主程序前的区域:宏定义
sbit led_dr=P1^6;& && && && && &//进入主程序前的区域:宏定义
& && && && && && &//进入主程序前的区域:内存分配
void main()& && && && && && && && &&&//主程序入口,即将进入初始化区域
{
& &beep_dr=0;& && && && && && && &//第一步:初始化区域:蜂鸣器开始鸣叫。
& &for(i=0;i&6250;i++);& && & //第二步:初始化区域:延时0.5秒左右。也就是蜂鸣器鸣叫的持续时间。
& &beep_dr=1;& && && && && && && &//第三步:初始化区域:蜂鸣器停止鸣叫。
& &while(1)& && && && && && && && && &//执行完上面的初始化区域,即将进入循环区域
& &{
& && & led_dr=0;& && && && && && &&&//第四步:循环区域:LED开始点亮。
& && & for(i=0;i&6250;i++);& &//第五步:循环区域:延时0.5秒左右。也就是LED点亮的持续时间。
& && & led_dr=1;& && && && && && &&&//第六步:循环区域:LED开始熄灭。
& && & for(i=0;i&6250;i++);& &//第七步:循环区域:延时0.5秒左右。也就是LED熄灭的持续时间。
& &}& && && && && && && && && && && && &&&//执行完上面第七步后,单片机又马上返回到上面第四步继续往下执行。
} 复制代码
& && &上述代码执行顺序分析:
& && &单片机进入主程序后,从第一步到第三步是属于初始化区域,只被执行一次。然后进入循环区域,从第四步执行到第七步,执行完第七步之后,马上又返回上面第四步继续循环往下执行,单片机一直处于第四步到第七步的往复循环中。可以很清晰的看到,上面的main和while(1)关键词就是三个区域的边界分割线。& &
& && &经过以上的分析,可以看出这三个区域的大概分布如下:
//...进入主程序前的区域
void main()& && && && && &
{
& &//...初始化区域
& &while(1)& && && && && && && &
& &{
& && & //...循环区域
& &}
}
复制代码
乐于分享,勇于质疑!
本帖最后由 jianhong_wu 于
10:42 编辑
第十一节:一个在单片机上练习C语言的模板程序。
(1.42 KB, 下载次数: 284)
10:40 上传
点击文件名下载附件
(294.23 KB, 下载次数: 572)
10:40 上传
点击文件名下载附件
【11.1& &一套完整的模板源代码。】
& && & 先给大家附上一套完整的模板源代码,后面章节练习C语言的模板程序就直接复制此完整的源代码,此源代码适合的单片机型号是STC89C52RC,晶振是11.0592MHz,串口波特率是9600,初学者只需修改代码里从“C语言学习区域的开始”到“C语言学习区域的结束”的区域,其它部分不要更改。可复制的源代码请到网上论坛原贴处复制或者下载,搜索本教程名字就可以找到原贴出处。一套完整的模板源代码如下:
#include &REG52.H&
void View(unsigned long u32ViewData);
void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type);
void SendString(unsigned char *pu8String);& &
/*---C语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
& & //定义一个变量a。
& &unsigned int&&b; //定义一个变量b。
& & //定义一个变量c。
& &a=100;& && && & //给变量a赋值。
& &b=10000;& && &&&//给变量b赋值。
& &c=;& &//给变量c赋值。
& &View(a);& &//在电脑串口端查看第1个数a。
& &View(b);& &//在电脑串口端查看第2个数b。
& &View(c);& &//在电脑串口端查看第3个数c。
& &while(1)&&
& &{
/*---C语言学习区域的结束。-----------------------------------------------*/
void View(unsigned long u32ViewData)
{
& & static unsigned char Su8ViewBuffer[43];
& && && && &code unsigned char Cu8_0D_0A[]={0x0d,0x0a,0x00};
& && && &&&code unsigned char Cu8Start[]={&开始...&};
& & static unsigned char Su8FirstFlag=0;
& & static unsigned int Su16FirstD
& & if(0==Su8FirstFlag)
& && && && &{
& && && &&&Su8FirstFlag=1;
& && && &&&for(Su16FirstDelay=0;Su16FirstDelay&10000;Su16FirstDelay++);
& && && &&&SendString(Cu8Start);&&
& && && &&&SendString(Cu8_0D_0A);&&
& && && &&&SendString(Cu8_0D_0A);&&
& &}
& & to_BufferData(u32ViewData,Su8ViewBuffer,1);
& && && & SendString(Su8ViewBuffer);&&
& & to_BufferData(u32ViewData,Su8ViewBuffer,2);
& && && &SendString(Su8ViewBuffer);&&
& & to_BufferData(u32ViewData,Su8ViewBuffer,3);
& && && &SendString(Su8ViewBuffer);&&
& & to_BufferData(u32ViewData,Su8ViewBuffer,4);
& && && && &SendString(Su8ViewBuffer);&&
& && && &&&SendString(Cu8_0D_0A);&&
}
void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type)
{
& && &&&code unsigned char Cu8Array1[]={0xB5,0xDA,0x4E,0xB8,0xF6,0xCA,0xFD,0x00};
& && && &code unsigned char Cu8Array2[]=&十进制:&;
& && && && &code unsigned char Cu8Array3[]=&十六进制:&;
& && && &code unsigned char Cu8Array4[]=&二进制:&;
& & static unsigned char Su8SerialNumber=1;
& & static unsigned int&&Su16BufferC
& & static unsigned int&&Su16TempC
& & static unsigned int&&Su16TempS
& & static unsigned long Su32Temp1;
& & static unsigned long Su32Temp2;
& & static unsigned long Su32Temp3;
& & static unsigned char Su8ViewF
& & if(1==u8Type)
& && && & {
& && &&&for(Su16BufferCnt=0;Su16BufferCnt&7;Su16BufferCnt++)
& && && && && & {
& && && && && && & pu8Buffer[Su16BufferCnt]=Cu8Array1[Su16BufferCnt];
& && && && &&&}
& && && && && & pu8Buffer[2]=Su8SerialNumber+'0';
& && && && && &pu8Buffer[Su16BufferCnt]=0x0d;
& && && && && &pu8Buffer[Su16BufferCnt+1]=0x0a;
& && && && && & pu8Buffer[Su16BufferCnt+2]=0;
& && && && & Su8SerialNumber++;
& && && && && &
& && && &&&}
& & else if(2==u8Type)
& && && && &{
& && && && && & for(Su16BufferCnt=0;Su16BufferCnt&7;Su16BufferCnt++)
& && && && && & {
& && && && && && && &&&pu8Buffer[Su16BufferCnt]=Cu8Array2[Su16BufferCnt];
& && && && && & }
& && && && && &Su32Temp1=;
& && && && && && & Su32Temp2=10;
& && && && && && & Su16TempSet=10;
& && && & }
& & else if(3==u8Type)
& && && &{
& && && && && & for(Su16BufferCnt=0;Su16BufferCnt&9;Su16BufferCnt++)
& && && && && & {
& && && && && && && &&&pu8Buffer[Su16BufferCnt]=Cu8Array3[Su16BufferCnt];
& && && && && & }
& && && && && & Su32Temp1=0x;
& && && && && && &&&Su32Temp2=0x;
& && && && && && &&&Su16TempSet=8;& && &&&
& & }
& & else
& & {
& && && && && & for(Su16BufferCnt=0;Su16BufferCnt&7;Su16BufferCnt++)
& && && && && & {
& && && && && && && &&&pu8Buffer[Su16BufferCnt]=Cu8Array4[Su16BufferCnt];
& && && && && & }
& && && && && & Su32Temp1=0x;
& && && && && && &&&Su32Temp2=0x;
& && && && && && &&&Su16TempSet=32;& && &&&
& && && &&&}
& & Su8ViewFlag=0;
& & for(Su16TempCnt=0;Su16TempCnt&Su16TempSSu16TempCnt++)
& & {
& && & Su32Temp3=u32Data/Su32Temp1%Su32Temp2;
& && && && && &if(Su32Temp3&10)
& && && && && &{
& && && && && &&&pu8Buffer[Su16BufferCnt]=Su32Temp3+'0';
& && && && && &}
& && && && && &else
& && && && && &{
& && && && && &&&pu8Buffer[Su16BufferCnt]=Su32Temp3-10+'A';
& && && && && &}
& && && && && &if(0==u32Data)
& && && && && &{
& && && && && && && &&&Su16BufferCnt++;
& && && && && && && &&&
& && && && && &}
& && && && && &else if(0==Su8ViewFlag)
& && && && && &{
& && && && && && & if('0'!=pu8Buffer[Su16BufferCnt])
& && && && && & {
& && && && && &Su8ViewFlag=1;
& && && && && && && && && && & Su16BufferCnt++;
& && && &&&}
& && && && && &}
& && && && && &else
& && && && && &{
& && && && && && & Su16BufferCnt++;
& && && && && &}
& && & Su32Temp1=Su32Temp1/Su32Temp2;
& & }
& & pu8Buffer[Su16BufferCnt]=0x0d;
& & pu8Buffer[Su16BufferCnt+1]=0x0a;
& & pu8Buffer[Su16BufferCnt+2]=0;
}
void SendString(unsigned char *pu8String)& &
{
&&static unsigned int Su16SendC
&&static unsigned int Su16D
&&SCON=0x50;
&&TMOD=0X21;
&&TH1=TL1=256-(/32/9600);&&
&&TR1=1;
&&ES = 0;
&&TI = 0;
&&for(Su16SendCnt=0;Su16SendCnt&43;Su16SendCnt++)
&&{
& &&&if(0==pu8String[Su16SendCnt])
& && && && & {
& && && && && &&&
& && && && & }
& && && && & else
& && && && & {
& && &&&SBUF =pu8String[Su16SendCnt];
& && &&&for(Su16Delay=0;Su16Delay&800;Su16Delay++);
& && && && && && & TI = 0;
& && && && & }
&&}
}
复制代码
【11.2& &模板程序的使用说明。】
11.1.png (65.67 KB, 下载次数: 36)
23:51 上传
& && && && && && && && && && && &图11.2.1
& && & 大多数初学者在学习C语言的时候,往往是在电脑端安装上VC平台软件来练习C语言,这种方法只要在代码里调用printf语句,编译后就可以看到被printf语句调用的变量,挺方便的。本教程没有用这种方法,既然本教程的C语言主要针对单片机,所以我想出了另外一种方法,这种方法就是直接在单片机上练习C语言,这样会让初学者体验更深刻。这种方法对硬件平台要求不高,只要51学习板上有一个9针的串口就可以,这个串口既可以用来烧录程序,也可以用来观察代码里的某个变量,只要在代码里调用View函数就可以达到类似VC平台软件下printf语句的效果,View函数可以向串口输出某个变量的十进制,十六进制和二进制,大家只要在电脑端的串口助手软件就可以看到某个变量的这些信息,View函数能查看的变量最大数值范围是4个字节的unsigned long变量,十进制的范围是从0到,也可以查看unsigned int 和unsigned char的类型变量(数据的进制以及long,int,char等知识点大家目前还没接触到,因此不懂也没关系,当前只要有个大概的认识就可以,暂时不用深入理解,后面章节还会详细介绍)。View函数是我整个模板程序的其中一部分,所以要用这种方法就必须先复制我整个模板程序,初学者练习代码的活动范围仅仅局限于模板程序里的“C语言学习区域”,在此区域里有一个main主函数,main主函数内有一个初始化区域,初学者往往在这个初始化区域里练习C语言就够了,初学者最大的活动范围不能超过从“C语言学习区域的开始”到“C语言学习区域的结束”这个范围,这个范围之外其它部分的代码主要用来实现数据处理和串口发送的功能,大家暂时不用读懂它,直接复制过来就可以了。比如:
/*---C语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
& &//...初始化区域,也就是主要用来给初学者学习C语言的区域。
& &while(1)&&
& &{
/*---C语言学习区域的结束。-----------------------------------------------*/复制代码
& && & 上述例子中,初学者练习代码只能在从“C语言学习区域的开始”到“C语言学习区域的结束”这个范围,此范围外的代码直接复制过来不要更改。我们再来分析分析下面节选的main函数源代码:
/*---C语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
& & //定义一个变量a。
& &unsigned int&&b; //定义一个变量b。
& & //定义一个变量c。
& &a=100;& && && & //给变量a赋值。
& &b=10000;& && &&&//给变量b赋值。
& &c=;& &//给变量c赋值。
& &View(a);& &//在电脑串口端查看第1个数a。
& &View(b);& &//在电脑串口端查看第2个数b。
& &View(c);& &//在电脑串口端查看第3个数c。
& &while(1)&&
& &{
/*---C语言学习区域的结束。-----------------------------------------------*/复制代码
& && &上述节选的main函数代码里,比如“a=100;& && && & //给变量a赋值。”这行代码,所谓的“赋值”就是“=”这个语句,它表面上像我们平时用的等于号,实际上不是等于号,而是代表“给”的意思,把“=”符号右边的数复制一份给左边的变量,比如“a=100;”就是代表把100这个数值复制一份给变量a,执行这条指令后,a就等于100了。这里的分号“;”代表一条程序指令的结束。 而双斜线“//”是注释语句,双斜线“//”这行后面的文字或字符都是用来注释用的,编译器会忽略双斜线“//”这一行后面的文字或字符,编译器不把注释文字或字符列入源代码,也就是“//”这一行中后面的文字或字符是不占单片机内存的。当然“//”仅仅局限于当前一行代码。上面除了“//”是注释语句外,上面的“/*”和“*/”之间也是注释语句,跟”//”的作用一样,只不过“/*”是注释开始,“*/”是注释结束,它们的范围不局限于一行,而是从“/*”到“*/”的范围,因此可以用于注释连着的多行文字或者字符。
& && &接着在分析上述代码中最重要的函数,也是本节最核心最重要的函数View(某个变量)。比如“ View(a); ”这行代码,View(a)就是要把变量a的十进制,十六进制和二进制的数值都发送到串口,我们通过USB转串口线让学习板连接上电脑,在电脑串口助手软件上就能看到被View函数调用的变量a的信息。
【11.3& &如何在电脑上使用串口助手软件查看被View函数调用的变量?】
& && &前面章节在讲烧录程序时提到一个叫“stc-isp-15xx-v6.85I”的上位机软件,这个软件除了用来烧录程序,还集成了串口助手软件的功能。所以本节直接共用烧录程序时的USB转串口线和“stc-isp-15xx-v6.85I”软件就可以了,无需额外再购买新的USB转串口线和下载其它串口助手软件,但是如何设置这个“stc-isp-15xx-v6.85I”上位机软件,还是有一些需要特别注意的地方的,现在把这个详细的步骤介绍给大家。
& && &第一步:设置烧录软件的选项。
& && &按前面章节介绍烧录程序时所需的步骤,用USB转串口线连接51学习板和电脑,记录COM号,打开“stc-isp-15xx-v6.85I”软件,选择单片机型号,选择对应的串口号(COM号),设置最低波特率和最高波特率,这部分的内容跟烧录程序时的配置步骤是一样的,唯一必须要特别注意的是最高波特率必须选择9600!最低波特率建议选择2400。否则在烧录完程序后,当上位机集成软件自动切换到串口助手软件窗口时,接收区域显示的一些汉字信息可能会出现乱码。
----------------------------------步骤之间的分割线----------------------------------------
11.3.2.jpg (123.33 KB, 下载次数: 36)
23:51 上传
& && && && && && && && && && && &图11.3.2
& && &第二步:设置串口助手软件的选项。
& && &先点击右上方选中“串口助手”选项切换到串口助}

我要回帖

更多关于 郭天祥十天学会单片机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信