51单片机程序开发入门知识

2016-05-16来源: eefocus关键字:51单片机  程序开发  入门知识
      51单片机在我的理解上来说,就是遵循51指令集工作的芯片。他就像一台超微型的电脑,里面有内存、硬盘、CPU等基本配备。

      而他所谓的CPU使用的就是51指令集,他的硬盘就是内置的Flash,他的内存也是内置的RAM和扩展RAM。不过这些基本配备是小了一点而已。

      在网上,我们常看到一些介绍什么AT89C51或AT89C52等51的单片机的范例,对于一些初学者来说可能就会认为只有AT89C51或AT89C52才是51单片机,当你给他个STC89S52他都不敢用,认为可能不对(我刚开始学的时候就碰到这种情况,)。其实不是这样的,只要芯片内部使用的是51指令集,那么它就可以认为是51单片机,就可以用51单片机的开发方式进行开发代码。他们之间的区别就是开发芯片的厂商不同,CPU支持频率不同,Flash大小、RAM大小、串口接口、中断数量、烧写程序的接口等等稍微有些不同而已。这么看吧,就算同一个型号的51单片机,比如 STC89C51和STC89S52的基本区别就是Flash大小,89C51的Flash大小是4kB,而89S52是8kB,而STC12C5A08S2和STC89S52的区别:他们的Flash大小都是8KB,但12C5A08S2有两个串口处理,而89S52只有一个串口处理,12C5A08S2有1kB的扩展RAM,而89S52却没有,只有128个子节的RAM,而这128个字节的RAM12C5A08S2也有,但定时器中断12C5A08S2只有2个,而89S52却有3个。他们之间的区别就是如此,AT的和STC的也就是类似的不同而已,AT的是使用SPI接口烧写程序,而STC的是用串口接口烧写程序,其他的大致就参考芯片的PDF文件,里面有各种型号的各种参数说明,根据你的需求选购不同的芯片型号,就像选电脑一样,根据配置单选择你适合的单片机。当然,功能越强,价格也就越贵,就比如CC2430,他是带无线串口接口的一块51单片机,但价格就不是和普通51单片机一个档次的东西了。当然在51单片机以外,还有很多其他标准的单片机,比如AT的AVR单片机,型号有AT Mega 16、Mega 32等等等等,有16位的,还有32位的(我们的51通常是8 位的)。还有DSP、ARM等等等等。他们都有自己的指令集,自己的标准,当然,速度和各方面的参数都有着很多不同的地方,每一块的水都很深。就比如说ARM,现在很多的掌上电脑、MP4、MP5、手机都是用它弄的,ARM9还可以直接上操作系统。至于这一块,属于嵌入式开发了,我也就不多说了,还是说回51单片机。

      在51单片机开发上,要涉及到程序的开发。简单的理解就是你写一个程序来控制单片机的管脚供电出去或是不供电出去,或是读取某个管脚是否有电或没电的事情,这些管脚我们管他叫I/O口(即:输入/输出口),根据不同的应用设计出不同的外围电路就可以控制或采集外围的很多东西了(当然也可以进行通讯)。如果与PC通讯,还可将采集到的信息反馈给PC或按照PC发过来的信息执行指定的任务。

      下面我们来看一下如何开始51单片机的程序开发:

      通常的单片机程序开发方式有两种:1、使用汇编语言进行开发   2、使用C语言进行开发

      本人对汇编不熟,也就不多说了,说说C语言吧。先去下载个 Keil 8 回来,安装到你的电脑。这就是一个51单片机程序开发工具。

      然后启动 Keil,注册完成后,开始写第一个项目

      先在“工程”菜单选择“新建工程”,这时会弹出一个窗口,让你选择你的工程保存的位置

51单片机程序开发入门知识

然后你可以按照你的需求定义你要保存的工程名称,然后点击保存,跟着会提示你选择单片机的型号

51单片机程序开发入门知识

我们选择Atmel 的89C52就可以了,然后系统还会提示你,选择否就可以了。新建完工程后如下图:

51单片机程序开发入门知识

这时我们可以看到工程中什么文件都没有,那么下一步就是添加基本的文件了,我们点击“文件”菜单的“新建”项

51单片机程序开发入门知识

