第八次课(共2学时)一、授课题目:C51基础知识2和流水灯的设计二、教学目标和任务:1.了解C51的运算符及其用法;2.掌握流水灯硬件电路的设计;3.掌握三种流水灯编程的方法。三、教学重难点:重点:流水灯硬件电路的设计、三种流水灯编程方法。难点:数组方法设计流水灯。四、授课过程:回顾:简要的回顾上一节课的主要知识点,C51在ANSIC基础上新增的关键词、标识符命名规则、变量定义规则、函数定义规则、C51程序框架。0.引入本节课将为同学们介绍C51中主要运算符的使用,之后为同学们介绍流水灯硬件电路的设计和三种编程方法。1.C51运算符1.1算术运算符:+、一、*、/、%、++、--本部分需要强调1. x++和++x 的区别、x=-和--x 的区别。2./和%搭配使用可拆分出一个数的每一位。1.2逻辑运算二&&!1
1 第八次课(共 2 学时) 一、授课题目:C51 基础知识 2 和流水灯的设计 二、教学目标和任务: 1. 了解 C51 的运算符及其用法; 2. 掌握流水灯硬件电路的设计; 3. 掌握三种流水灯编程的方法。 三、教学重难点: 重点:流水灯硬件电路的设计、三种流水灯编程方法。 难点:数组方法设计流水灯。 四、授课过程: 回顾:简要的回顾上一节课的主要知识点,C51 在 ANSI C 基础上新增的关键词、标识符命名规则、变量定义规则、函数 定义规则、C51 程序框架。 0. 引入 本节课将为同学们介绍 C51 中主要运算符的使用,之后为 同学们介绍流水灯硬件电路的设计和三种编程方法。 1. C51 运算符 1.1 算术运算符:+、-、*、/、%、++、- 本部分需要强调 1. x++和++x 的区别、x-和-x 的区别。 2. /和%搭配使用可拆分出一个数的每一位。 1.2 逻辑运算 && || !
注意:逻辑运算的结果只有一位,当操作数不只一位时,非0作1处理。1.3逐位运算&、[、~、、<<、>>注意:逐位运算中的&、、和逻辑运算中的&&、山、!和区别。左移一位乘以2,右移一位除以2。1.4关系运算><>=<=!=结果为一位0或者1。注意==和=的区别。2.流水灯硬件电路设计卡U1口XTALT616666 3663666 566316PO.1AGA8十星美复装oXTAL2a+LEDOR910P870LEDYFP2.90日o##集#惠R10BAF###晨健建#五E#REEE会LEDS660图1流水灯硬件电路讲解要点:1.单片机最小系统电路应包含电源(图中省略了)、时钟2
2 注意:逻辑运算的结果只有一位,当操作数不只一位时, 非 0 作 1 处理。 1.3 逐位运算 &、|、~、^、<<、>> 注意:逐位运算中的&、|、~和逻辑运算中的&&、||、!和 区别。 左移一位乘以 2,右移一位除以 2。 1.4 关系运算 > < >= <= == != 结果为一位 0 或者 1。注意==和=的区别。 2. 流水灯硬件电路设计 图 1 流水灯硬件电路 讲解要点: 1. 单片机最小系统电路应包含电源(图中省略了)、时钟
电路(外部振荡时钟)、复位电路(手动复位和按键复位)、EA*接高电平。2.LED灯应该采用灌电流驱动。8只LED灯接在P1口的八只引脚上。3.三种方法设计流水灯3.1一只一只点亮#include<reg51.h>sbit LEDO=P1~0;sbit LED1=P1'1; ...voidDelay500msO略)://时延可通过下载程序软件生成,该处为学生讲解如何生成时延函数。voidmainO1while(1)(LEDO=O:Delay500ms0:LEDO0=1:LED1=0:Delay500ms(:LED1=1:寻1该程序的设计思想在于,给P1的某一只引脚低电平,对应的LED灯点亮。最终实现的现象为最上面的两只灯依次交替3
3 电路(外部振荡时钟)、复位电路(手动复位和按键复位)、EA* 接高电平。 2. LED 灯应该采用灌电流驱动。8 只 LED 灯接在 P1 口的 八只引脚上。 3. 三种方法设计流水灯 3.1 一只一只点亮 #include<reg51.h> sbit LED0=P1^0; sbit LED1=P1^1; . void Delay500ms(){略};//时延可通过下载程序软件生成,该处 为学生讲解如何生成时延函数。 void main () { while(1) { LED0=0; Delay500ms(); LED0=1;LED1=0; Delay500ms(); LED1=1; } } 该程序的设计思想在于,给 P1 的某一只引脚低电平,对 应的 LED 灯点亮。最终实现的现象为最上面的两只灯依次交替
点亮。3.2移位函数方法库函数intrins中的_crol_(m,n)和_cror_(m,n)可实现将m循环左移(右移)n位。需要将P1数据左移一位时可以写成P1=_crol_(P1, 1) :思考:可否写成crol(P1,1)?为什么?可以通过a+1和a=a+1的区别来理解。程序如下:#include<reg51.h>#include<intrins.h>//包含移位函数crol()的头文件voiddelay500ms(();voidmain()1P1=0xfe://向P1口送出点亮数据while (1)tdelay500msO :P1= crol_(P1,1)://函数crol_(P1,1)把P1中的数据循环左移1位11注意:_crol(m,n)函数包含在库函数<intrins.h>中,需要在源文件前些包含该头文件。4
4 点亮。 3.2 移位函数方法 库函数 intrins 中的_crol_(m,n)和_cror_(m,n)可实现 将 m 循环左移(右移)n 位。 需要将 P1 数据左移一位时可以写成 P1=_crol_(P1,1); 思考:可否写成_crol_(P1,1)?为什么?可以通过 a+1 和 a=a+1 的区别来理解。 程序如下: #include <reg51.h> #include <intrins.h>//包含移位函数_crol_( )的头文件 void delay500ms(){}; void main( ) { P1=0xfe; //向 P1 口送出点亮数据 while (1) { delay500ms(); P1=_crol_(P1,1) ; // 函数_crol_(P1,1)把 P1 中 的数据循环左移 1 位 } } 注意:_crol_ (m,n)函数包含在库函数<intrins.h>中,需要在源 文件前些包含该头文件
思考:请用_crol_(m,n)或者_cror_(m,n)实现从高位到低位每次亮两个的流水灯。思考:<<为补零左移,crol(m,n)为循环左移,若将P1=crol(P1,1)改为P1=P1<<1,现象有什么不同?程序应该怎么写。程序如下:#include<reg51.h)#include<intrins.h)还需要吗?delay500ms0();voidmain()//主程序1P1=0xfe;//向P1口送出点亮数据while (1)tdelay500ms(://P1中的数据补零左移1位P1=P1<<1:if(P1==0)P1=0xfe:11思考:if(P1==0)P1=Oxfe能否删除,为什么?3.3array(数组)制作由上至下再由下至上反复循环点亮显示的流水灯。建立1个字符型数组,将控制8个LED显示的8位数据作为数组元素,依次送P1口。ucharcodetab[15]=[Oxfe,Oxfd,Oxfb,Oxf7,Oxef,5
5 思考:请用_crol_(m,n)或者_cror_(m,n)实现从高位到低 位每次亮两个的流水灯。 思考:<<为补零左移,_crol_(m,n)为循环左移,若将 P1=_crol_(P1,1)改为 P1=P1<<1,现象有什么不同?程序应该 怎么写。程序如下: #include <reg51.h> #include <intrins.h> 还需要吗? delay500ms(){}; void main( ) //主程序 { P1=0xfe; //向 P1 口送出点亮数据 while (1) { delay500ms(); P1=P1<<1 ; // P1 中的数据补零左移 1 位 if(P1==0) P1=0xfe; } } 思考:if(P1==0) P1=0xfe 能否删除,为什么? 3.3 array(数组) 制作由上至下再由下至上反复循环点亮显示的流水灯 。 建立 1 个字符型数组,将控制 8 个 LED 显示的 8 位数据 作为数组元素,依次送 P1 口。 uchar code tab[15]={ 0xfe,0xfd,0xfb,0xf7,0xef