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,注册完成后,开始写第一个项目

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

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

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

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

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

我这里保存的是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;

最后我们来写一个基本的LED闪烁的范例结束这次的讨论

最后点击编译按钮后的效果

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本目录下提供的是《手把手教你学51单片机(C语言版)》教材中所有例程与作业习题的源代码。 请将整个目录复制到电脑硬盘上使用,如直接在光盘路径下打开工程可能会导致软件报错。 运行目录下的Clean.bat可以清理程序编译过程中产生的中间文件和临时文件。 lesson2 (第2章): 点亮一个LED示例,所在章节2.4 lesson3 (第3章): LED闪烁示例,所在章节3.5 lesson4 (第4章): 4_1:用P0口控制LED的示例,所在章节4.8 4_2:用P0口控制实现流水灯效果,所在章节4.8 4_t4:作业题4,逐次右移的流水灯效果,所在章节4.9 4_t5:作业题5,左右往复移动的流水灯效果,所在章节4.9 lesson5 (第5章): 5_1:基于定时器查询模式的LED闪烁,所在章节5.2.3 5_2:静态点亮数码管的某几段,所在章节5.3.2 5_3:数码管静态显示一位字符,所在章节5.3.3 5_t3:作业题3,定时器查询模式实现左右移动的流水灯,所在章节5.4 5_t5:作业题5,变更lesson5_3的正计数为倒计数,所在章节5.4 lesson6 (第6章): 6_1:数码管动态显示原理示例(if...else if...语句示例),所在章节6.4 6_2:数码管动态显示原理示例(switch...case...语句示例),所在章节6.4 6_3:基于中断带消隐的数码管动态显示示例,所在章节6.5 6_t4:作业题4,在lesson6_3多位数字显示的基础上不显示高位的0,所在章节6.6 6_t5:作业题5,变更lesson6_3的正计数为倒计数,所在章节6.6 lesson7 (第7章): 7_1:基于数码管计时程序的静态变量演示,所在章节7.2 7_2:点亮LED点阵上的一个点,所在章节7.3 7_3:点亮LED点阵上的一行,所在章节7.3 7_4:点亮LED点阵上的全部点,所在章节7.3 7_5:LED点阵显示静态图形,所在章节7.4 7_6:LED点阵显示纵向移动的动画,所在章节7.5.1 7_6_h:LED点阵显示横向移动的动画(掉转板子方向的取巧方式),所在章节7.5.2 7_7:LED点阵显示横向移动的动画,所在章节7.5.2 7_t3:作业题3,lesson7_6的向上移动改为向下移动,所在章节7.6 7_t4:作业题4,lesson7_7的向左移动改为向右移动,所在章节7.6 7_t5:作业题5,基于LED点阵的9~0倒计数,所在章节7.6 7_t6:作业题6,独立LED、数码管、点阵LED同时全亮,所在章节7.6 lesson8 (第8章): 8_1:基于数码管计时程序的函数调用演示,所在章节8.2 8_2:按键基本原理演示例程,所在章节8.4.3 8_3:独立按键扫描原理演示例程,所在章节8.4.3 8_4:独立按键消抖原理演示例程,所在章节8.4.4 8_5:独立按键扫描并消抖的演示例程,所在章节8.4.4 8_6:矩阵按键扫描并消抖的演示例程,所在章节8.4.5 8_7:基于矩阵按键和数码管实现的简易加法计算器,所在章节8.5 8_t4:作业题4,变更lesson8_5的递增计数为递减计数,所在章节8.6 8_t5:作业题5,在lesson8_7基础上实现简易加减计算器,所在章节8.6 lesson9 (第9章): 9_1:步进电机驱动的基础示例,所在章节9.3.3 9_2:步进电机转动任意角度的示例,所在章节9.3.4 9_3:实用的步进电机驱动示例,所在章节9.3.5 9_4:按键控制步进电机转动的示例,所在章节9.3.6 9_5:蜂鸣器驱动的基础示例,所在章节9.4 9_6:蜂鸣器演奏简单乐谱——“两只老虎”,所在章节9.4 lesson10 (第10章): 10_1:基于数码管显示的数字秒表,所在章节10.1 10_2:基于PWM方式控制LED的亮度,所在章节10.2 10_3:基于PWM方式控制LED实现呼吸灯效果,所在章节10.2 10_4:交通信号灯示例,所在章节10.3 10_5:长短按键/连续按键功能实现示例,所在章节10.5 10_t3:作业题3,数码管计时与流水灯同时运行的示例,所在章节10.6 lesson11 (第11章): 11_1:普通IO口模拟实现串口通信的示例,所在章节11.4 11_2:单片机硬件UART查询方式实现串口通信的示例,所在章节11.5.3 11_3:单片机硬件UART中断方式实现串口通信的示例,所在章节11.5.3 11_4:UART串口通信及控制数码管显示的示例,所在章节11.6 11_t5:作业题5,UART串口控制流水灯流动和停止,所在章节11.7 11_t6:作业题6,UART串口控制蜂鸣器的开关,所在章节11.7 lesson12 (第12章): 12_1:指针作为函数参数的示例,所在章节12.1 12_2:指向变量的指针与变量关系的示例,所在章节12.2 12_3:指针、字符串、字符数组、ASCII码演示示例,所在章节12.3 12_4:1602液晶基本操作演示示例,所在章节12.4 lesson13 (第13章): 13_1:1602液晶显示两行字符串,并实现整屏的重复左移,所在章节13.2 13_2:多c文件示例,1602液晶显示两行字符串,并实现整屏的重复左移,所在章节13.3 13_3:整型数为操作数的简易+-*/计算器,所在章节13.4 13_4:基于帧模式的实用串口程序示例,所在章节13.5 13_t2:作业题2,1602液晶显示两行字符串,并实现整屏的重复右移,所在章节13.6 lesson14 (第14章): 14_1:寻址I2C总线上存在的和不存在的地址,将应答状态显示到液晶上,所在章节14.2 14_2:用单字节读写模式访问EEPROM,每次+1后写回,所在章节14.3.1 14_3:用多字节读写模式访问EEPROM,依次+1,+2,+3...后写回,所在章节14.3.2 14_4:用连续读与分页写模式访问EEPROM,依次+1,+2,+3...后写回,所在章节14.3.3 14_5:读取EEPROM中的数据显示到液晶,并可通过UART修改EEPROM中的数据,所在章节14.4 14_t3:作业题3,以lesson10_4为基础实现可通过UART设定时间的交通灯示例,所在章节14.5 14_t4:作业题4,基于液晶、按键、EEPROM的密码锁示例,所在章节14.5 lesson15 (第15章): 15_1:用单次读写模式访问DS1302,并将日期时间显示在液晶上,所在章节15.3.4 15_2:用突发读写模式访问DS1302,并将日期时间显示在液晶上,所在章节15.3.5 15_3:DS1302实现简易电子钟,通过按键校时,所在章节15.5 lesson16 (第16章): 16_1:接收NEC协议的红外编码并将用户码和键码显示到数码管上,所在章节16.3 16_2:控制DS18B20测量温度并将温度值显示到液晶上,所在章节16.4 16_t2:作业题2,用遥控器控制步进电机正反转,所在章节16.5 16_t4:作业题4,带温度显示的电子钟,所在章节16.5 lesson17 (第17章): 17_1:将模拟输入通道0、1、3的电压值显示到液晶上,所在章节17.4 17_2:由按键控制DA输出可调电压值,所在章节17.6 17_3:由按键控制DA输出可变化的波形,所在章节17.7 17_t3:作业题3,可调频率的信号发生器,所在章节17.8 lesson18 (第18章): 18_1:RS485基本示例,接收任意数据帧并添加回车换行后送回,所在章节18.1 18_2:基于RS485的Modbus通信示例,支持寄存器读写操作,所在章节18.3 18_t3:作业题3,基于Modbus协议实现电子钟校时,所在章节18.4 lesson19 (第19章): 19_1:多功能电子钟例程,所在章节19.4
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值