然后再点击“保存”保存新建的文件为你的主程序

51单片机程序开发入门知识

我这里保存的是Main.C,但这时在左边的工程文件树中还是找不到Main.c这个文件的,所以必须将这个文件插入工程树中。

双击 “Source Group 1”的目录图标,会弹出插入文件的窗口,然后选择你的文件,点击"Add"按钮

 

这时你可以看到下面的工程树中已经添加了你的文件,因为可以连续添加文件,所以必须手工关闭该窗口,我们点击“Close”按钮

 

这时我们看到工程中已经有刚才新建的 Main.c 文件了,然后我们稍微设置一下环境,不然编译不出目标文件。

我们对着“Target 1”点击鼠标右键,选择第一项“Options for Target 'Target 1'”

 

然后回弹出设置窗口

 

我们将选择卡选到“输出”

 

我们把“创建 HEX 文件”选项选择起来

 

然后点击确定按钮,回到了主界面,这样我们的前期步骤就作完了

现在我们开始说说程序部分,在下位机的开发当中,我们使用的是C语言(不是C++,没有类的概念),我们可用的资源也很少,除了基本的C语言语句以外,还可以使用的东西并不多,全部可用的东西全在Keil安装目录的 /C51/INC 里。

 

我这里面多了一个 STC12C5A60S2.H 文件,这时STC官网上提供的管脚和寄存器地址定义文件,通常我们只需要引用 REG52.H 就可以了。在C语言开发中,用 #Include 就是引用这些头文件,第一步,我们先引用MCU管脚定义文件REG52.H,然后再写上基本的程序入口函数Main,因为单片机只跑这么一个程序,所以主程序中不能让他执行完,必须进入死循环,否则,如果执行完了程序他就不会再工作了。

 

 

好了这样就完成了一个基本的单片机程序。但是如何控制单片机的IO口呢?我们先来看一下芯片说明里的管脚定义图:

 

这是STC DIP40 封装的管脚定义图,我们可以看到一些比较奇怪的说明,什么P0.0-P0.7呀、P1.0-P1.7呀的,这些就是IO端口

通常有4组IO口,P0、P1、P2、P3口,每组IO口有8个管脚,分别代表8个二进制位,而每组IO口除了作基本的输入输出外都有可能有他特殊的用法,这就根据不同型号的单片机而定了。就比如STC的这款单片机,P0口除了可以做基本的输入输出,还可以做A/D转换用,所以他的P0口后面还标有 AD0-AD7 的字样,但这些是后面的应用了,我们先谈谈如何控制或读取这些IO口。

在单片机种,这些IO口的管脚都是由厂家指定的系统功能寄存器控制的,只要知道地址,读取到指定寄存器地址的值就可以得到相对的IO口状态,同理,设置相应的寄存器值,也会改变IO口的状态。因为我们是用C语言,没必要直接用地址,我们可以将如0x80 这种地址以方便记忆的变量来表示,所以,我们看一下 REG52.H 就会发现

sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;

P0口的地址是 0x80 这个位置,P1口的地址是0x90。我们只需要在程序里用P0 = 255,或 P0=0  就可以改变 P0 口的8个管脚的状态是有电或是没电出去。

但是,如果想单独控制一个针脚的状态怎么做呢?有些朋友可能会想到用二进制位运算就可以了,比如非呀、与亚、或呀、异或呀什么的。

对,这是个方法,但不是很灵活,在这里,还可以进行寻址定义管脚。比如我们只想控制 P0.5 口的状态,那么用二进制计算的方法就有点麻烦了,我们可以这样做

sbit LED1 = P0^5;     //在这里 ^ 并不是异或运算符,只是特定的寻址符号

这时,程序里如果这样操作

LED1 = 1;

那么P0.5口将处于供电出去的状态

当然,这样操作将会取得P0.5口的当前状态

bit LEDState;

LEDState = LED1;

 

关键字:51单片机  程序开发  入门知识

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/article_2016051626375.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机PC数据传输 温度 距离 监控系统设计
下一篇:51单片机使用定时器进行数码管动态扫描程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F1系列单片机USB外设相关寄存器的定义

