第4章 C语言基础以及流水灯的实现

点击此处查看最新的网赚项目教程

第4章 C语言基础以及流水灯的实现

C语言,在编程领域是久负盛名的,可能没接触过计算机编程的人会把它看的很神秘,感觉非常的难。但其实并非如此,C语言的逻辑和运算,充其量也就是小学水平,所以大家不要怕它,我尽可能的从小学数学逻辑方式带着大家学习C语言。

4.1 二进制、十进制和十六进制

进制,看似很简单的东西,但很多同学还是不能彻底理解。这里先简单介绍一些注意事项,然后还是从实验中讲解会比较深刻。

1、十进制就不多说了,逢十进位,一个位有十个值:0~9,我们的生活中到处都是它的身影。二进制就是逢二进位,它的一个位只有两个值:0和1,但它却是实现计算机系统的最基本的理论基础,计算机(包括单片机)芯片是基于成万上亿个的开关管组合而成的,他们每一个都只能有开和关两种状态,再难找出第三个状态了(不要辩解半开半关这个状态,它是不稳定态,是极力避免的),所以他们只能对应于二进制的1和0两个值,而没有2、3、4……,理解二进制对于理解计算机的本质很有帮助。书写二进制数据时需加前缀0b,每一位的值只能是0或1。十六进制就是把4个二进制位组合为一位来表示,于是它的每一位有0b0000~0b1111共16个值,用0~9再加上A~F(或a~f)表示,那么它自然就是逢十六进位了,它本质上同二进制是一样的,是二进制的一种缩写形式,也是我们程序编写中常用的形式。书写十六进制数据时需加前缀0x,下表是三种进制之间的对应关系。

表4-1 进制转换

十进制

二进制

十六进制

0b0

0x00

0b1

0x01

0b10

0x02

0b11

0x03

0b100

0x04

……

……

……

0b1001

0x09

10

0b1010

0x0A

11

0b1011

0x0B

12

0b1100

0x0C

13

0b1101

0x0D

14

0b1110

0x0E

15

0b1111

0x0F

16

0b10000

0x10

17

0b10001

0x11

……

……

……

2、对于二进制来说,8位二进制我们称之为一个字节,二进制的表达范围值是从0b00000000~0b11111111,而我们在程序中用十六进制表示的时候就是从0x00到0xFF,这里教大家一个二进制转换十进制和十六进制的方法,二进制4位一组,遵循8/4/2/1的规律比如0b1010,那么从最高位开始算,数字大小是8*1+4*0+2*1+1*0 = 10,那么十进制就是10,十六进制就是0xA。尤其二进制转十六进制的时候,十六进制一位刚好是和二进制的4位相对应的,这些大家不需要强行记忆,多用几次自然就熟练了。

3、对于进制来说,只是数据的表现形式,而数据的大小不会因为进制表现形式不同而不同,比如二进制的0b1、十进制的1、十六进制的0x01,他们本质上是数值大小相等的同一个数据。我们在进行C语言编程的时候,我们只写十进制和十六进制,那么不带0x的就是十进制,带了0x符号的就是十六进制。

4.2 C语言变量类型和范围

什么是变量?变量自然和常量是相对的。常量就是1、2、3、4.5、10.6……等固定的数字,而变量则根我们小学学的x是一个概念,我们可以让它是1,也可以让它是2,我们想让它是几是我们的程序说了算的。

那么我们小学学的数学里边,有这么几类,正数、负数、整数和小数。在C语言里,除名字和我们数学里学的不一样外,还对数据大小进行了限制。这个地方有一点复杂的是,在C51里边的数据范围和其他编程环境还可能不完全一样,因此我们下边的这个图,仅仅代表的是C51,其他编程环境可能不一样,大家知道有这回事就可以了。

C语言的数据基本类型分为字符型、整型、长整型以及浮点型,如图4-1所示。

计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件试题答案_计算机常用工具软件教学视频

图4-1 C语言基本数据类型

