1、姜老师 主 讲,一气呵成学51,第5课 流水灯实验,1. 单片机最小系统概述。 2. LED流水灯原理。 3. 流水灯程序相关语法。 4. 实际操作,验证程序。,1.1 51系列单片机的最小硬件系统,51系列单片机的最小硬件系统是指能让单片机正常工作的最小硬件电路。对于8051系列单片机及其兼容的型号,其电路的最小系统大致相同,这里以STC89C52为例,介绍典型的51系列单片机最小硬件电路,如图所示。,1.2 时钟振荡电路,时钟振荡电路用于产生单片机正常工作时所需要时钟信号。51系列单片机可以采用两种方式的时钟振荡电路:内部振荡电路和外部振荡电路。下面分别介绍这两种方式。 1内部振荡电路 内
2、部振荡电路是采用单片机内部 振荡器来产生工作所需的时钟。 51系列单片机内部包含一个高增 益的单级反相放大器,引脚XTAL1 和XTAL2分别为片内反相放大器 的输入端口和输出端口。外接无源晶振。 2外部振荡电路 外部振荡电路是采用外部振荡器产生时钟信号直接供单片机使用,外接有源晶振。,1.3 单片机的复位电路,单片机的复位电路使单片机进入复位状态。通过复位操作可以完成单片机的初始化,也可使处于死机状态下的单片机程序重新开始运行。 1单片机复位的原理 单片机复位的原理是,在时钟电路开始工作后,在单片机的RST复位引脚施加24个以上的时钟振荡脉冲的高电平,单片机便可以实现复位。当RST引脚从高电
3、平跳变为低电平后,单片机便从0000H地址开始执行程序。 2复位电路 最典型的上电复位电路如图所示,其基本原理是 利用RC电路的充放电效应。当单片机上电的时候, 复位电路通过电容加在RST引脚一个短暂的高电 平信号,这个高电平信号随着电容的充电而逐渐 降低,这个高电平持续的时间和RC电路的充放电 时间有关。使用时需要选择合适的电容和电阻来 使高电平的持续时间大于单片机的复位时间。,2. LED流水灯原理,2.1 流水灯原理图部分,2.2 管脚电气信息,2.3 灌电流和拉电流,灌电流(sinking current) ,对一个端口而言,如果电流方向是向其内部流动的则是“灌电流”,比如一个IO通过
4、一个电阻和一个LED连接至VCC,当该IO输出为逻辑0时可以点亮LED。 拉电流(sourcing current),对一个端口而言,如果电流方向是向其外部流动的则是“拉电流”,比如一个IO通过一个电阻和一个LED连至GND,当该IO输出为逻辑1时能不能点亮LED。,3. 相关C语言语法,3.1 C51程序的基本结构 单片机C51语言继承了C语言的特点,其程序结构与一般C语言的程序结构没有差别。C51源程序文件的扩展名为“.c”,如Test.c、Function.c等。每个C51工程中包含一个名为“main()”的主函数,C51程序的执行总是从main()函数开始的。当主函数中所有语句执行完毕
5、,则程序执行结束。 keil uVision 项目结构,3.2 include预处理命令,以“#”号开头的是预处理命令。所谓预处理是指在进行编译的第一遍扫描之前所作的工作。预处理是语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。 #include包含预处理命令,文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。,3.3 C51的数据类型,C51的基本数据类型有整型(int)、浮点型(float)、字符型(char)、无值型(v
6、oid)。在基本数据类型中,除void类型外,其前面均可以有各种修饰符。修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。 常用的修饰符有signed(有符号)、unsigned(无符号)、long(长型符)、short(短型符)。在C51语言中的所有数据类型的字长和取值范围,如表所示。,3.4 整型变量,整型变量是整数类型的数据。整型变量是最常用的数据类型。整型变量的定义格式是“类型说明符 变量标识符,变量标识符”。示例如下: unsigned char temp; /定义temp为短整型变量其中,类型说明符与变量标识符之间至少有一个空格。最后一个变量标识符必须以“;”结尾。整型
7、变量的前面可以加上不同的修饰符。,3.5 C51的标识符与关键字,标识符和关键字是一种编程语言最基本的组成部分,C51语言同样支持自定义的标识符以及系统保留的关键字。在进行C51程序设计时,需要了解标识符和关键字的使用规则。,3.5.1 标识符,标识符常用来声明某个对象的名称,如变量和常量的声明、数组和结构的声明、自定义函数的声明以及数据类型的声明等。示例如下。 int count; void Function1(); 在上面的例子中,count为整型变量的标识符,Function1为自定义函数的标识符。 在C51语言中,标识符可以由字母、数字(09)和下划线“_”组成,最多可支持32个字符。
8、并且,C51标识符第一个字符必须是字母或者下划线“_”。例如“ut1”、“ch_1”等,都是正确的。而“5count”则是错误的标识符。另外,C51的标识符区分大小写,例如“count1”和“COUNT1”代表两个不同的标识符。,3.5.2 关键字,关键字是C51语言重要的组成部分,是C51编译器已定义保留的专用特殊标识符,有时也称为保留字。这些关键字通常有固定的名称和功能,如int、float、if、for、do、while、case等。 扩展关键字,如sbit、using 、xdata、data、reentrant 、interrupt、sfr等。,3.6 变量、函数声明、定义,unsig
9、ned char i; / 变量的声明; void delay(void); / 函数的声明; void delay(unsigned int t) / 函数的定义; ,3.7 声明,声明语句用于声明变量或者自定义函数。通过声明语句,可以指定变量的类型、初始值以及函数的类型和形参等。 声明语句的一般形式如下: 类型说明符 变量名(=初始值); 类型说明符 函数名(形参); 值得注意的几点: 类型说明符为C51语言中的变量或者函数类型。 变量名或者函数名为读者定义的标识符,应符合C51标识符的命名规则。 如果在声明变量的时候需要指定初始值,则可以使用“=”来指定,否则“=”可以省略。 对于函数,
10、如果不需要形参,则可以使用void来代替。,3.8 运算符和表达式,位运算符是对字节或字中的二进制位(bit)进行逐位逻辑处理或移位的运算符。C51语言中的位运算符如下所示。 “&” 运算符:进行逻辑与(AND)运算。 “|” 运算符:进行逻辑或(OR)运算。 “” 运算符:进行逻辑异或(XOR)运算。 “” 运算符:进行按位取补(NOT)运算。 “”运算符:进行右移运算。 “”运算符:进行左移运算。 位运算符的操作对象整型和字符型数据的字节或字,位操作不能用于float、double、long double、void或其他聚合类型。支持全部的位运算符,表明C51可以进行汇编语言所具有的位运算
11、,因此C51语言既具有高级语言的特点,也具有低级语言的功能。,3.9 循环控制结构,循环语句提供了一种以最少的代码来执行多条重复语句的形式。 C51语言中的循环语句有如下几类: for语句 while语句 do-while语句,3.9.1 for语句,在程序中使用for语句的时候,应特别注意如下几点: 一定要特别注意循环条件和循环变量的变化方式,保证循环在一定条件满足的时候能够结束,防止出现死循环的情况。 for语句中的三个表达式都是可选择项,但“;”不能省。例如,for(;)是一个合法的语句,但其表示一个无限死循环。 for循环语句可以实现多级嵌套。 当循环体语句只有一条的时候,可以省略花括
12、号“”,否则不可以省略。,for(表达式1;表达式2;表达式3) 语句; ,3.9.2 while语句,在程序中使用while语句的时候,应特别注意如下几点: 在循环体语句中一定要加入能够改变while表达式取值的语句,保证循环在一定条件满足的时候能够结束,防止出现死循环的情况。 while语句的表达式可以永远为真,此时表示一个无限死循环。例如,while(1)。 while循环语句可以实现多级嵌套 当循环体语句只有一条的时候,可以省略花括号“”,否则不可以省略。 while语句循环体内允许空语句。,while(表达式) 语句; ,3.9.3 do-while语句,在程序中使用do-while
13、语句的时候,应特别注意如下几点: 在循环体语句中一定要加入能够改变while表达式取值的语句,保证循环在一定条件满足的时候能够结束,防止出现死循环的情况。 do-while语句和while语句区别在于执行循环体语句的顺序不同。 do-while循环语句也可以实现多级嵌套。 当循环体语句只有一条的时候,可以省略花括号“”,否则不可以省略。,do 语句; while(表达式);,3.10 延时函数,void delay(unsigned int t) /延时子程序 unsigned char i;while(t-)for(i=0;i125;i+) ,3.11 主函数分析,void main(voi
14、d) / 主程序 while(1) temp=0xFE; for(i=0;i8;i+) P2 = temp; temp = (temp1)|1; / 实现跑马灯的移动delay(100); ,3.12 P2口的变化,i = 0 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.01 1 1 1 1 1 1 0 = 0XFE i = 1 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.01 1 1 1 1 1 0 1 = 0XFD i = 2 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.01 1 1 1 1 0
15、 1 1 = 0XFB i = 3 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.01 1 1 1 0 1 1 1 = 0XF7 i = 4 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.01 1 1 0 1 1 1 1 = 0XEF i = 5 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.01 1 0 1 1 1 1 1 = 0XDF i = 6 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.01 0 1 1 1 1 1 1 = 0XBF i = 7 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.00 1 1 1 1 1 1 1 = 0X7F,4 流水灯程序演示,1.流水灯左移。 2.流水灯右移。 3.流水灯综合演示。,一气呵成学51,谢谢大家!,