第10章C51应用实训.ppt_第1页
第10章C51应用实训.ppt_第2页
第10章C51应用实训.ppt_第3页
第10章C51应用实训.ppt_第4页
第10章C51应用实训.ppt_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章C51应用培训 培训1初识C51培训2单色灯闪烁培训3走马灯培训4流水灯培训5外部中断培训6定时器培训7双芯灯实验培训8P1口输入输出实验培训9直流电机实验培训10步进马达实验培训11串口实验培训12单片机扩展实验培训13人机接口实验培训14A D D A实验 培训1初识C51拿到一块89C51的芯片 首先必须要知道怎样连线 1 电源 单片机使用的是5V电源 正极接40引脚 负极 地 接20引脚 2 振蒎电路 单片机是一种时序电路 必须提供脉冲信号 在单片机内部已集成了振荡器 使用晶体振荡器接18 19脚 买来晶振 电容按图10 1连上就可以了 3 复位引脚 按图1中画法连好 4 EA引脚 接正电源端 至此 单片机就接好了 通上电就开始工作了 第一个任务是要用单片机点亮一只发光二极管LED 显然 这个LED必须要和单片机的某个引脚相连 否则单片机就没法控制它了 那么和哪个引脚相连呢 单片机上除了刚才用掉的5个引脚 还有35个 我们将这个LED和1脚相连 见图10 1 其中R1是限流电阻 按照这个图的接法 当1脚是高电平时 LED不亮 只有1脚是低电平时 LED才发亮 因此我们要能够控制1引脚按要求变为高或低电平 就能控制灯亮与灭 图10 1单色灯电路 有了上面的基本知识之后让我们来开始我们的第一个C51程序吧 如何实现让一个单色灯点亮呢 如果用C语言来写 最好的就是对一个变量赋值0 程序如下 include reg51 h 1 voidmain 2 P1 0 x00 3 这个程序非常类似于的TurboC 但其中有很多的不同点 我们翻阅本教材4 1 怎么样 这个程序到现在我们是不是已经非常的清楚了 我们把程序录入到C51编译器后 使用单步运行的方式运行一下 看一下运行结果 8只单色灯全部点亮 好 这样我们就完成了我们的第一个培训了 培训2单色灯闪烁实验一 8只单色灯亮 然后8只单色灯灭 实验电路如图10 1所示 include reg51 h voidmain P1 0 x00 1 P1 0 xff 2 P1 0 xff 是什么呢 0 xff对应二进制的数值是11111111 到这里大家明白了吧 对前面说到了送1到对应的引脚是熄灭单色灯 所有这里送8个1 代表的就是熄灭8个单色灯 录入程序后我们通过单步运行程序 就可以看到当程序走过第 1 条语句后单色灯全亮 走过第二条语句后单色灯全灭了 但是到现在为止 我们为什么只是让程序单步的走呢 为什么不能让他自己走呢 可能有很多同学有这样那样的疑问 对的 我们现在就解决大家的这些疑问 如果按照我们上面的这段程序全速执行的话 只能看到灯灭了 因为单片机执行的速度实在是太快了 我们跟本分辨不出单色灯点亮呢 单色灯就已经被熄灭了 如何能让我们分辨出单色灯的亮和灭呢 解决的办法就是 延时 如何做延时呢 可以把延时编写成一个子函数 我们叫 延时子函数 延时子函数例子可以有很多种 我在这里把它归纳为2类 第1类 无参数传递的延时子程序形式1 voiddelay unsignedinti for i 0 i 10000 i 形式2 voiddelay unsignedinti 10000 while i 形式3 voiddelay unsignedinti j for i 0 i 100 i for j 0 j 200 j 第2类 有参数传递的延时子程序voiddelay unsignedchark unsignedinti j for i 0 i k i for j 0 j 200 j 上面的延时的函数名都叫delay 当然这个名称你可以随便去起名 第1类的形式1 2 3都是单层循环 具体的语法在C语言中大家都学过 在这里就不过多的重复了 循环的次数决定了你延时的时间长短 如果感觉延时时间太短 可以采用形式4的双重循环 或多循环均可 循环的种类很多 在这里也不过多的重复举例了 只举一些常用的形式 第2类更加的方便一些 可能随时改变k的传递值以达到不同的延时 注意 在这里我使用的变量定义为unsignedint代表的是无符号整型 其取值范围是0 65535 循环变量的值不要超过这个数值 否则就会出现死循环 就走不出延时子程序了 这也是大家经常犯的一个错误 例 下面就是一个错误的实例 voiddelay unsignedintk for k 0 k 70000 k 该程序错误的原因是K永远加不到70000 所以无法跳出死循环 好了 现在有了延时函数了 那么整个程序应该如何去修改呢 源程序如下 程序1 延时函数写在调用之前不需要声明 第一类延时 include reg51 h voiddelay 延时函数体 unsignedinti for i 0 i 10000 i voidmain P1 0 x00 delay 调用延时函数 P1 0 xff delay 第二类延时 include reg51 h voiddelay unsignedchark 延时函数体 unsignedinti j for i 0 i k i for j 0 j 200 j voidmain P1 0 x00 delay 100 调用延时函数 将100传递给延时函数的kP1 0 xff delay 200 调用延时函数 将200传递给延时函数的 两个延时的 时间不相同 程序2 延时函数写在调用之后 需要在前面声明 include reg51 h voiddelay 延时函数体在后面必须提前声明voidmain P1 0 x00 delay 调用延时函数 P1 0 xff delay voiddelay 延时函数体 unsignedinti for i 0 i 10000 i 将源程序录入到编译器后 全速运行 结果是我们看到单色灯闪了一下 就停下了 这好像还和我们看到的结果有一点点偏差 为什么呢 原因是我们这个程序只将单色灯亮一次灭一次就停下了 那么能否让单色灯一直闪烁呢 我们可将程序改成循环的 可以选择一个无限的循环体 例程如下 程序1 include reg51 h voiddelay 延时函数体 unsignedinti for i 0 i 10000 i voidmain for 这里并没有结束的条件 所以是一个无限的循环 P1 0 x00 delay 调用延时函数 P1 0 xff delay 程序2 include reg51 h voiddelay 延时函数体 unsignedinti for i 0 i 10000 i voidmain while 1 这里并没有结束的条件 所以是一个无限的循环 P1 0 x00 delay 调用延时函数 P1 0 xff delay 程序3 include reg51 h voiddelay 延时函数体 unsignedinti for i 0 i 10000 i voidmain do 这里并没有结束的条件 所以是一个无限的循环 P1 0 x00 delay 调用延时函数 P1 0 xff delay while 1 现在在全速运行程序 就可以看到8只发光二极管开始一闪一闪的了 好漂亮啊 是否感觉C51是不是非常的好用呢 思考题 修改延时子程序让灯的闪烁间隔变快 让灯先左四个亮 再右四个亮 间隔闪烁 思考一下 培训3走马灯本次课的培训内容我们选择走马灯实验 先说明一下什么是走马灯 走马灯指的是单色灯一只一只的亮 一只一只的灭 每次亮的灯只有一个 而且是按照一个方向顺序向前或向后走动 电路如图10 1所示 思考一下程序如何编写 首先看电路图中的8个单色灯 从上到下分别是L0 L7 我们首先应该点亮L0 然后熄灭L0 接着点亮L1 然后熄灭L1 以此类推 最后点亮L7 再熄灭L7 周而复使继续下去 前面的实验我们都是直接用一个P1口的 那么能不能对P1口的某一个引脚来操作呢 如果能的话 那么程序不是变的很简单了吗 对于P1口的某一个引脚我们可以用sbit来定义 具体的定义如下 1 sbit位变量名 位地址sbitP1 1 0 x91 这样是把位的绝对地址赋给位变量 同sfr一样sbit的位地址必须位于80H FFH之间 2 sbit位变量名 特殊功能寄存器名 位位置sbitP1 1 P1 1 先定义一个特殊功能寄存器名再指定位变量名所在的位置当可寻址位位于特殊功能寄存器中时可采用这种方法 3 sbit位变量名 字节地址 位位置sbitP1 1 0 x90 1 0 x90 1相当汇编中的P1 1 我们可以跟据第2种方法来分别定义P1口的8个引脚 具体定义如下 sbitP1 0 P1 0 定义L 0灯连接的引脚命名为变量P1 0 其值可以是0或1sbitP1 1 P1 1 定义L1灯连接的引脚命名为变量P1 1 其值可以是0或1sbitP1 2 P1 2 定义L2灯连接的引脚命名为变量P1 2 其值可以是0或1sbitP1 3 P1 3 定义L3灯连接的引脚命名为变量P1 3 其值可以是0或1sbitP1 4 P1 4 定义L4灯连接的引脚命名为变量P1 4 其值可以是0或1sbitP1 5 P1 5 定义L5灯连接的引脚命名为变量P1 5 其值可以是0或1sbitP1 6 P1 6 定义L6灯连接的引脚命名为变量P1 6 其值可以是0或1sbitP1 7 P1 7 定义L7灯连接的引脚命名为变量P1 7 其值可以是0或1 具体程序如下 include reg51 h sbitP1 0 P1 0 sbitP1 1 P1 1 sbitP1 2 P1 2 sbitP1 3 P1 3 sbitP1 4 P1 4 sbitP1 5 P1 5 sbitP1 6 P1 6 sbitP1 7 P1 7 voiddelay unsignedinti for i 0 i 10000 i voidmain for P1 0 0 点亮L0灯delay 延时一小段时间 让人的肉眼能够看清P1 0 1 熄灭L0灯P1 1 0 点亮L1灯delay 延时一小段时间 让人的肉眼能够看清P1 1 1 熄灭L1灯P1 2 0 点亮L2灯delay 延时一小段时间 让人的肉眼能够看清P1 2 1 熄灭L2灯P1 3 0 点亮L3灯delay 延时一小段时间 让人的肉眼能够看清P1 3 1 熄灭L3灯P1 4 0 点亮L4灯delay 延时一小段时间 让人的肉眼能够看清 P1 4 1 熄灭L4灯P1 5 0 点亮L5灯delay 延时一小段时间 让人的肉眼能够看清P1 5 1 熄灭L5灯P1 6 0 点亮L6灯delay 延时一小段时间 让人的肉眼能够看清P1 6 1 熄灭L6灯P1 7 0 点亮L7灯delay 延时一小段时间 让人的肉眼能够看清P1 7 1 熄灭L7灯 我们来看上面的程序 P1 x是不是感觉非常的不容易理解呢 那么我们可不可以用一些容易看懂并有助于理解的变量呢 这是我们以后在编程时应该注意的一个小技巧 那么我们可以将源程序作如下修改 见下程序 include reg51 h sbitL0 P1 0 sbitL1 P1 1 sbitL2 P1 2 sbitL3 P1 3 sbitL4 P1 4 sbitL5 P1 5 sbitL6 P1 6 sbitL7 P1 7 voiddelay unsignedinti for i 0 i 10000 i voidmain for L0 0 点亮L0灯delay 延时一小段时间 让人的肉眼能够看清L0 1 熄灭L0灯L1 0 点亮L1灯delay 延时一小段时间 让人的肉眼能够看清L1 1 熄灭L1灯L2 0 点亮L2灯delay 延时一小段时间 让人的肉眼能够看清L2 1 熄灭L2灯L3 0 点亮L3灯delay 延时一小段时间 让人的肉眼能够看清L3 1 熄灭L3灯L4 0 点亮L4灯delay 延时一小段时间 让人的肉眼能够看清 L4 1 熄灭L4灯L5 0 点亮L5灯delay 延时一小段时间 让人的肉眼能够看清L5 1 熄灭L5灯L6 0 点亮L6灯delay 延时一小段时间 让人的肉眼能够看清L6 1 熄灭L6灯L7 0 点亮L7灯delay 延时一小段时间 让人的肉眼能够看清L7 1 熄灭L7灯 但是上面的这个程序好像太长 能不能点亮第二个灯的同时我们将第1个灯熄灭呢 这样就可以使程序简化很多 思路如下 我们可以用二进制来看就清楚的很多了 如下二进制数11111110 十六进制数0 xfe 这样的一个二进制数说明L1灯亮 L2 L8灯是灭 那么L2灯亮 其余灯灭应该是怎样呢 答案是11111101 十六进制数0 xfd 呗 那么我们就可以将这些数据送入到P1口就可以点亮对应的小灯了 基于这样的思路 我们来编写一下程序 include reg51 h voiddelay unsignedinti for i 0 i 10000 i voidmain for P1 0 xfe 11111110 L0亮其余全灭delay P1 0 xfd 1111101 L0亮其余全灭delay P1 0 xfb 11111011 L0亮其余全灭delay P1 0 xf7 11110111 L0亮其余全灭delay P1 0 xef 11101111 L0亮其余全灭delay P1 0 xdf 11011111 L0亮其余全灭delay P1 0 xbf 10111111 L0亮其余全灭delay P1 0 x7f 01111111 L0亮其余全灭delay 这样看来程序是不是变得非常的简单了呢 但程序的可读性是不是很差啊 能不能把P1变一下样我们来定义一个容易理解的变量呢 当然可以了 我们可以用C语言中define的定义 具体格式如下 define变量预定义名功能 用预定义名来代替前面的变量如 defineP1led这样以后在程序中出现的led都代表P1口 将上面的程序修改如下 include reg51 h defineP1LEDvoiddelay unsignedinti for i 0 i 10000 i voidmain for LED 0 xfe 11111110 L0亮其余全灭delay LED 0 xfd 1111101 L0亮其余全灭delay LED 0 xfb 11111011 L0亮其余全灭delay LED 0 xf7 11110111 L0亮其余全灭delay LED 0 xef 11101111 L0亮其余全灭delay LED 0 xdf 11011111 L0亮其余全灭delay LED 0 xbf 10111111 L0亮其余全灭delay LED 0 x7f 01111111 L0亮其余全灭delay 现在我们还是感觉程序有些长 那么有没有更简单的方法来实现呢 我们来观察一下该程序灯亮的顺序 能够看出一个规律 如表10 1所示 我们看出灯亮的顺序正好符合移位的规则 而且是一个循环移位 现在需要解决的就是如何进行循环移位 那么C51编译器有没有提供循环移位呢 当然有了 移位函数在头文件INTRINS H中INTRINS H文件中的内容如下 externunsignedchar cror unsignedchar unsignedchar 无符号字符型变量循环右移N位 N 255externunsignedint iror unsignedint unsignedchar 无符号整型变量循环右移N位 N 255externunsignedlong lror unsignedlong unsignedchar 无符号长整型变量循环右移N位 N 255externunsignedchar crol unsignedchar unsignedchar 无符号字符型变量循环左移N位 N 255externunsignedint irol unsignedint unsignedchar 无符号整型变量循环左移N位 N 255externunsignedlong lrol unsignedlong unsignedchar 无符号长整型变量循环左移N位 N 255那么我们就可以将该头文件加入到程序中 将程序在修改如下 include reg51 h include intrins h defineP1LEDvoiddelay unsignedinti for i 0 i 10000 i voidmain unsignedchark 0 xfe for LED k 点亮一个单色灯delay 延时一段时间 让你看清楚k crol k 1 形成下一个要点亮的单色灯 到现在我们已经将程序简化了很多 这充分的体现了C语言的算法了吧 思考题 依照走马灯的方式 试编写让两个灯做走马灯 即下表的规律 表10 2灯亮规律 培训4流水灯本次课我们来做流水灯实验 流水灯的显示具体如下表10 2所示 可以看出第一次一个灯亮 然后第二次是两个灯亮 最后是全亮后再熄灭 然后反复重复 思考程序如何编写 最简单的方法是把每次灯的亮灭算出具体的数送入P1口 如第一次的数是0 xfe 二进制数11111110 第二次的数是0 xfc 二进制数11111100 等等 为了充分的体现C语言的算法 思考如下 灯亮的顺序正好符合逻辑移位的原则 在C语言中逻辑移位的符号是 代表右移 则程序可以写成如下 include reg51 h defineP1LEDvoiddelay unsignedinti for i 0 i 10000 i voidmain unsignedchari k for k 0 xfe 单色灯的初始值 for i 0 i 8 i 内层8次循环 构成流水灯的8次显示 LED k 点亮一个单色灯delay 延时一段时间 让你看清楚k k 1 思考题 1 将上面的延时子程序修改成带参数传递的延时子程序 2 试使用其他的编程方法实现流水灯实验 3 依照流水灯的方式 试编写让两个灯做流水 即下表的规律 培训5外部中断首先我们先复习一下外部中断的一些概念 1 外部中断请求源 即外中断0和1 经由外部引脚引入的 在单片机上有两个引脚 名称为INT0 INT1 也就是P3 2 P3 3这两个引脚 在内部的TCON中有四位是与外中断有关的 IT0 INT0触发方式控制位 可由软件进和置位和复位 IT0 0 INT0为低电平触发方式 IT0 1 INT0为负跳变触发方式 这两种方式的差异将在以后再谈 IE0 INT0中断请求标志位 当有外部的中断请求时 这位就会置1 这由硬件来完成 在CPU响应中断后 由硬件将IE0清0 IT1 IE1的用途和IT0 IE0相同 2 内部中断请求源TF0 定时器T0的溢出中断标记 当T0计数产生溢出时 由硬件置位TF0 当CPU响应中断后 再由硬件将TF0清0 TF1 与TF0类似 TI RI 串行口发送 接收中断 在串口中再讲解 3 中断允许寄存器IE在MCS 51中断系统中 中断的允许或禁止是由片内可进行位寻址的8位中断允许寄存器IE来控制的我们选用如图10 2电路 这里将P3 2接一个按键 图10 2带外部中断按键的电路图 P3 2是外部中断0入口引脚 那么如何声明外部中断0的函数呢 具体声明如下 外部中断0 void函数名interrupt0外部中断1 void函数名interrupt2 例 按一下按键 接外部中断的 则点亮全部的单色灯持续一小段时间 程序如下所示 include reg51 h defineP1LEDvoiddelay unsignedinti for i 0 i 10000 i voidint0 interrupt0 外部中断0程序 LED 0 x00 delay LED 0 xff voidmain EX0 1 IT0 1 EA 1 while 1 无限的停在该语句处等待中断 如何电路图修改为按键接在P3 3上 则说明是接在外部中断1上 程序则修改如下 include reg51 h defineP1LEDvoiddelay unsignedinti for i 0 i 10000 i voidint0 interrupt2 外部中断1程序 在此处有修改 LED 0 x00 delay LED 0 xff voidmain 以下三个变量EX0 IT0 EA是对中断的控制 具体可详见本书的前几章EX1 1 在此处有修改IT1 1 在此处有修改EA 1 while 1 无限的停在该语句处等待中断 这样就完成了外部中断1的程序了 到这里我们就完成了中断的程序 怎么样 中断的程序是不是很简单啊 思考题 将上面的程序改写成按一下中断按键 则进行一次走马灯 将上面的程序改写成按一下中断按键 则进行一次流水灯 培训6定时器在学单片机时我们第一个例子就是灯的闪烁 那是用延时程序做的 现在回想起来 这样做不很恰当 为什么呢 我们的主程序做了灯的闪烁 就不能再干其它的事了 所以我们可以用定时器来实现灯的闪烁的功能 并且定时器能够很准确的实现定时的功能 电路参照图10 1 我们来写一下程序 声明定时器中断具体的方法 定时中断0 void函数名interrupt1定时中断1 void函数名interrupt3声明方法是不是和外部中断差不多啊 只不过后面的序号不一样 例 使单色灯每隔50ms亮 再隔50ms灭 使用定时器1 include 定时程序 unsignedchark 0 x00 在函数体外为全局变量 voidint1 interrupt3 TR1 0 停止计数TL1 0 x00 定时50ms初值TH1 0 x4b TR1 1 开始计数LED k 将数值送P1口点亮或灭单色灯k k 翻转单色灯的值 这样亮就变灭 灭就变亮 形成下个值 主程序 voidmain TMOD 0 x10 置T1方式1TL1 0 x00 定时50ms时间常数TH1 0 x4b TR1 1 ET1 1 EA 1 开中断while 1 全速运行 我们能看到8个单色灯一闪一闪的 但好像非常的快 能不能让他慢点呢 当然可以 但我们的单片机选用的是11 0592MHz的 单片机定时器的最大定时时间也只有65ms左右 所以不能用直接改变定时器初值的方法 只能引用一个变量来控制时间 让定时器还是定时50ms 只不过让他N次进入定时器后再显示 这样就可能达到将时间延长的目的了 如下例 实现单色灯1S间隔闪烁 如下程序 请大家思考一下 include 在函数体外为全局变量 Times 20代表进入中断20次unsignedchark 0 x00 times 20 定时程序 voidint1 interrupt3 TR1 0 停止计数TL1 0 x00 定时50ms初值TH1 0 x4b TR1 1 开始计数times times if times 0 times 20 定时1秒时间到LED k 将数值送P1口点亮或灭单色灯k k 翻转单色灯的值 这样亮就变灭 灭就变亮 形成下个值 主程序 voidmain TMOD 0 x10 置T1方式1TL1 0 x00 定时50ms时间常数TH1 0 x4b TR1 1 ET1 1 EA 1 开中断while 1 思考题 将上面的两个程序改写成定时器0 试进行编写将前面的延时编写的走马灯实验改用定时器 要求灯每隔0 5s闪烁 将前面的延时编写的流水灯实验改用定时器 要求灯每隔0 5s闪烁 培训7双芯灯实验这次我们换一下双芯灯 其原理和单色灯基本相同 只不过双芯灯是由两个管芯组成 一个管芯是绿色 另一个管芯是红色 如果红色管芯通电则亮红灯 如果绿色管芯通电则亮绿灯 如果两个管绿同时通电则亮黄灯 两个管芯都不通电呢 当然是不亮了 双芯灯电路如图所示 R代表的是红色管芯 G代表的是绿色管芯 表10 5颜色表 图10 3双色灯结构图 双色灯模块 单片机P1口8个引脚P1 0 P1 3接DG1 DG4 P1 4 P1 7接DR1 DR4在这个电路中有个74LlS240是个反相器 所以我们要想使双芯灯的每个管芯通断电的话 就要以相反的数据送入 即每个引脚送0则通电 送1则断电 表10 6双芯灯数据表 注 该表中X为任意值 可以是0或1 其取值不同 对应亮的灯也不同 实验1 跟据这个表我们现在来编写一个实验 让红灯依次点亮 从表中将红灯的数据找出 分别为HL1对应EFH HL2对应DFH HL3对应BFH HL4对应7FH程序如下 include reg51 h defineP1LEDvoiddelay unsignedinti for i 0 i 10000 i voidmain unsignedchari k for LED 0 xef delay LED 0 xdf delay LED 0 xbf delay LED 0 x7f delay 思考题 1 请编写出绿灯顺次点亮的程序并上机运行2 请编写出黄灯顺次点亮的程序并上机运行3 四盏灯的顺序分别按照红 黄 绿 灭 依次点亮 并熄灭 实验2 用四盏灯模拟交通灯实验 给出以下程序 灯的闪烁时间用延时来控制 四盏灯的方向分别摆成如图所示 10 5双芯灯位置分布图 简单I O实验 交通灯控制 头文件引用 include 宏声明 defineTRLEDP1 延时子程序 voiddelay intn unsignedintk j for k 0 k n k for j 0 j 400 j 南北红灯 东西红灯 voidstatus0 TRLED 0 x0f delay 500 延时1秒 南北绿灯 东西红灯 voidstatus1 TRLED 0 x5a delay 2500 延时5秒 南北绿灯闪转黄灯 东西红灯 voidstatus2 chari for i 0 i 3 i 绿灯闪3次 TRLED 0 x5f delay 150 TRLED 0 x5a delay 150 TRLED 0 x0a 南北黄灯 东西红灯delay 500 延时1秒 南北红灯 东西绿灯 voidstatus3 TRLED 0 xa5 delay 2500 延时5秒 南北红灯 东西绿灯闪转黄灯 voidstatus4 chari for i 0 i 3 i 绿灯闪3次 TRLED 0 xaf delay 150 TRLED 0 xa5 delay 150 TRLED 0 x05 南北红灯 东西黄灯delay 500 延时1秒 主程序 main status0 初始状态 都是红灯 while 1 status1 南北绿灯 东西红灯status2 南北绿灯闪转黄灯 东西红灯status3 南北红灯 东西绿灯status4 南北红灯 东西绿灯闪转黄灯 思考题 用四盏灯模拟交通灯实验 并设置一个中断 当有急救车通过时 要求能通过中断使得十字路口上的所有交通灯全部变成红色 使急救车能够通过 培训8P1口输入输出实验以前都是介绍了输出 下面结合输入再训练一次 我们知道P1口即可以做输入口 也可以做输出口 本次实验内容 我们用P1口的低4位做为输入口 接按键 用P1口的高4位做输出 分别接单色灯 通过对按键的值进行读取分别点亮对应的灯 电路如下图所示 图10 6P1口输入输出电路 程序如下 P1口输入 输出实验 头文件引用 include 主程序 voidmain unsignedchara P1 0 xFF 因P1口是准双向口 所以把P1口作为 输入口时 应先置高电平 while 1 key P1 把读入的数据输出key key 4 将读取的低4位的值用移位指令放到高4位上 用于输出P1 key 培训9直流电机实验直流电机的调速方法有很多 比如专用的PWM芯片或者是用占空比来调速 我们使用第二种调速方式 对电机的控制 P1 0引脚送高电平 电机转 P1 0引脚送低电平 电机停 程序编写如下 include reg51 h sbitDj P1 0 voiddelay unsignedchars unsignedinti k for k 0 k s k for i 0 i 100 i voidmain unsignedchari k for Dj 0 delay 1 电机停止时间Dj 1 delay 3 电机转动时间 因为停止时间和转动时间很短 所以分辨不出电机停下来的工作状态 只能感觉到电机的速度慢了一些 这样就达到了调速的目的 当然这样的调节并不是很精确 我们只是通过这个实验来让大家了解电机的驱动方法及编程方法 思考题 调节delay的时间 看一下电机的运行效果 分别设计6个速度 用P1口的其他口接6个开关 用开关来调节电机的转速 用定时器的方法来编写一个直流电机的调速程序 培训10步进马达实验本次实验我们来做步进马达实验 实验箱上的步进马达驱动方式为四相四拍方式 各线圈通电顺序如下表 表中首先向A线圈输入驱动电流 接着B C D线圈驱动 最后又返回到A线圈驱动 按这种顺序切换 电机轴按顺时针方向旋转 若通电顺序相反 则电机轴按逆时针方向旋转 表10 7电机轴旋转方向表 注 为提高步进电机负载能力和运行平稳 可使用四相八拍驱动方式 我们用P1 0接A项 P1 1接B项 P1 3接C项 P1 4接D项 图10 7步进电机驱动模块 编程思路 按照相序拟合出一组数据 分别为07 0B 0D 0E 我们观察出这组数据就是一个0在做右移 那么我们可以考虑用移位的方法 还有一点就是我们看到都是用低4位 但移位时用的是8位 那么有什么方法使8位按照4位的方法来移呢 我们可以把上组数据进行扩展就能看出来了 可以用77H BBH DDH EEH这样就可以很容易的进行程序的编写了 参考程序如下 步进电机控制实验 头文件引用 include include defineucharunsignedchar 延时子程序 voiddelay intn unsignedintk j for k 0 k n k for j 0 j 500 j 主程序 main ucharstatus 0 x77 状态存储while 1 status crol status 1 P1 status 相位输出delay 5 程序运行后 我们能看到步进电机在不停的转 思考题 通过单步执行查看走过四相后步进电机转角是多少 调节延时程序观察步进电机的转速是否有变化 编写一个程序使步进电机转过90度角 180度角 270度角 360度角 培训11串口实验单片机有两个引脚是用来串行输入和输出的分别是RXD和TXD 本次培训我们就用这两个引脚与74LS164的对应引脚连接 然后164引脚的另一侧与一个共阳级的七段数码管连接 实现对数码管的点亮 串行口工作在方式0时 可通过外接移位寄存器实现串并行转换 在这种方式下 数据为8位 只能从RXD端输入输出 TXD端总是输出移位同步时钟信号 其波特率固定为晶振频率1 12 由软件置位串行控制寄存器 SCON 的REN后才能启动串行接收 在CPU将数据写入SBUF寄存器后 立即启动发送 待8位数据输完后 硬件将SCON寄存器的TI位置1 TI必须由软件清零 数据输入端 时钟输入端 系统复位信号 图10 8164串并转换模块 值得提一点的是164芯片是串入并出 需要将原来的数据逆序进行传递 例如 如共阳级数码管点亮 0 其段码对应的是11000000B C0H 则我们需要将这个数据逆转过来形成新的段码 即00000011B 03H 实验内容 利用8051串行口和并行输出串行移位寄存器74LS164 扩展一位数码显示在数码显示器上循环显示0 9这10个数字 电路图如10 8所示 实验程序 串并转换实验 头文件引用 include 宏声明 defineucharunsignedchar 变量定义 ucharcodeLED 0 x03 0 x9f 0 x25 0 x0d 0 x99 0 x49 0 x41 0 x1f 0 x01 0 x09 code代码区用来存放程序执行过程中不变的量 并且把它们赋给数组 可以方便的 进行调用uchartimes 20 ucharnum 0 中断程序 voidint t0 interrupt1 EA 0 TR0 0 关中断TL0 0 x00 延时50mS的常数TH0 0 x4b TR0 1 times if times 0 times 20 延时一秒的常数TI 0 SBUF LED num 读表格数据 串行发送数据num if num 10 判断是否到表尾 num 0 调整表格偏移量 EA 1 主程序 voidmain TMOD 0 x01 T0方式1TL0 0 x00 延时50mS的常数TH0 0 x4b SCON 0 x00 置串口工作方式0TI 0 RI 0 TR0 1 开中断ET0 1 EA 1 while 1 思考题 上面的实例采用的是定时器的方式进行1S的控制 使数码管循环点亮0 9 能否改成延时的方法 如何修改 采用的是定时器的方式进行1S的控制 使数码管循环点亮9 0 将上面的实例的定时时间改为1 25秒 如何修改 培训12单片机扩展实验本次课我们以74LS273作为输出口 控制4个双色LED灯 可发红 绿 黄光 模拟交通灯管理 电路如图10 9所示 图10 974ls273与双色灯模块 双芯LED灯在前面的章节中已经讲过了 这里就不在重复提出 在这里重点讲的是如何使用外部扩展的存储器芯片 在C51中我们如果想使用外部扩展芯片的话 首先要对外部扩展芯片的地址进行定义 进行定义的方法如下 1 头文件 include absacc h 在INC文件夹中能够找到 大家可以自己去看2 具体定义采用 define如 74ls273外扩地址为8300H的话 我们这样来定义 include absacc h defineCS273XBYTE 0 x8300 前面的CS273代表的是一个变量 在程序中可以随意取名 后面的XBYTE 0 x8300 代表的是外部地址0 x8300 存储类型是一个字节 有了这样的定义后 我们就可以把CS273这样的变量当做一个字节变量来使用了 就可以像前面的程序一样方便的进行程序的编写 例 双色灯模拟控制实验 采用74LS273做外部扩展 74LS273的地址为8300H程序如下 简单I O实验 交通灯控制 头文件引用 include include 宏声明 defineCOMXBYTE 0 x8300 定义8300命令口 延时子程序 voiddelay intn unsignedintk j for k 0 k n k for j 0 j 400 j 南北红灯 东西红灯 voidstatus0 COM 0 x0f delay 500 延时1秒 南北绿灯 东西红灯 voidstatus1 COM 0 x5a delay 2500 延时5秒 南北绿灯闪转黄灯 东西红灯 voidstatus2 chari for i 0 i 3 i 绿灯闪3次 COM 0 x5f delay 150 COM 0 x5a delay 150 COM 0 x0a 南北黄灯 东西红灯delay 500 延时1秒 南北红灯 东西绿灯 voidstatus3 COM 0 xa5 delay 2500 延时5秒 南北红灯 东西绿灯闪转黄灯 voidstatus4 chari for i 0 i 3 i 绿灯闪3次 COM 0 xaf delay 150 COM 0 xa5 delay 150 COM 0 x05 南北红灯 东西黄灯delay 500 延时1秒 主程序 main status0 初始状态 都是红灯 while 1 status1 南北绿灯 东西红灯status2 南北绿灯闪转黄灯 东西红灯status3 南北红灯 东西绿灯status4 南北红灯 东西绿灯闪转黄灯 培训13人机接口实验对于所有的智能设备来说 要有输入的设备 如键盘等 要有让人看到的设备 即输出设备 如显示器 数据管等 本次培训我们安排人机接口方面的培训 实验箱上有一个人机接口8279模块 默认连接的片选地址是8700H 则数据口是8700H 控制口是8701H 我们将8279细分为几个典型的程序供参考 便于更好的应用 电路如图10 10所示 图10 108279人机接口模块 实验1 8279显示实验实验内容 在七段数码管上显示 8279 8279显示实验 头文件引用 include include 宏声明 defineD8279XBYTE 0 x8700 8279数据口地址 defineC8279XBYTE 0 x8701 8279状态 命令口地址 defineucharunsignedchar defineuintunsignedint 延时子程序 voiddelay uintk j for k 0 k 100 k for j 0 j 500 j 8279初始化子程序 voidinit8279 C8279 10 置8279工作方式 右端输入C8279 0 x38 置键盘扫描速率C8279 0 xd1 清除LED显示delay C8279 0 x90 显示 8279 D8279 0 x40 的段码D8279 0 x40 的段码D8279 0 x00 空格 的段码D8279 0 x00 空格 的段码D8279 0 xef 9 的段码D8279 0 x27 7 的段码D8279 0 x5b 2 的段码D8279 0 x7f 8 的段码 主程序 voidmain init8279 8279初始化while 1 程序停止在后面 思考题 如果将上面的程序改成左端输入 则段码的顺序应该如何送 跟据上面的程序进行改写成显示 8279 如果在送段码的位置后面加delay 后会出现什么结果 请验证如果将C8279 0 x90 这条语句改为0 x80后 程序的执行效果是什么样 编写程序 实现9 0的倒计时程序 要求数字固定显示在第3个数码管上 实验2 8279键盘显示实验实验内容 在七段数码管上显示 8279 按实验箱上的0 F键在 数码管 的位置上显示按上的键值实验参考程序 8279键盘显示实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论