Keil MDK网站上下载的Keil.STM32F1xx_DFP.2.2.0.pack包中的stm32f10x.h头文件里面没有USB_TypeDef的定义,只有寄存器位的定义,是不完整的头文件。没有USB的数据结构就会给访问USB寄存器带来一定的困难。虽然可以参照STM32参考手册中的USB register map自己编写出USB_TypeDef结构体,但是这样比较麻烦。不过,STM32CubeMX工具生成的STM32F103工程中的头文件stm32f103xe.h中就有完整的USB数据结构,该头文件的版本是V4.2.0,日期为31-March-2017,作者仍然是Keil里面的MCD Application Team,这比Ke
发表于 2019-07-19

STM32开发笔记38: 单片机内部Flash的读写

单片机型号:STM32F070F6P6本文介绍应用C语言进行单片机内部Flash的读写技巧,将从查看文档开始,到最终完成完整的程序。单片机型号:STM32F070F6P6步骤如下:1、查看文档《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM®-based 32-bit MCUs》确认其Flash的内部结构。2、查看文档确认STM32F070F6P6内部存储器地址分配。从下表中得到的主要信息是Main Flash memory的起始地址是0x08000000,长度是32KB,到0x08017FFF结束(结束值可不关心)。3、继续查看Main Flash memory的内部结构
发表于 2019-07-16
STM32开发笔记38: 单片机内部Flash的读写

模拟量数据的采集过程解析

二进制的000000000000代表输入模拟量0V,而111111111111代表最大值VREF。下面以上图C8051单片机为例子,如原理图所示,该单片机工作电源为3.3V,参考电压为2.048V,所以模拟量的输入范围为0~2.048V。若所需采集的电压范围大于参考电压值时,可以使用电阻分压进行降压或者使用运放进行缩小等。该单片机ADC为12位的。也就是说输入电压为0时,单片机转换后的数字量结果为000000000000(二进制),当输入电压为2.048V时,单片机转换后的数字量结果为111111111111(二进制),十进制为4095。也就是说,输入电压的值V=2.048×ADC采集到的数字量÷4095。比如我们要采集一个0~10V
发表于 2019-07-13
模拟量数据的采集过程解析

单片机入门学习八 STM32单片机学习五 时钟系统

单片机学习除了了解该篇 单片机入门学习五 STM32单片机学习二 跑马灯程序衍生出的stm32编程基础 中的基础外,我们还需要有时钟的概念,本篇将记录 stm32的时钟系统。1、STM32时钟介绍 下面这幅图时stm32的时钟系统框图 1)蓝底框表示 时钟源,即: ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。(WDG看门狗 使用该时钟源) ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。(RTC
发表于 2019-07-12
单片机入门学习八 STM32单片机学习五 时钟系统

单片机入门学习十三 STM32单片机学习十 通用定时器

本篇重点记录的是STM32F1的通用定时器。 STM32F103ZE有8个定时器,其中2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5),2个基本定时器(TIM6、TIM7)。下表是对这8个定时器的详细描述。定时器种类 位数 计数器模式 产生DMA请求 捕获/比较通道 互补输出 特殊应用场景高级定时器(TIM1,TIM8) 16 向上、向下、向上/下 可以 4 有 带死区控制盒紧急刹车,可应用于PWM电机控制通用定时器(TIM2~TIM5) 16 向上、向下、向上/下 可以 4 无 通用。定时计数,PWM输出,输入捕获,输出比较基本定时器(TIM6,TIM7) 16 向上、向下
发表于 2019-07-12
单片机入门学习十三 STM32单片机学习十 通用定时器

51单片机与蓝牙模块连接

不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。此次学习用到模块是HC-06蓝牙模块,如下图:该模块某宝有售,价格约为20RMB。某宝上的HC-06有两种,分别是带引脚和不带引脚的,建议新手购买带引脚的。我从试验开始到成功,一共使用了四块蓝牙模块。第一次买的是带引脚的,但是模块本身是坏的;第二次买的是不带引脚的,但是由于自身的焊功有限,导致模块损坏,无法使用;第三次是朋友送的蓝牙4.0,由于某些原因无法使用,在此也特别感谢朋友送我蓝牙;第四次购买,就是上图所示的蓝牙,才最终完成了试验。总结
发表于 2019-07-11
51单片机与蓝牙模块连接

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved