新書推薦:
《
失败:1891—1900 清王朝的变革、战争与排外
》
售價:NT$
390.0
《
送你一匹马(“我不求深刻,只求简单。”看三毛如何拒绝内耗,为自己而活)
》
售價:NT$
295.0
《
秦汉史讲义
》
售價:NT$
690.0
《
万千心理·我的精神分析之道:复杂的俄狄浦斯及其他议题
》
售價:NT$
475.0
《
荷马:伊利亚特(英文)-西方人文经典影印21
》
售價:NT$
490.0
《
我的心理医生是只猫
》
售價:NT$
225.0
《
巴拉吉预言
》
售價:NT$
340.0
《
股权控制战略:如何实现公司控制和有效激励(第2版)
》
售價:NT$
449.0
|
編輯推薦: |
《手把手教你学51单片机(C语言版)》的创作,目的就是改变当前“51单片机”教学与自学的模式;所以这本书的创作过程已经创造了诸多业界第一:国内首创“手把手教你学”——集理论知识、视频教程、教学课件与技术支持于一体的教学解决方案!未出版图书就接收到数百份订单!本科院校、职业院校的多名主讲教师阅读样章后一致认同并采用为教材(对于购买教师读者,将遴选赠送开发板)。可以预见,《手把手教你学51单片机(C语言版)》将引领一场单片机教学的革命!
|
內容簡介: |
《手把手教你学51单片机(C语言版)》旨在培养和锻炼单片机系统实用开发技能,全书以实践为主线,让读者在一个个实践案例中逐步掌握单片机电路设计与程序代码编写能力。书中的内容从最初点亮一个小灯的简单实验,逐步扩展知识面,到最后多功能电子钟的实际项目开发指导,不仅讲解了大量原理性知识,更重要的是给读者提供了实际项目开发的思路和经验,可以让读者从实践过程中提高自己发现问题、分析问题、解决问题的能力。本书的参编人员都是拥有多年实际项目研发经验的资深工程师,因此书中的内容涵盖了大量的实际项目中所采用的技术和技巧,具有极强的实时性和先进性,为读者铺就一条从单片机初学者晋级为工程师的康庄大道。本书适合刚刚接触单片机的初学者自学阅读,又可以作为各类院校电子技术相关专业的单片机教材,同时对电子行业的从业技术人员也有很高的参考价值。
|
關於作者: |
宋雪松:国内知名单片机培训专家,嵌入式产品技术顾问。拥有近十年产品研发经验,曾主持研发通信类、虚拟仪器等多款产品,在硬件电路设计和嵌入式软件设计方向有丰富的项目实战经验。2010年创立金沙滩工作室(www.kingst.org),致力于实用化的单片机技术教育,出品《手把手教你学51单片机》视频教程,该教程以通俗的语言、专业的思路和精湛的技术获得了广大读者一致好评,广为传播。
|
目錄:
|
赞誉
前言
第1章 如何学习单片机
1.1 学什么类型的单片机
1.2 学习单片机的最佳方法
1.3 单片机学习的准备工作
1.4 单片机开发软件环境搭建
1.5 Keil基本概况介绍
1.6 答读者问
第2章 点亮你的LED
2.1 单片机的内部资源
2.2 单片机最小系统
2.2.1 电源
2.2.2 晶振
2.2.3 复位电路
2.3 LED小灯
2.4 程序代码编写
2.4.1 特殊功能寄存器和位定义
2.4.2 新建一个工程
2.4.3 编写点亮小灯的程序
2.5 程序下载
2.6 练习题
第3章 硬件基础知识学习
3.1 电磁干扰
3.2 去耦电容的应用
3.3 三极管在数字电路中的应用
3.3.1 三极管的初步认识
3.3.2 三极管的原理
3.3.3 三极管的应用
3.4 74HC138三八译码器的应用
3.5 LED闪烁程序
3.6 练习题
第4章 C语言基础以及流水灯的实现
4.1 二进制、十进制和十六进制
4.2 C语言变量类型和范围
4.3 C语言基本运算符
4.4 for循环语句
4.5 while循环语句
4.6 函数的简单介绍
4.7 Keil软件延时
4.8 流水灯程序
4.9 练习题
第5章 定时器与数码管基础
5.1 逻辑电路与逻辑运算
5.2 定时器的学习
5.2.1 定时器的初步认识
5.2.2 定时器的寄存器
5.2.3 定时器的应用
5.3 数码管的学习
5.3.1 数码管的基本介绍
5.3.2 数码管的真值表
5.3.3 数码管的静态显示
5.4 练习题
第6章 中断与数码管动态显示
6.1 C语言的数组
6.1.1 数组的基本概念
6.1.2 数组的声明
6.1.3 数组的初始化
6.1.4 数组的使用和赋值
6.2 if语句
6.3 switch语句
6.4 数码管的动态显示
6.4.1 动态显示的基本原理
6.4.2 数码管显示消隐
6.5 单片机中断系统
6.5.1 中断的产生背景
6.5.2 定时器中断的应用
6.5.3 中断的优先级
6.6 练习题
第7章 变量进阶与点阵LED
7.1 变量的作用域
7.1.1 局部变量
7.1.2 全局变量
7.2 变量的存储类别
7.3 点阵的初步认识
7.4 点阵的图形显示
7.5 点阵的动画显示
7.5.1 点阵的纵向移动
7.5.2 点阵的横向移动
7.6 练习题
第8章 函数进阶与按键
8.1 单片机最小系统
8.1.1 电源
8.1.2 晶振
8.1.3 复位电路
8.2 函数的调用
8.3 函数的形式参数和实际参数
8.4 按键
8.4.1 独立按键
8.4.2 矩阵按键
8.4.3 独立按键的扫描
8.4.4 按键消抖
8.4.5 矩阵按键的扫描
8.5 简易加法计算器
8.6 练习题
第9章 步进电机与蜂鸣器
9.1 单片机IO口的结构
9.2 上下拉电阻
9.32 8BYJ48型步进电机详解与实例
9.3.1 电机的分类
9.3.2 28BYJ48型步进电机原理详解
9.3.3 让电机转起来
9.3.4 转动精度与深入分析
9.3.5 编写实用程序的基础
9.3.6 包含综合应用的实用程序
9.4 蜂鸣器
9.5 练习题
第10章 实例练习与经验积累
10.1 数字秒表实例
10.1.1 不同数据类型间的相互转换
10.1.2 定时时间精准性调整
10.1.3 字节操作修改位的技巧
10.1.4 数码管扫描函数算法改进
10.1.5 秒表程序
10.2 PWM知识与实例
10.3 交通灯实例
10.4 51单片机RAM区域的划分
10.5 长短按键的应用
10.6 练习题
第11章 UART串口通信
11.1 串行通信的初步认识
11.2 RS232通信接口
11.3 USB转串口通信
……
第12章 指针基础与I602液晶的初步认识
第13章 I602液晶与串口的应用实例
第14章 I2C总线与E2PROM
第15章 实时时钟DSI302
第16章 红外通信与DS18B20温度传感器
第17章 模数转换AD与数模转换DA
第18章 RS-485通信与Modbus协议
第19章 实践项目开发——多功能电子钟
第20章 单片机开发常用工具的使用
附录A ASCII码字符表
附录B C语言运算符及优先级
附:KST-51开发板原理图
|
內容試閱:
|
第一章.如何学习单片机
在错误的道路上日夜兼程,最终也无法成功,方法和思路绝对是第一重要的。一些学技术的同学,往往看到这类章节会直接跳过去,因为大多数类似章节都是废话连篇。但是,今天在这里我可以很负责任的告诉你,本章节讲到的学习单片机的方法,都是我们学习单片机的无数经验和教训总结出来的瑰宝。因为我们披荆斩棘,开辟了道路,所以可以告诉你路在何方;也因为我们摸过烧红的铁块,烫了手,所以也可以告诉你教训和代价是什么。希望各位都能站在我们的肩膀上,看得更远!
1.1 学什么单片机
单片机的型号那么多,如何选取一款合适的进行学习?如果身边有比较现成的学习单片机的条件,有什么条件就学习什么型号。比如,你所在的公司刚好用到某个型号单片机,那么就方便多了。开发板不用购买,直接用公司现成的板子,指导老师到处是,公司的工程师,只要你耐心虚心的不耻上问,相信他们都愿意帮你解答问题。或者你跟着学习的导师,正在使用某个型号的单片机开发产品,那么同样的道理,你也会有得天独厚的优势,直接跟着学就行了。单片机型号虽然众多,看起来纷繁复杂,其实它们的基本原理、基本用法都是相通的,只要熟练掌握其中一种,其它的都可以触类旁通,快速上手了。
如果你这些条件都没有,那就跟着我学吧,我建议你学习51单片机。为什么呢?虽然现在单片机种类和型号非常多,每个型号都有一定的市场份额,但是哪个型号也没有早期51单片机那般风光和火爆,虽然现在地位不是那么高了,但是因为51单片机积累的资料非常多,大家学起来就会拥有众多的参考资料,所以上手肯定比其他型号的要快一些。如果你学习稍微偏门的单片机,可能一个简单的软件问题就要折腾你好长时间,不仅仅浪费了你的学习时间,更重要的是打击了学习单片机的信心。
那么是不是每种单片机我们都要学一遍呢?答案当然是否定的。大家跟着我来学习51单片机,必须得跟着学会举一反三和融会贯通的能力。单片机型号那么多,挨个学下来估计头发白了也学不完,所以大家跟着我学51单片机,不能仅仅当做51来学习,更重要的是要当做“单片机”来学,要通过我们的这个教程,把所有的单片机的内部资源都搞清楚弄明白,每个内部模块的用法理解透彻,这样当你遇到一个从没有用过的单片机,也就知道如何下手去使用它进行开发了。
1.2 如何学习单片机
前边提到过,单片机是一门实用技术,我们学习它已经不是为了应付考试了,我给大家总结了单片机的学习方法是:一个要领,四个步骤。
学习单片机的要领就是:在实践中成长,In Doing We Learn!
学射箭,你得去拉弓,整天只摆造型肯定不行;学游泳,你得下水扑腾,整天在岸上做模仿活动不行;学开车,你得坐车上去开,坐沙发上肯定学不会。同样的道理,学单片机,整天盯着单片机书看肯定不行,你也必须得亲自动手去练。
没有不下水就学会游泳成为游泳健将的,没有不到车上练就能成为赛车手的,这点大家都清楚,可为什么那么多人学单片机的时候,总是只抱着一本书看呢。第一,我们小学中学甚至大学的学习模式都是如此,学什么东西主要都是靠看书,应付书面考试;第二,很多人想实践却不太清楚该怎么去实践。
遇到问题查下书比直接看书的效果要好过百倍。不是不让大家看书,而是看了一点以后,要马上去实践验证,然后再回头结合实践的结果,理解书上的内容。从这个地方,大家要得出一个结论来,就是在学实际技术的过程中,和应付考试不同,书上的内容不需要你去硬性记忆,书是用来查的,不是用来背的。
下面,就是我总结的跟着我学习单片机的四个步骤。
第一步:鹦鹉学舌。
刚出生的孩子叫“爸爸”“妈妈”的时候,他甚至不知道“爸爸”“妈妈”是什么意思,更不会理解这些声音是什么意思,但是我们带着孩子见到他爸爸就让他喊“爸爸”,见到妈妈就让他喊“妈妈”,见到爷爷就喊“爷爷”……慢慢的你会发现,次数多了,孩子就知道谁是爸爸,谁是妈妈,谁是爷爷,谁是奶奶了。
大家刚开始接触单片机的时候,也属于单片机行业的新生儿。单片机的样子,单片机外围的各种器件,单片机内部的各种结构,单片机使用C语言的编程方法,初学者可能都没有见过,脑子里全无概念。没关系,有些概念和方法你不理解也没有关系,甚至不需要你去理解,你只需要跟着我去鹦鹉学舌式的学习,第一遍学习某一节课的内容时,对于程序,大家就可以完全跟着抄下来,甚至抄两三遍,过一段你会发现,好多东西你也认识了,好多概念你也慢慢的理解清楚了,你也能大概看懂别人的小程序了,切忌觉得自己看会了,而简单复制粘贴。
第二步:照葫芦画瓢。
很多同学学习的时候喜欢看,看我做的视频,看我写的程序,甚至看别人的程序,都能看懂,觉得自己就会了,等到自己写程序的时候,感觉就是老鼠啃天,不知道从哪里下手了,这是初学者很容易犯的“眼高手低”的毛病,所以第二步的内容就非常重要了。
我的要求是,每一位同学,在学完了当前课的内容,把第一步顺利完成以后,然后关掉视频教程,关掉源代码,自己通过看电路图和查找非源代码的其他任何资料,把当节课我写的程序代码重新默写出来,边写边多少理解那么一点点,不是纯粹的背诵,应该说是背诵加理解的结合体。甚至学过几节课以后,可以回头把前边曾经这样实现过的课程,再按照这种方法做一遍。千万不要认为这一步没必要,这一步是你能否真正学会单片机的一个关键,在学完本教程之前,每一课内容都要这样做,如果每一个程序你都能够完美的完成,那么可以说,当节课的内容,百分之七八十你已经掌握了。
第三步:他山之石,可以攻玉。
单片机技术的最大特点就是可以通过修改程序来实现不同的功能,因此举一反三的能力就必不可少了。每一节课的例程后边,我一般都会布置几个作业,大家尽量去独立完成这个作业。在完成这个作业的过程中,都可以参考我的程序思路,在这个基础上通过动脑思考去构建你自己的程序框架,最终将程序完成。
在我们工程师实际产品研发的时候,很多种情况下也是如此。比如一个产品,我们如果从零起步的话,可能会走很多弯路,遭遇很多前人已曾遭遇过的挫折,所以我们通常的做法是寻找购买几款同类产品,然后先研究他们的各自优缺点,学习他们的长处,然后在同类产品基础上再来设计我们自己的产品,这就是“他山之石,可以攻玉”。
初学者在学习的时候,往往遇到的问题很多,你应该想到,你遇到的问题,可能前辈们早就遇到过了,所以遇到问题后,不要慌张,首先利用谷歌或者百度这些搜索引擎在网上搜一下,要做什么新东西,先去网上找相关资料了解一下,不管是编程还是硬件设计,多多参考别人的东西,只要把别人的东西分析明白了,自己用起来了,也就成为自己的知识了。
第四步:理论实践结合,温故知新。
当大家把所有的课程都按照前边三步完成后,这个时候不妨再把书打开,再看看书,经过了自己的实战经历,再看书的时候,对很多知识点会有一种恍然大悟的感觉。甚至视频教程、书籍都可以反复看几遍,可能有的知识点当时学习的时候不明白,过了一段时间,回过头来再学习的时候,一下就明白了。
1.3 单片机学习的准备工作
第一:足够的信心、恒心和耐心。
有同学问过我,单片机这门技术难不难。我觉得这个问题得从两个方面去分析。
首先,我们从战略上藐视它。那么多同学跟着老师学一段时间就可以做出来小车,超声波测距,甚至做出来机器人,似乎很拽的样子。那他们又不是三头六臂,我们也没有什么做不了的道理。实际上要说技术,其实就是一层窗户纸,表面看不透彻,感觉特别神秘,实际只要你稍微一努力就可以捅破它,夸张点说,单片机在逻辑上的关系,只有小学的水平,简单的很。正所谓会者不难,难者不会,大家不懂这个东西,看起来感觉很神秘。所以大家只要认真踏实坚持学下去,肯定能学好这么技术。
其次呢,我们从战术上要重视它。你说单片机这东西,如果十天八天就学会了,那么这个技术还能值钱吗?我可以这样去表达,如果一个技术很简单就被学会,那么很多人都会的这个技术,肯定也没什么前途和钱途。那究竟多久能学会呢?我给大家制定的学习方案,根据每个人的基础不同,平均每天要拿出2个小时以上的学习时间,大概一到三个月可以入门。入门的概念是给你一个单片机开发任务,你起码知道要努力的方向和解决问题的大概方法了。技术这东西,关键是坚持做下去,有恒心和耐心,如果长时间不用的话,肯定还会生疏。所以要想成为单片机高手,起码需要一年左右的单片机开发的历练才行。成为单片机高手的概念就是你自己可以从头根据自己的想法,去设计一个电路,根据需要的功能编写代码,做一个产品出来。
第二:教材和教程。
要学习单片机这门技术,良好的教材和教程必不可少。单片机方面,大家可以直接学习我们这本《手把手教你学单片机——51单片机C语言开发》,我们还精心制作了配套的《手把手教你学单片机》的视频教程。本着开源、共享的理念,我们的视频教程都是免费开放的,大家可以到我们的网站www.kingst.org找到下载链接。另外,因为我们做单片机开发使用的是C语言,所以最好能再有一本纯C语言的教材,学到一些C语言的细节问题的时候,可以方便大家查阅,或者你也可以直接把相关问题通过谷歌和百度搜索一下,绝大部分情况下它们都会给你满意的答案的。
第三:电脑一台、单片机开发板一块。
电脑,是学习单片机必不可少的工具,因为编写程序,查阅资料都得用到,但是有句题外话说一下,不要把电脑当成游戏机或者影碟机,偶尔玩玩游戏看看电影是可以的,劳逸结合,但是不可沉溺其中,否则还不如没有电脑。
单片机开发板,这也是必须的。如果你还在上学,学校实验室一般会有开发板,可以考虑跟老师借一个,或者使用师兄师姐们用完的,这样可以省点钱。当然,如果身边有高手,比如辅导老师,会单片机的师兄,在他们的指导下做一个也可以,身边有人指导的话,不懂的问题还可以问他们。如果这些条件都不具备,那么可以购买一个,先学习别人的板子设计思路,给自己以后设计电路板打下基础。在这里就顺便推荐一下我们的KST-51开发板,我不敢说我们的设计是最好的,但是我可以很负责任的说,我们的板子是出自经验丰富的一线工程师之手,其中的设计都是根据实际项目开发的思路进行的,包括整体规划、电路设计、器件布局等等,可以为你今后的项目开发提供一个优质的参考。另外一方面,因为我们的教程是基于我们的开发板做的,所以大家配套来用的话可以节省时间,提高学习效率。
当然,即使不购买我们的开发板,你想学单片机,也还是要有一块开发板的,不能总是用软件仿真,软件仿真是学不会单片机的。经常有同学过来问我,老师我用软件模拟的好用,做了硬件不好用是什么原因。在这里我提一下,如果你上课用这个软件仿真,糊弄老师应付考试是可以的,但是实际开发和仿真软件却差别很大,如果真心想学好单片机这门技术,那我只能告诉你,拿起烙铁焊电路,动手写程序,远离仿真软件,靠软件仿真永远学不到真正的技术。
1.4单片机开发软件环境搭建
单片机开发,首要的两个软件一个是编程软件,一个是下载软件。编程软件我们用Keil uVision4的51版本,也叫做Keil C51,不做过多介绍,先直接讲如何安装。
1、首先准备Keil uVision4安装源文件,双击安装文件,弹出安装的欢迎界面,如图1-1所示。
2、点击“Next”按钮,弹出“License Agreement”对话框,如图1-2所示。这里显示的是安装许可协议,需要在“I agree to all the terms of the preceding License Agreement”打勾。
3、点击“Next”按钮,弹出“Folder Selection”对话框,如图1-3所示。这里可以设置安装路径,默认安装路径在“C:\Keil”文件夹下。点击“Browse...”按钮,可以修改安装路径,这里建议大家用默认的安装路径,如果你要修改,也必须使用英文路径,不要使用包含有中文字符的路径。
4、点击“Next”按钮,弹出“Customer Information”对话框,如图1-4所示。大家输入用户名、公司名称以及E-mail地址即可。
5、单击“Next”,就会自动安装软件,如图1-5所示
6、安装完成后,弹出来安装完成对话框,如图1-6所示,并且出现几个选项,大家刚开始把这几个选项的对号全部去掉就可以了,先不用关注他有什么作用。
7、最后,点击“Finish”,Keil编程软件开发环境就这么装好了。
1.5 Keil基本概况介绍
首先,我们用Keil先打开一个现成的工程,来认识一下Keil软件,如图1-7所示。
第2章 点亮你的LED
这节课的标题是点亮LED,虽然任务很简单,但是需要大家了解的单片机基础知识的内容却很多,特别是对于初学者,刚开始要在头脑中建立一个单片机的概念,课程最后通过点亮一个LED小灯来增加初学者对单片机的兴趣和自信。
2.1 单片机的内部资源
在这里我所讲到的单片机内部资源,和传统单片机书籍中讲单片机内部结构不同,我这里讲到的内部资源,是指作为单片机用户,单片机提供给我们可使用的东西。总结起来,主要是三大资源:
Flash——程序存储空间,早期单片机是OTPROM。
RAM——数据存储空间。
SFR——特殊功能寄存器。
在早期的单片机中,主要是用OTPROM(One Time Programmable Read-Only Memory,即一次可编程只读存储器)来存储单片机的程序,程序只能写入一次,如果发现错了,没办法,只能换一片,重新写入了。随着技术的发展,Flash以其可重复擦写且容量大成本低的优点成为现在绝大多数单片机的程序存储器。对于单片机来说Flash最大的意义是断电后数据不丢失,这个概念类似于我们电脑的硬盘,我们保存了电影、文档、音乐等文件,把电源关掉后,下次重新开电脑,所有的文件都还照样存在。
RAM是单片机的数据存储空间,用来存储程序运行过程中产生的和需要的数据,跟电脑的内存是相似的概念,其实最典型的比喻是我们的计算器,我们用计算器计算个加减法,一些中间的数据都会保存在RAM里边,关电后数据丢失,所以我们每次打开计算器,都是从归零开始计算。但是它的优点,第一是读写速度非常快,第二是理论上是可无限次写入的,即寿命无限,不管程序怎么运行怎么读写它都不会坏。
第三个资源是SFR,特殊功能寄存器。这个概念大家可能刚开始理解不了,但是一定要记住。单片机有很多很多功能,每个功能都会对应一个或多个SFR,我们就是通过对SFR的读写来实现单片机的多种多样的功能的。
讲到这里,我们来了解一下51单片机。通常我们一说到51单片机,指的都是兼容Intel MCS-51体系架构的一系列单片机,而51是它的一个通俗的简称。全球有众多的半导体厂商推出了无数款这一系列的单片机,比如Atmel的AT89C52,NXPPhilips的P89V51,宏晶科技的STC89C52……具体型号千差万别,但他们的基本原理和操作都是一样的,程序开发环境也是一样的。这里我们要分清楚51这个统称和具体的单片机型号之间的关系。
单片机内部资源的三个主要部分我们清楚了,那么我们选择STC89C52这款单片机来进行学习。STC89C52是宏晶科技出品的一款51内核的单片机,具有标准的51体系结构,全部的51标准功能,程序下载方式简单,方便学习,我们就用它来学习单片机。它的资源情况:Flash程序空间是8K字节1K=1024,1字节= 8位,RAM数据空间是512字节,SFR我们后边会逐一提到并且应用。
2.2 单片机最小系统
为什么称之为单片机最小系统呢?单片机最小系统,也叫做单片机最小应用系统,是指用最少的原件组成单片机可以工作的系统。单片机最小系统的三要素就是电源、晶振、复位电路,如图2-1所示。
图2-1 单片机最小系统电路
这张最小系统的电路图节选自我们的KST-51开发板原理图,下面我们就照这张电路图来具体分析最小系统的三要素。
2.2.1 电源
这个很好理解,电子设备都需要供电,就连我们的家用电器(手电筒^_^)也不例外。目前主流单片机的电源分为5V和3.3V这两个标准,当然现在还有对电压要求更低的单片机系统,一般多用在一些特定场合,在学习中我们不做过多的关注。
我们所选用的STC89C52,它需要5V的供电系统,我们的开发板是使用USB口输出的5V直流直接供电的。从图2-1可以看到,供电电路在40脚和20脚的位置上,40脚接的是+5V,通常也称为VCC或VDD,代表的是电源正极,20脚接的是GND,代表的是电源的负极。+5V和GND之间还有个电容,作用我们下节课介绍。
这个地方我们还要普及一个看原理图的知识。电路原理图是为了表达这个电路的工作原理而存在的,很多器件在绘制的时候更多考虑的是方便原理分析,而不是表达各个器件实际位置。比如上边的单片机引脚图,引脚的位置我们是可以随意放的,但是每个引脚上有一个数字标号,这个数字标号代表的才是单片机真正的引脚位置。一般情况下,这种双列直插封装的芯片,左上角是1脚,逆时针旋转引脚号依次增加,一直到右上角是最大脚位,我们现在选用的单片机一共是40个引脚,因此右上角就是40(在表示芯片的方框的内部),如图2-2所示,大家要分清原理图引脚标号和实际引脚位置的区别。
图2-2 单片机封装图
2.2.2 晶振
晶振,又叫晶体振荡器,从这个名字我们就可以看出来,它注定一生都要不停振荡的。他起到的作用是为单片机系统提供基准时钟信号,类似于我们部队训练时喊口令的人,单片机内部所有的工作都是以这个时钟信号为步调基准来进行工作的。STC89C52单片机的18脚和19脚是晶振引脚,我们接了一个11.0592M的晶振(它每秒钟振荡11,059,200次),外加两个20pF的电容,电容的作用是帮助晶振起振,并维持振荡信号的稳定。
2.2.3 复位电路
在图2-1左侧是一个复位电路,接到了单片机的9脚RSTReset复位引脚上,这个复位电路如何起作用我们后边再讲,现在着重讲一下复位对单片机的作用。单片机复位一般是3种情况:上电复位、手动复位、程序自动复位。
假如我们的单片机程序有100行,当某一次运行到第50行的时候,突然停电了,这个时候单片机内部有的区域数据会丢失掉,有的区域数据可能还没丢失。那么下次打开设备的时候,我们希望单片机能正常运行,所以上电后,单片机要进行一个内部的初始化过程,这个过程就可以理解为上电复位,上电复位保证单片机每次都从一个固定的相同的状态开始工作。这个过程跟我们打开电脑电源开电脑的过程是一致的。
当我们的程序运行时,如果遭受到意外干扰而导致程序死机,或者程序跑飞的时候,我们就可以按下一个复位按键,让程序重新初始化重新运行,这个过程就叫做手动复位,最典型的就是我们电脑的重启按钮。
当程序死机或者跑飞的时候,我们的单片机往往有一套自动复位机制,比如看门狗,具体应用以后再了解。在这种情况下,如果程序长时间失去响应,单片机看门狗模块会自动复位重启单片机。还有一些情况是我们程序故意重启复位单片机。
电源、晶振、复位构成了单片机最小系统的三要素,也就是说,一个单片机具备了这三个条件,就可以运行我们下载的程序了,其他的比如LED小灯、数码管、液晶等设备都是属于单片机的外部设备,即外设。最终完成我们想要的功能就是通过对单片机编程来控制各种各样的外设实现的。
2.3 LED小灯
LEDlight-emitting diode,即发光二极管,俗称LED小灯,它的种类很多,参数也不尽相同,我们板子上用的是普通的贴片发光二极管。这种二极管通常的正向导通电压是1.8V到2.2V之间,工作电流一般在1mA~20mA之间。其中,当电流在1mA~5mA之间变化时,随着通过LED的电流越来越大,我们的肉眼会明显感觉到这个小灯越来越亮,而当电流从5mA~20mA之间变化时,我们看到的发光二极管的亮度变化就不是太明显了。当电流超过20mA时,LED就会有烧坏的危险了,电流越大,烧坏的也就越快。所以我们在使用过程中应该特别注意它在电流参数上的设计要求。
那么下面我们来看一下这个发光二极管在开发板上的设计应用。首先来看图2-3。
图2-3 USB接口电路
图2-3是我们开发板上的USB接口电路,通过USB线,电脑给我们的开发板供电和下载程序以及实现电脑和开发板之间的通信。从图上可以看出,USB座共有6个接口,其中2脚和3脚是数据通信引脚,1脚和4脚是电源引脚,1脚是VCC正电源,4脚是GND即地线。5脚和6脚是外壳,我们直接接到了GND上,大家可以观察一下开发板上的这个USB座的6个引脚。
我们现在主要来看1脚VCC和4脚GND。1脚通过F1(自恢复保险丝)接到右侧,在正常工作的情况下,保险丝可以直接看成导线,因此左右两边都是USB电源+5V,自恢复保险丝的作用是,当你后级电路哪个地方有发生短路的时候,保险丝会自动切断电路,保护开发板以及电脑的USB口,当电路正常后,保险丝会恢复畅通,正常工作。
右侧有2条支路,第一条是在+5V和GND接了一个470uF的电容,电容是隔离直流的,所以这条支路是没有电流的,电容的作用,我们下节课再介绍,这节课我们主要看第二条支路。我们把第二条支路摘取出来就是如图2-4这个样子。
图2-4 LED小灯电路(一)
发光二极管是二极管中的一种,因此和普通二极管一样,这个二极管也有阴极和阳极,习惯上也称之为负极和正极。原理图里的LED画成这样方便在电路上观察,方向必须接对了才会有电流通过让LED小灯发光。刚才提到了我们接入的VCC电压是5V,发光二极管自身压降大概是2V,那么在右边R34这个电阻上承受的电压就是3V。那么现在我们要求电流范围是1~20mA的话,就可以根据欧姆定律R=UI,把这个电阻的上限和下限值求出来。
U=3V,当电流是1mA的时候,电阻值是3K;当电流是20mA的时候,电阻值是150欧,也就是R34的取值范围是150~3K欧姆。这个电阻值大小的变化,直接可以限制整条通路的电流的大小,因此这个电阻我们通常称之为“限流电阻”。在图2-3中,我们用的电阻是1K,这条支路电流的大小,我想大家可以轻松计算出来了,而这个发光二极管在这里的作用,是作为电源指示灯的,使用USB线将开发板和电脑连起来,这个灯就会亮了。
同理,我们在板子后级开关控制的地方,又添加了一个LED10发光二极管,作用就是当我们打开开关时,这个二极管才会亮起,如图2-5所示。
图2-5 USB供电电路
大家注意,这里的开关虽然只有一个,但是是2路的,2路开关并联能更好的确保给后级提供更大的电流。电容C19和C10,都是隔离断开直流的,作用我们下节课介绍,这里大家可以忽略。
那么下面呢,我们把图2-4进行一下变化,把右侧的GND去掉,改成一个单片机的IO口,如图2-6所示。
图2-6 LED小灯电路(二)
图2-4由于电源从正极到负极有电压差,并且电路是导通的,所以就会有电流通过,LED小灯因为有了电流通过,所以就会直接发光。我们把右侧的原GND处接到单片机P0.0引脚上,那么如果我们单片机输出一个低电平,也就是跟GND一样的0V电压,就可以让LED小灯和图2-4一样发光了。
因为我们的单片机是可以编程控制的,我们可以让P0.0这个引脚输出一个高电平,就是跟VCC一样的5V电压,那么这个时候,左侧VCC电压和右侧的P0.0的电压是一致的,那就没有电压差,没有电压差就不会产生电流,没有电流LED小灯就不会亮,也就是会处于熄灭状态。下面,我们就用我们的编程软件来实现控制小灯的亮和灭。
2.4 程序代码编写
这是我们的第一个实验程序,因此请大家一定要耐心,我们先来了解一些51单片机特有的程序语法以及Keil软件的基本操作步骤。
2.4.1 特殊功能寄存器和位定义
我们主要是用C语言来对单片机编程,而有的单片机有那么几条很特殊的独有的编程语句,51单片机就有,先介绍2条。
第一条语句是:sfr P0 = 0x80;
sfr这个关键字,是51单片机特有的,他的作用是定义一个单片机特殊功能寄存器special function register。51单片机内部有很多个小模块,每个模块居住在拥有唯一房间号的房间内,同时每个模块都有8个控制开关。P0就是一个功能模块,就住在了0x80这个房间里,我们就是通过设置P0内部这个模块的8个开关,来让单片机的P0这8个IO口输出高电平或者低电平的。而51单片机内部有很多寄存器,如果我们想使用的话必须提前进行sfr声明。不过Keil软件已经把所有这些声明都预先写好并保存到一个专门的文件中去了,我们要用的话只要文件开头添加一行#include即可,这个在后边有用法详解。
第二条语句是:sbit LED = P0^0;
这个sbit,就是对刚才所说的SFR里边的8个开关其中的一个进行定义。经过上边第二条语句后,以后只要在程序里写LED,就代表了P0.0口(“^”这个符号在数字键6上边),注意这个P必须大写,也就是说我们给P0.0又取了一个更形象的名字叫做LED。
了解了这两个语句后,我们来大概看一下单片机的特殊功能寄存器。请注意,每个型号的单片机都会配有生产厂商所编写的数据手册Datasheet,所以我们来看一下STC89C52的数据手册,从21页到24页,全部是对特殊功能寄存器的介绍以及地址映射列表。我们在使用这个寄存器之前,必须对这个寄存器的地址进行说明。是不是花花绿绿的太多了,记不住啊,这个没关系的,不需要你记住,了解一下,后边大部分我会慢慢给大家解释,少部分需要用到的时候,自己过来查手册就可以了,做技术不是为了应付考试,你可以随时翻阅手册查找你需要的资料。
如图2-7,是截取的手册中第22页最下边的一个表格。
图2-7 IO口特殊功能寄存器
我们来看一下这个表,其中P4口STC89C52对标准51的扩展,我们先忽略它,只看前边的P0、P1、P2、P3这4个,每个P口本身又有8个控制端口。大家可以结合我们的开发板原理图或者图2-1来看,那么这样就确定了我们的单片机一共有32个IO口(IO,Input和Output,分别是输入和输出)。
其中P0口所在的地址是0x80,一共有从7到0这8个IO口控制位,后边有个Reset Value(复位值),这个很重要,是我们看寄存器必看的一个参数,8个控制位复位值全部都是1。这就是告诉我们,每当单片机上电复位的时候,所有的引脚的值默认是都是1,即高电平,我们在设计电路的时候也要充分的考虑这个问题。
那么上边那2条语句,我们写sfr的时候,必须要根据手册里的这个地址Add去写,写sbit的时候,就可以直接将一个字节其中某一位取出来。我们编程的时候,也有现成的写好寄存器地址的头文件,我们直接包含该头文件就可以了,不需要逐一去写了。
2.4.2 新建一个工程
对于单片机程序来说,每个功能程序,都必须要有一个配套的工程(Project),即使是点亮LED这样简单的功能程序也不例外,因此我们首先要新建一个工程,打开我们的Keil软件后,点击:Project--New uVision Project...然后会出现一个新建工程的界面,如图2-8所示。
图2-8 新建一个工程
因为现在讲到了第二章,所以我们在硬盘上建立了一个lesson2的目录,然后把LED这个工程的路径指定到这里,这样方便今后管理程序,不同的功能程序放到不同的文件夹下,并且给这个工程起一个名字叫做LED,软件会自动添加扩展名.uvproj。如图2-9所示。
图2-9 保存工程
我们直接点保存就可以了,工程会自动保存成LED.uvproj文件,下次要打开LED这个工程时,可以直接找到文件夹,双击这个.uvproj文件就可以直接打开了。
保存之后会弹出一个对话框,这个对话框让我们选择单片机型号。因为Keil软件是外国人开发的,所以我们国内的STC89C52并没有上榜,但是只要选择同类型号就可以了。因为51内核是由Intel公司创造的,所以这里我们直接选择Intel公司名下的8087C52来代替,这个选项的选择对于后边的编程没有任何的不良影响。如图2-10所示
图2-10 单片机型号选择
点击OK之后,会弹出一个对话框,如图2-11所示,每个工程都需要一段启动代码,如果点“否”编译器会自动处理这个问题,如果点“是”,这部分代码会提供给我们用户,我们就可以按需要自己去处理这部分代码,那这部分代码在我们初学51的这段时间内,一般是不需要去修改的,但是随着技术的提高和知识的扩展,我们就有可能会需要了解这块内容,因此这个地方我们选一下“是”,让这段代码出现,但是我们暂时不需要修改它,大家知道这么回事就可以了。
图2-11 启动代码选择
这样工程就建立好了,如图2-12所示,如果我们点击Target 1左边的加号,会出现我们刚才加入的初始化文件STARTUP.A51,这个我们先不管。
图2-12 工程文件
工程有了之后,我们要建立编写代码的文件,点击File--New,如图2-13,新建一个文件,也就是我们编写程序的平台。然后点File--Save或者直接点击那个Save的快捷键,可以保存文件,保存时我们把它命名为LED.c,这个地方必须加上.c,因为如果写汇编语言,这个地方的扩展名是.asm,头文件就是.h等等,我们编写的是C语言程序,这个地方必须自己添加文件的扩展名.c,如图2-14所示。
图2-13 新建文件
图2-14 保存文件
现在我们就可以在我们建立好的文件中输入我们的程序代码了,在编写之前还有个工作要做。我们每做一个功能程序,必须要新建一个工程,一个工程代表了单片机要实现的一个功能。但是一个工程,有时候我们可以把我们的程序分多个文件写,所以每写一个文件,我们都要添加到我们所建立的工程中去,鼠标右键点Source Group 1,点Add Files to Group ‘Source Group 1’...,如图2-15所示。
图2-15 添加文件(一)
在弹出的对话框中,单击LED.c选中它,然后点Add,或者直接双击LED.c都可以将文件加入到这个工程下,然后点Close,关闭添加。 这个时候大家会看到在Source Group 1下边又多了一个LED.c文件。
图2-16 添加文件(二)
2.4.3 编写点亮小灯的程序
忙活了半天,准备工作做了那么多,终于要编写我们的程序代码了。如果学过C语言的话,你应该很轻松的跟着我的编程自己写出来,如果没学过C语言也没关系,你先照着我的抄,我会在合适的位置写出来对C语言语法的解释,这样抄几次后再看看解释,就应该很明白了,抄的时候一定要认真,尤其标点符号不可以搞错。
#include 包含特殊功能寄存器定义的头文件
sbit LED = P0^0; 位地址声明,注意:sbit必须小写、P大写!
void main 任何一个C程序都必须有且仅有一个main函数
{ {}是成对存在的,在这里表示函数的起始和结束
LED = 0; 分号表示一条语句结束
}
先从程序语法上来分析一下。
1、main是主函数的函数名字,每一个C程序都必须有且仅有一个main函数。
2、void是函数的返回值类型,本程序没有返回值,用void表示。
3、{}在这里是函数开始和结束的标志,不可省略。
4、每条C语言语句以;结束的。
逻辑上来看,程序这样写就可以了,但是在实际单片机应用中,存在一个问题。比如我们的程序空间可以容纳100行代码,但是我们实际上的程序只用了50行代码,当运行完了50行,再继续运行时,第51行的程序不是我们想运行的程序,而是不确定的未知内容,一旦执行下去程序就会出错从而可能导致单片机自动复位,所以我们通常在程序中加入一个死循环,让程序停留在我们希望的这个状态下,不要乱运行,有以下两种写法可以参考:
参考程序一: 参考程序二:
#include #include
sbit LED = P0^0; sbit LED = P0^0;
void main void main
{ {
while1 LED = 0;
{ while1;
LED = 0; }
}
}
程序一的功能是程序在反复不断的无限次执行LED = 0;这条语句,而程序二的功能是执行一次,然后程序直接停留下来等待,相对程序一来说程序二更加简洁一些。针对于图2-6,我们这个程序能够把小灯点亮,但是这个程序却点不亮我们板子上的小灯,这是为什么呢?
这里大家就要培养一个意识了,我们做单片机编程,实际上算是硬件底层驱动程序开发,这种程序的开发,是离不开电路图的,必须根据我们的电路图来进行程序的编写。如果我们设计电路板的电路图和图2-6一样的话,我们那个程序可以成功点亮,但是如果不一样,就可能点不亮。
我们的开发板上,还有一个74HC138作为8个LED小灯的总开关,而P0.0仅仅是个分开关。如同我们家里总是有一个供电总闸,然后每个电灯又有一个专门的开关,我们刚才的程序仅仅打开了那个电灯的开关,但是没有打开那个总电闸,所以程序需要加上这部分代码。因为这节课要介绍的内容比较多,所以我们把74HC138的原理以及为什么要加额外的代码在下节课统一介绍,这节课我们直接加上这部分代码,大家知道有这么一回事就可以了。
#include 包含特殊功能寄存器定义的头文件
sbit LED = P0^0; 位地址声明,注意:sbit必须小写、P大写!
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main
{
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
LED = 0; 点亮小灯
while 1; 程序停止在这里
}
写了这么多啰嗦的语句,刚开始大家可能觉得很麻烦,为什么有的书上程序很简单就可以点亮小灯,我们这里却这么麻烦呢。大家要了解一点,就是我们做这个学习板,虽然仅仅提供给大家简单学习使用,但是我们也得按照实际产品的开发模式去设计,所以综合考虑因素很多,大家学到后边就会明白它的设计价值了,这里大家只要跟着我们去做就可以了。
程序编好了,我们要对我们的程序进行编译,生成我们需要的可以下载到单片机里的文件,在编译之前,我们先要勾选一个选项,Project--Options for Target ‘Target1’...,或者直接点图2-17中红框内的快捷图标:
图2-17 工程选项图标
在弹出的对话框中,点击Output选项页,勾选其中的“Create HEX File”复选框,然后点OK,如图2-18所示。
图2-18 创建HEX文件
设置好以后呢,点击“Project--rebuild all target files”,或者鼠标点击图2-19中红框内的快捷图标,就可以对程序进行编译了。
图2-19 编译程序
编译完成后,在我们的Keil下方的Output窗口会出现相应的提示,大家注意看图2-20,这个窗口告诉我们编译完成后的情况,data=9.0,指的是我们的程序使用了单片机内部的256字节RAM资源中的9个字节,code=29的意思是使用了8K代码Flash资源中的29个字节。当提示“0 Errors, 0 warnings”表示我们的程序没有错误和警告,就会出现“creating hex file from “LED”...,意思是从当前工程生成了一个HEX文件,我们要下载到单片机上的就是这个HEX文件。如果出现有错误和警告提示的话,就是Error和warning不是0,那么我们就要对程序进行检查,找出问题,解决好了再进行编译产生HEX才可以。
图2-20 编译输出信息
到此为止,程序就编译好了,下边我们就要把编译好的程序文件下载到单片机里了。
2.5 程序下载
首先,我们要把硬件连接好,把板子插到我们的电脑上,打开设备管理器查看所使用的是哪个COM口,如图2-21所示,找到“USB-SERIAL CH340COM5”这一项,这里最后的数字就是开发板目前所使用的COM端口号。
图2-21 查看COM口
然后STC系列单片的下载软件——STC-ISP,如图2-22所示。
图2-22 程序下载设置
下载软件列出了5个步骤:第一步,选择单片机型号,我们现在用的单片机型号是STC89C52RC,这个一定不能选错了;第二步,点击“打开程序文件”,找到我们刚才建立工程的那个lesson2文件夹,找到LED.hex这个文件,点击打开;第三步,选择刚才查到的COM口,波特率使用默认的就行;第四步,这里的所有选项都使用默认设置,不要随便更改,有的选项改错了以后可能会产生麻烦。第五步,因为STC单片机要冷启动下载,就是先点下载,然后再给单片机上电,所以我们先关闭板子上的电源开关,然后点击“Download下载”按钮,等待软件提示你请上电后,如图2-23所示,然后再按下板子的电源开关,就可以将程序下载到单片机里边了。当软件显示“已加密”就表示程序下载成功了,如图2-24所示。
图2-23 程序下载过程
图2-24 程序下载完毕
程序下载完毕后,就会自动运行,大家可以在板子上看到那一排LED中最右侧的小灯已经发光了。那现在如果我们把LED = 0改成LED = 1,再重新编译程序下载进去新的HEX文件,灯就会熄灭。至此,点亮一个LED的实验已经完成,终于迈出了第一步,是不是还挺好玩的呢。
2.6 作业
1、了解普通发光二级管的参数,掌握限流电阻的计算方法。
2、理解单片机最小系统,单片机外围电路,Flash,RAM和SFR这些概念。
3、了解Keil的基本用法和单片机编程流程,能够独立完成编程下载等基本操作。
|
|