在 C 语言中,变量的地址往往都是编译系统自动分配的,对我们用户来说,我们是不知道某个变量的具体地址的。所以我们定义一个指针变量 p,把普通变量 a 的地址直接送给指针变量 p 就是 p = &a;这样的写法。对于指针变量 p 的定义和初始化,一般有两种方式,这两种方式,初学者很容易混淆,因此这个地方没别的方法,就是死记硬背,记住即可。
要研究指针,我们得先来深入理解内存地址这个概念。打个比方:整个内存就相当于一个拥有很多房间的大楼,每个房间都有房间号,比如从101、102、103一直到 NNN,我们可以说这些房间号就是房间的地址。相对应的内存中的每个单元也都有自己的编号,比如从 0x00、0x01、0x02 一直到 0xNN,我们同样可以说这些编号就是内存单元的地址。
我们在上 C 语言课的时候,学到指针,每一位教 C 语言的老师都会告诉我们一句:指针是 C 语言的灵魂。由此可见,指针是否学会是判断一个人是否真正学会 C 语言的重要指标之一,但是很多同学只知道其重要性,却没学会其灵活性。
我们学习串口通信主要是要实现单片机和电脑之间的信息交互,可以用电脑控制单片机的一些信息,可以把单片机的一些信息状况发给电脑上的软件。下面我们就做一个简单的例程,实现单片机串口调试助手发送的数据,在我们开发板上的数码管上显示出来。#include <reg52.h>sbit ADDR3 = P1^3;sbit ENLED = P1^4;
通信的三种基本类型常用的通信从传输方向上可以分为单工通信、半双工通信、全双工通信三类。单工通信就是指只允许一方向另外一方传送信息,而另一方不能回传信息。比如电视遥控器、收音机广播等,都是单工通信技术。半双工通信是指数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一方,比如我们的对讲机就是典型的半双工。
为了让大家充分理解 UART 串口通信的原理,我们先把 P3.0 和 P3.1 当做 IO 口来进行模拟实际串口通信的过程,原理搞懂后,我们再使用寄存器配置实现串口通信过程。对于 UART 串口波特率,常用的值是300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200等速率。
随着技术的发展,工业上还有 RS232 串口通信的大量使用,但是商业技术的应用上,已经慢慢的使用 USB 转 UART 技术取代了 RS232 串口,绝大多数笔记本电脑已经没有串口这个东西了,那我们要实现单片机和电脑之间的通信该怎么办呢?
在我们的台式电脑上,一般都会有一个9针的串行接口,这个串行接口叫做 RS232 接口,它和 UART 通信有关联,但是由于现在笔记本电脑都不带这种9针串口了,所以和单片机通信越来越趋向于使用 USB 虚拟的串口,因此这一节的内容作为了解内容,大家知道有这么回事就行了。
通信按照基本类型可以分为并行通信和串行通信。并行通信时数据的各个位同时传送,可以实现字节为单位通信,但是通信线多占用资源多,成本高。比如我们前边用到的 P0 = 0xFE;一次给 P0 的8个 IO 口分别赋值,同时进行信号输出,类似于有8个车道同时可以过去8辆车一样,这种形式就是并行的,我们习惯上还称 P0、P1、P2 和 P3 为51单片机的4组并行总线。
通信,按照传统的理解就是信息的传输与交换。对于单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。没有通信,单片机所实现的功能仅仅局限于单片机本身,就无法通过其它设备获得有用信息,也无法将自己产生的信息告诉其它设备。
在单片机系统中应用按键的时候,如果只需要按下一次按键加1或减1,那用第8章学到的知识就可以完成了,但如果想连续加很多数字的时候,要一次次按下这个按键确实有点不方便,这时我们会希望一直按住按键,数字就自动持续增加或减小,这就是所谓的长短按键应用。
前边介绍单片机资源的时候,我们提到过 STC89C52 共有512字节的 RAM,是用来保存数据的,比如我们定义的变量都是直接存在 RAM 里边的。但是单片机的这512字节的 RAM 在地位上并不都是平等的,而是分块的,块与块之间在物理结构和用法上都是有区别的,因此我们在使用的时候,也要注意一些问题。51单片机的 RAM 分为两个部分,一块是片内 RAM,一块是片外 RAM。
同学们在学习技术的时候,一定要多动脑筋,遇到问题后,三思而后问。有些时候你考虑的和真理就差一点点了,没有坚持下去,别人告诉你后才恍然大悟。这样得到的结论,可以让你学到知识,但是却培养不了你的逻辑思维能力。不是不能问,而是要在认真思考的基础上再发问。有同学有疑问,板子上只有8个流水灯,那如果我要做很多个流水灯一起花样显示怎么办呢?
PWM 在单片机中的应用是非常广泛的,它的基本原理很简单,但往往应用于不同场合上意义也不完全一样,这里我先把基本概念和基本原理给大家介绍一下,后边遇到用的时候起码知道是个什么东西。
不同数据类型间的相互转换在 C 语言中,不同数据类型之间是可以混合运算的。当表达式中的数据类型不一致时,首先转换为同一种类型,然后再进行计算。C 语言有两种方法实现类型转换,一是自动类型转换,另外一种是强制类型转换。这块内容是比较繁杂的,因此我们根据常用的编程应用来讲部分相关内容。
本章内容主要通过一些实践例程,来提高大家对编程的熟练度,并且帮助大家进行一些算法和技巧上的积累。虽然是练习为主,但也涉及到了不少软硬件知识的学习,比如数据类型转换、中断响应延迟、位操作技巧、以及 PWM 的知识等。同学们在学习本章内容的时候,还是那句话,一定要能够达到不看教材,能够独立把程序做出来的效果,那样才能基本上掌握相关知识点和内容。
蜂鸣器从结构区分分为压电式蜂鸣器和电磁式蜂鸣器。压电式为压电陶瓷片发音,电流比较小一些,电磁式蜂鸣器为线圈通电震动发音,体积比较小。按照驱动方式分为有源蜂鸣器和无源蜂鸣器。这里的有源和无源不是指电源,而是振荡源。有源蜂鸣器内部带了振荡源,如图9-8所示中,给了 BUZZ 引脚一个低电平,蜂鸣器就会直接响。
上面我们虽然完成了用中断控制电机转动的程序,但实际上这个程序还是没多少实用价值的,我们不能每次想让它转动的时候都上下电啊,是吧。还有就是它不但能正转还得能反转啊,也就是说不但能转过去,还得能转回来呀。好吧,我们就来做一个实例程序吧,结合第8章的按键程序,我们设计这样一个功能程序:按数字键1~9,控制电机转过1~9圈;
解决了精度问题,让我们再次回到我们的电机控制程序上吧。上面给出的两个例程都不是实用的程序,为什么?因为程序中存在大段的延时,而在延时的时候是什么其它的事都干不了的,想想第二个程序,整整200秒什么别的事都干不了,这在实际的控制系统中是绝对不允许的。那么怎么改造一下呢?
转是转了,但是不是感觉有点不太对劲呢?太慢了?别急,咱们继续。根据本章开头讲解的原理,八拍模式时,步进电机转过一圈是需要64个节拍,而我们程序中是每个节拍持续 2 ms,那么转一圈就应该是 128 ms,即1秒钟转7圈多,可怎么看上去它好像是7秒多才转了一圈呢?那么,是时候来了解“永磁式减速步进电机”中这个“减速”的概念了。
关注时代Java