图4-1中,四种基本类型,每个基本类型又包含了两个类型。字符型、整型、长整型,除了可表达的数值大小范围不同之外,都是只能表达整数,而unsigned型的又只能表达正整数,要表达负整数则必须用signed型,如要表达小数的话,则必须用浮点型了。

比如上节课最后的闪烁LED小灯的程序,我们用的是unsigned int i = 0;这个地方i的取值范围就是0~65535,在接下来的for语句里,如果我们把原来那个30000改成70000的话,for(i=0;i

这里有一个编程宗旨,就是能用小不用大。就是说定义能用1个字节char解决问题的,就不定义成int,一方面节省RAM空间可以让其他变量或者中间运算过程使用,另外一方面,占空间小程序运算速度也快一些。

4.3 C语言基本运算符

我们小学数学学过加、减、乘、除等运算符号以及四则混合运算,而这些运算符号在C语言中也有,但是有些表达方法不一样,并且还有额外的运算符号。在C语言编程中,加、减、乘、除和取余数的符号分别是:+、-、*、/、%。此外,C语言中还有额外的两个运算符++和--,他们的用法是一样的,一个是自加1,一个是自减1,我们选++来讲一下。

++在用法上就是加1的意思,注意是变量自己加,比如b++的意思就是b=b+1,而在编程的时候我们有两种常用的方式先加和后加。比如unsigned char a = 0; unsigned char b = 0;那么a = ++b;的整个运算过程是先计算b=b+1,那么b就等于1了,然后再运行a=b,运行完毕后a=1,b=1。如果写成a=b++;那么运算过程就是先执行a=b;然后再执行b=b+1,执行完的结果就是a=0,b=1。

刚刚讲的叫做算数运算符,但是其中用到了C语言一个很重要的赋值运算符“=”。我们前边的程序在不停的用,但是始终没有详细诠释这个运算符。在C语言里,“=”代表的意思是赋值,而不是等于。最经典的一个例子就是a=1;b=2;如果写成a = a+b;这个在数学里的运算是a等于a加b,但是在c语言里的意思是把a加b的结果送给a,那么运算完了之后的结果是a等于3,b还等于2。

说到这里就不得不说C语言的比较运算符“==”。这个在C语言里是进行是否等于判断的关系运算符,而“!=”就是不等于的关系运算符。这些运算符这里就是简单介绍一下,而后边我们会通过使用来帮助大家巩固这些知识。其他一些运算符,在使用过程中我们也会陆陆续续介绍到。

4.4 for循环语句

for语句是我们今后编程的一个常用的语句,这个语句必须得学会其用法,它不仅仅可以用来做延时,更重要的是用来做一些循环运算。for语句的一般形式如下:

for (表达式1; 表达式2; 表达式3)

(需要执行的语句);

其执行过程是:表达式1首先执行且只执行一次;然后执行表达式2,通常都是一个用于判定条件的表达式,如果表达式2条件成立,就执行(需要执行的语句);然后再执行表达式3;再判断表达式2,执行(需要执行的语句);再执行表达式3.....一直到表达式2不成立时,跳出循环继续执行循环后面的语句。举个例子:

for (i=0; i

j++;

这里有一个符号++,我们刚刚讲过了。假如j最开始初值是0,首先执行表达式1的i=0,然后判断i小于2这个条件成立,就执行一次j++,j的值就是1了,然后经过表达式3后,i的值也变成1了,再判断条件2,还是符合,j再加一次,j变成2了,再经过表达式3后i也变成2了,再判断条件2,发现2

for语句除了这种标准用法,还有几种特殊用法,比如我们上节课的闪烁小灯对for语句的用法for(i=0; i

还有一种写法for( ; ; ),这样写后,这个for循环就变成了死循环了,就不停的执行(需要执行的语句),和我们前边讲的while(1)的意思是一样的了。那while这个语法是如何用的呢?

4.5 while循环语句

在单片机C语言编程的时候,每个程序我们都会固定的加一句while(1),这条语句就可以起到死循环的作用。对于while语句来说,他的一般形式是:

while (表达式)

循环体语句;

在C语言里,通常表达式符合条件,我们叫做真,不符合条件,叫做假。比如前边i

while(表达式)这个括号里的表达式,为真的时候,就会执行循环体语句,当为假的时候,就不执行。在这里先不举例,后边遇到时再详细说明。

还有另外一种情况,就是我们C语言里边,除了表达式外,还有常数,习惯上,我们把非0的常数都认为是真,只有0认为是假,所以我们程序中使用了while(1),这个数字1,可以改成2、3、4......等等都可以,都是一个死循环,不停的执行循环体的语句,但是如果把这个数字改成0,那么就不会执行循环体的语句了。

大家通过学习for循环和while循环,是不是会产生一个疑问?为何有的循环加上{},而有的循环却没加呢?什么时候需要加,什么时候不需要加呢?

我们前边讲过,在C语言中,分号表示语句的结束,而在循环语句里{}表示的是循环体的所有语句,如果不加大括号,则只循环执行一条语句,即第一个分号之前的语句,而加上大括号后,则会执行大括号中所有的语句,举个例子看一下吧,上节课的闪烁小灯程序如下所示。

计算机常用工具软件试题答案_计算机常用工具软件教学视频_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-

程序一就是我们上节课的程序,直接可以实现闪烁功能。而程序二没有加大括号,从语法上来看是没有任何错误的,写到Keil里编译一下也不会报错。但是从逻辑上来讲,程序二只会不停的循环“LED = 0;”这条语句,实际上和程序三效果是相同的。

计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件试题答案_计算机常用工具软件教学视频

程序执行到while(1)已经进入死循环了,所以后边三条语句是一辈子也执行不到的。因此为了防止出类似的逻辑错误,我们推荐,不管循环语句后边是一条还是多条语句,都加上{}以防出错。

4.6 函数的简单介绍

函数定义的一般形式如下:

函数值类型 函数名 (形式参数列表)

函数体

1、函数值类型,就是函数返回值的类型。在我们后边的程序中,会有很多函数中有return x这个东西,这个返回值也就是函数本身的类型。还有一种情况,就是这个函数只执行操作,不需要返回任何值,那么这个时候它的类型就是空类型void,这个void按道理来说是可以省略的,但是一旦省略,Keil软件会报一个警告,所以我们通常也不省。

2、函数名,可以由任意的字母、数字和下划线组成,但数字不能作为开头。函数名不能与其他函数或者变量重名,也不能是关键字。什么是关键字呢,后边我们慢慢接触,比如char这类,都是关键字,是我们程序中具备特殊功能的标志符,这种东西不可以命名函数。

3、形式参数列表,也叫做形参列表,这个是函数调用的时候,相互传递数据用的。有的函数,我们不需要传递参数给它,那么可以用void来替代,void同样可以省略,但是那个括号是不能省略的。

4、函数体,包含了声明语句部分和执行语句部分。声明语句部分主要用于声明函数内部所使用的变量,执行语句部分主要是一些函数需要执行的语句。特别注意,所有的声明语句部分必须放在执行语句之前,否则编译的时候会报错。

5、一个工程文件必须有且仅有一个main函数,程序执行的时候,都是从main函数开始的。

6、关于形参和实参的概念,我们后边再总结,如果遇到程序里有,大家再跟着抄一段时间。先用,后讲解,这样更有利于理解。

我们来回顾一下上节课的闪烁LED程序中的主函数,大家根据注释再认真分析一遍,是不是对函数的认识就清楚多了。

计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件教学视频_计算机常用工具软件试题答案

代码中的“//”是注释符,意思是说在这之后的内容都是注释。注释是给程序员自己或其他人看的,用于对程序代码做一些补充说明,对程序的编译和执行没有任何影响。

4.7 Keil软件延时

C语言常用的延时方法,有如图4-2所示4种。

计算机常用工具软件试题答案_计算机常用工具软件教学视频_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-

图4-2 C语言延时方法

图4-2是C语言编程常用的4种延时方法,其中两种非精确延时,两种精确一些的延时。for语句和while语句都可以通过改变i的范围值来改变延时时间,但是C语言循环的执行时间都是不能通过程序看出来的。

精确延时有两个方法,一个方法是用定时器来延时,这个方法我们后边课程要详细介绍,定时器是单片机的一个重点。另外一个就是用库函数_nop_();,一个NOP的时间是一个机器周期的时间,这个后边也要介绍。

非精确延时,只是在我们做一些比如小灯闪烁,流水灯等简单演示实验中使用,而实际项目开发过程中其实这种非精确延时用的很少。

好了,介绍完了,我们就要实战了。上节课的LED小灯闪烁的程序,我们用的延时方式是for(i=0;i

观察完了,毫无疑问,实际现象和我提到的理论是相符合的,这是为什么呢?这里介绍一个常识。我们人的肉眼对闪烁的光线有一个最低分辨能力,通常情况下当闪烁的频率高于50Hz时,我们看到的信号就是常亮的。即,延时的时间低于20ms的时候,我们的肉眼是分辨不出来小灯是在闪烁的,可能最多看到的是小灯亮暗稍微变化了一下。要想清楚的看到小灯闪烁,延时的值必须大一点,大到什么程度呢,不同的亮度的灯不完全一样,大家可以自己做实验。

那么如何观察我们写的延时到底有多长时间呢?选择Keil菜单项Project-->Options for Target ‘Target1’...,或点击在图2-17中已提到过的图标,进入工程选项,如图4-3所示。

计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件试题答案_计算机常用工具软件教学视频

图4-3 工程选项——时钟频率设置

首先打开Target这个选项卡,找到里边的Xtal(MHz)这个位置,这是填写我们进行模拟时间的晶振选项,从我们原理图以及板子上都可以看到,单片机所使用的晶振是11.0592MHz,所以这个地方我们要填上11.0592。然后找到Debug这个选项卡,选择左侧的Use Simulator,然后点击最下边的OK就可以了,如图4-4所示。

计算机常用工具软件试题答案_计算机常用工具软件教学视频_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-

图4-4 工程选项——仿真设置

选择菜单项Debug-->Start/Stop Debug Session,或者点击图4-5中红框内的按钮,就会进入一个新的页面,如图4-6所示。

图4-5 启动/结束调试按钮

计算机常用工具软件试题答案_计算机常用工具软件教学视频_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-

图4-6 工程调试界面

最左侧那一栏显示单片机一些寄存器的当前值和系统信息,最上边那一栏是Keil将C语言转换成汇编的代码,下边就是我们写C语言的程序,调试界面包含很多的子窗口,都可以通过菜单View中的选项打开和关闭。你可能会感觉这种默认的分布不符合习惯或者不方便观察特定信息,好办,界面上几乎所有子窗口的位置都可以调整的。比如我想把Disassembly反汇编窗口和源代码窗口横向并排摆放,那么只需要用鼠标拖动反汇编窗口的标题栏,这时会在屏幕上出现多个指示目标位置的图标,拖着窗口把鼠标移动到相应的图标上,软件还会用蓝色底纹指示具体的位置,如图4-7所示,松开鼠标窗口就会放到新位置了。调整后的效果如图4-8所示。

计算机常用工具软件试题答案_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件教学视频

图4-7 调整窗口位置

计算机常用工具软件教学视频_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件试题答案

图4-8 窗口位置调整效果

你可能已经注意到在C语言的源代码文件和反汇编窗口内都有一个黄色的箭头,这个箭头代表的就是程序当前运行的位置,因为反汇编内的代码就由源文件编译生成的,所以它们指示的是相同的实际位置。在这个工程调试界面里,我们可以看到程序运行的过程。在左上角的工具栏里有这样三个按钮:第一个标注有RST字样的是复位,点击一下之后,程序就会跑到最开始的位置运行;右侧紧挨着的按钮是全速运行,点击一下程序就会全速跑起来;再右边打叉的是停止按钮,当程序全速运行起来后,我们可以通过点击第三个图标来让程序停止,观察程序运行到哪里了。点击一下复位后,会发现C语言程序左侧有灰色或绿色,有的地方还是保持原来的白色,我们可以在我们灰色的位置双击鼠标设置断点,就是比如程序一共20行,在第十行设置断点后,点全速运行,程序就会运行到第十行停止,方便我们观察运行到这个地方的情况。

同学们会发现,有的位置可以设置断点,有的地方不可以设置断点,这是为什么呢?因为Keil软件本身具备程序优化的功能,如果大家想在所有的代码位置都能设置断点,可以在工程选项里把优化等级设置为0,就是告诉Keil不要进行优化。如图4-9所示。

计算机常用工具软件教学视频_计算机常用工具软件试题答案_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-

图4-9 工程优化等级

这节课我们重点是看看C语言代码的运行时间,在最左侧的register那个框内,有一个sec选项,这个选项显示就是单片机运行了多少时间。单击一下复位按钮,会发现这个sec变成了0,然后我们在LED = 0;这一句加一个断点,在LED = 1;这个位置加一个断点,我们点击全速运行按钮,会直接停留在LED = 0;我们会看到我们的时间变化成0.00042752秒,如图4-10所示。请注意,我们这里设置的优化等级是默认的8,如果你用的是其它等级的话运行时间就会有所差别,因为优化等级会直接影响程序的执行效率。

计算机常用工具软件教学视频_计算机常用工具软件试题答案_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-

图4-10 查看程序运行时间

再点一下全速运行,会发现sec变成了0.16342556,那么减去上次的值,就是程序在这两个断点之间执行所经历的时间,也就是这个for循环的执行时间,大概是163ms。我们也可以通过改变30000这个数字来改变这个延时时间。当然了,大家要注意i的取值范围,你如果写成了大于65535的值以后,程序就一直运行不下去了,因为i无论如何变化,都不会大于这个值,如果要大于这个值且正常运行,必须改变i定义的类型了。后边如果我们要查看一段程序运行了多长时间,都可以通过这种方式来查看。

实际上,进入debug模式,除了可以看程序运行了多长时间外,还可以观察各个寄存器、各个变量的数值变化情况。点击View菜单里的Watch Windows-->Watch 1,可以打开变量观察窗口,如图4-11所示。

计算机常用工具软件试题答案_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件教学视频

图4-11 变量观察窗口

在这个窗口内,可以通过双击或按F2键,然后输入我们想观察的变量或寄存器的名字,后边就会显示出它的数值,这个功能在我们后边的调试程序中比较有用,大家先了解一下。

4.8 流水灯程序

我们前边学了点亮一个LED小灯,然后又学了LED小灯闪烁,现在我们要进一步学习如何让8个小灯依次一个接一个的点亮,流动起来,也就是常说的流水灯。先来看8个LED的核心电路图,如图4-12。

计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件教学视频_计算机常用工具软件试题答案

图4-12 LED小灯电路图

通过前面的课程,我们可以了解到控制引脚P0.0经过74HC245控制了DB0,P0.1控制DB1……P0.7控制DB7。我们还学到一个字节是8位,我们如果写一个P0,就代表了P0.0到P0.7的全部8个位。比如我们写P0 = 0xFE;转换成二进制就是0b11111110,所以点亮LED小灯的程序,实际上我们可以改成另外一种写法,如下所示。

计算机常用工具软件教学视频_计算机常用工具软件基础知识,0,0,0,0.0,0,0,0,,-_计算机常用工具软件试题答案

通过上边这个程序我们可以看出来,可以通过P0来控制所有的8个LED小灯的亮和灭。我们下边要进行依次亮和灭,怎么办呢?从这里就可以得到方法了,如果想让单片机流水灯流动起来,依次要赋给P0的数值就是:0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F。

在我们的C语言当中,有一个移位操作,其中代表的是右移。比如a = 0x01

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: qs62318888

主题授权提示:请在后台主题设置-主题授权-激活主题的正版授权,授权购买:RiTheme官网

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注