PIC单片机C语言学习进步基础入门实例.docx
- 文档编号:16130994
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:45
- 大小:89.03KB
PIC单片机C语言学习进步基础入门实例.docx
《PIC单片机C语言学习进步基础入门实例.docx》由会员分享,可在线阅读,更多相关《PIC单片机C语言学习进步基础入门实例.docx(45页珍藏版)》请在冰点文库上搜索。
PIC单片机C语言学习进步基础入门实例
PIC单片机C语言入门
1.2.1认识PIC单片机C语言
用C语言来开发单片机系统软件最大的好处是编写代码效率高。
软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C语编程在单片机系统设计中已得到越来越广泛的应用。
但在单片机上用C语言写程序和在PC机上写程序绝对不能简单等同。
珊在的PC机资源十分丰富,运算能力强大,因此,程序员在写PC机的应用程序时,几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。
写单片机的C语言程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用性很高的C语程序。
本书围绕PIC中档系统单机来展开讨论的,Microchip公司自己没有针对PIC中档系列单片机的C语言编译器,但很多专业的第三方公司有众多支持PIC单片机的C语言编译器提供,常见的有Hitech、CCS、IAR、Bytecraft等公司。
其中笔者最常用的是Hitech公司的PICC编译器,它稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到广泛认可。
其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。
另外,Hitech公司针对广大PIC的业余爱好者和初学者,还提供了完全免费的学习版PICC-Lite编译器套件。
它的使用方式与完全版相同,只是支持的PIC单片机型号限制在PIC16F84、PIC16F877和PIC16F628等几款。
这几款Flash型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此,笔者建议感兴趣的读者可以从PICC-Lite入手掌握PIC单片机的C语言编程。
我们一起来认识训练项目2——跑马灯的仿真与演示的程序LEDS.C。
1#include"pic.h"
2inta;//定义整型变量a
3voidmain()
4{TRISB=0X00;//定义端口B为输出模式
5while
(1)//while循环语句
6{PORTB=0XFE;//11111110
7for(a=1000;a>0;a--);//for循环语句
8PORTB=0XFD;//11111101
9for(a=1000;a>0;a--);//for循环语句
10PORTB=0XFB;//11111011
11for(a=1000;a>0;a--);//for循环语句
12PORTB=0XF7;//11110111
13for(a=1000;a>0;a--);//for循环语句
14PORTB=0XEF;//11101111
15for(a=1000;a>0;a--);//for循环语句
16PORTB=0XDF;//11011111
17for(a=1000;a>0;a--);//for循环语句
18PORTB=0XBF;//10111111
19for(a=1000;a>0;a--);//for循环语句
20PORTB=0X7F;//01111111
21for(a=1000;a>0;a--);//for循环语句
22}
23}
说明:
第1行:
#include"pic.h"是文件包含语句,表示把语句中指定文件的全部内容复制到此处,与当前的源程序文件链接成一个源文件。
该语句中指定的文件pic.h是Hitech-PICC编译器提供的头文件,保存在“C:
\HT-PIC\include”路径下,该文件包含了对PIC单片机特殊功能寄存器SFR和位名称的定义。
在编写每一个程序时,首先编写的一条语句就是#include"pic.h"。
第2行:
inta。
是定义一个整型变量a,具体什么是整型变量?
有何功能?
请看数据与数据类型号中的介绍。
第3行:
voidmain()。
定义主函数voidmain()。
其是C语言程序中必不可少的主函数,也是程序开始执行的第一个函数。
函数一般分成两个部分,一个部分为函数名:
main,另一个部分为函数体:
从第4行的{到23行的}为止。
第4行:
TRISB=0X00。
是给单片机的B端口方向寄存器赋值,使B端口数据方向为输出方向,具体TRISB寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。
第5行:
while
(1)。
是while()循环语句。
第6行:
PORTB=0XFE。
是给单片机的B端口寄存器赋值,使B端口寄存器为0XFE,具体PORTB寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。
第7行:
for(a=1000;a>0;a--)。
是for循环语句。
第8—21行都与第6、7行相类似,在此就不再重复,int、while、for等C语言知识接下将一一介绍。
1.2.2数据与数据类型
数据是计算机的对象,任何程序设计都要进行数据处理。
具有一定格式的数字或数值称为数据,数据的不同格式称为数据类型。
在C语言中,数据类型可分为:
基本数据类型、构造数据类型、指针类型、空类型四大类,如图1-2-1所示。
图1-2-1C语言的数据类型
在进行PIC单片机程序设计时,支持的数据类型与编译器相关。
Hitech-PICC编译器所支持的数据类型如表1-2-1所示,其遵循Little-endian标准,多字节变量的低字节放在存储空间的低地址,高字节放在高地址。
表1-2-1Hitech-PICC编译器所支持的数据类型
序号
数据类型
名称
长度(位数)
值域
1
位类型
bit
1B
0或1
2
有符号字符型
char
8B
-128~+127
3
无符号字符型
unsignedchar
8B
0~255
4
有符号整型
short
16B
-32768~+32767
5
无符号整型
unsignedshort
16B
0~65535
6
有符号整型
int
16B
-32768~+32767
7
无符号整型
unsignedint
16B
0~65535
8
有符号长整型
long
32B
-2147483648~+2147483647
9
无符号长整型
unsignedlong
32B
0~4294967295
10
浮点型
float
24B
-2147483648~+2147483647
11
双精度浮点型
double
24B或32B
-8388608~+8388607
或
-2147483648~+2147483647
注:
Hitech-PICC编译器缺省认定double型变量为24位长,但可以改变编译选项改成32位长
1.2.3常量与变量
单片机程序中处理的数据有常量和变量两种形式,二者的区别在于:
常量的值在程序执行期间是不能发生变化的,而变量的值在程序执行期间可以发生变化。
1.常量
在程序运行的过程中,其值不能改变的量称为常量。
常量的数据类型有整型、浮点型、字符型和字符串型。
(1)整型常量可以表示为十进制数、十六进制数或八进制数等,例如:
十进制数12、-60等;十六进制数以0x开关,如0x13、0xAB等;八进制数以字母o开关,如o14、o17等。
若要表示长整型,就在数字后面加字母L,如104L、o34L、0Xf340L等。
(2)浮点型常量可以分为十进制表示形式和指数表示形式两种,如0.888、3345.345、123e3、-2.4e-2等。
(3)字符型常量是用单引号括起来的单一字符,如‘a’、‘9’等。
(4)字符串型常量是用双引号括起来的一串字符,如“test”、“ok”等。
字符串是由多个字符连接起来组成的。
2.变量
在程序运行中,其值可以改变的量称为变量。
一个变量主要由两部分构成;一个是变量名,一个是变量值。
每个变量都有一个变量名,在内存中占据一定的存储单元(地址),并在该内存单元中存放该变量的值。
下例为对符号常量和变量进行说明:
1#defineCONST60
2voidmain()
3{intvariable,result;
4variable=20;
5result=variable*CONST;
6}
第1行:
#defineCONST60。
这一行定义了一个符号常量CONST,其值为60。
这样在后面的程序中,凡是出现CONST的地方,都代表常量60。
第2行:
variable和result就是变量。
它们的数据类型为整型(int)。
注意:
符号常量与变量的区别在于,符号变量的值在作用域(本例中为主函数)中,不能改变,也不能用等号赋值,习惯上,总将符号常量名用大写,变量名用小写,以示区别。
(1)变量的定义
变量必须先定义后使用,用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。
变量的定义格式如下:
[存储种类]数据类型[存储器类型]变量名表;
其中,数据类型和变量名表是必须的,存储种类和存储类型是可选项。
存储种类有四种:
auto(自动变量)、extern(外部变量)、static(静态变量)和register(寄存器变量)。
默认类型为auto(自动变量)。
例如:
inta;/*定义a为整型变量*/
intm,n;/*定义m和n为整型变量*/
floatx,y,z;/*定义x,y,z单精度实型变量*/
charch;/*定义ch为字符变量*/
longintt;/*定义t为长整型变量*/
staticintr;/*定义r为静态的整型变量*/
进行变量定义时,应注意以下几点:
①允许在一个数据类型标识符后,说明多外相同类型的变量,各变量名之间用逗号隔开;
②数据类型标识符与变量名之间至少用一个空格隔开;
③最后一个变量名后必须以分号“;”结尾;
④变量说明必须放在变量使用之前,一般放在函数体的开头部分;
⑤在同一个程序中变量不允许重复定义。
例如:
intx,y,z;
inta,b,x;/*变量x被重得定义*/
(2)变量的初始化
在定义变量的同时可以给变量赋初值,称为变量的初始化。
变量初始化的一般格式为:
数据类型标识符变量名1=常量1[,变量名2=常量2,…………,变量名n=常量n];
例如:
intm=3,n=5;/*定义m和n为整型变量,同时m,n分别赋初值3,5*/
floatx=0,y=0,z=0;/*定义x,y,z为单精度实型变量,同时x,y,z都赋初值为0*/
charch=’a’;/*定义ch为字符型变量,同时赋初值字符’a’*/
longinta=1000,b;/*定义a,b为长整型变量,同时a赋初值1000*/
(3)整型变量
整型变量的基本类型符为int,可以根据数值的范围将整型变量定义为基本整型变量、短整型变量或长整型变量。
①基本整型变量用int表示;
②短整型变量用shortint表示(或用short)表示;
③长整型变量用longint表示(或用long)表示。
在计算机(或单片机)中数据是以二进制形式表示的,基本整型变量占用内存2个字节,即16位。
16位中最左边的一位表示符号,该位0,表示正数;该位1,表示负数。
一个基本整型变量的值范围为-215~(215-1),即-32768~32767。
实际应用时注意整型变量的值不能超出范围,否则容易出错,为了充分利用变量表示数据的范围,可以将变量定义为“无符号”类型。
归纳起来,可以使用以下6种整型变量:
带符号基本整型变量[signed]int
无符号基本整型变量unsignedint
带符号短整型变量[signed]shortint
无符号短整型变量unsignedshort[int]
带符号长整型变量[signed]long[int]
无符号长整型变量unsignedlong[int]
如果在定义整型变量时不指定unsigned,则隐含为有符号(signed)。
假设定义两个变量a和b如下:
inta;
usignedintb;
则变量a的取范围为了-32768~32767。
而变量b的取值范围为0~65535。
图1-2-2(a)表示有符号的基本整型变量a的最大值(32767),图1-2-2(b)表示无符号的基本整型变量b的最大值(65535)。
=32767
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
(a)有符号整型变量
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
(b)无符号整型变量
图1-2-2变量a和b的最大值
(4)实型变量
实型数据与整型数据在内定中的存储方式不同,实型数据是按照指数形式存放的,系统把一个实数分成小数和指数两个部分分别进行存放。
指数部分采用规范化的指数形式,例如:
-21.34638在内存中的存放形式如图1-2-3所示。
实型号变量分为单精度(float)、双精度(double)和长双精度(longdouble),但Hitech-PICC编译器只支持单精度(float)和双精度(double)两种,具体规则如表1-2-1所示。
-
.2134638
2
符号小数部分指数
-.21346382
图1-2-3实数在内存中的存放形式
(5)字符型变量
字符型变量用来存放字符常量,注意只能存放一个字符。
例如:
charc1,c2,c3,c4,c5;//定义5个字符变量
c1=’a’;//正确
c2=”a”;//不正确
c3=’abc’;//不正确
c4=’\107’;//正确
c5=’6’;//正确
将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。
例如:
charc1,c2;//定义2个字符变量
c1=’a’;c2=’b’;//给字符变量c1赋值为’a’、c2赋值为’b’
字符’a’的ASCII代码为十进制数97,字符’b’的ASCII代码为十进制数98,在内存中变量c1、c2的实际上是以二进形式存放的。
(6)位变量
bit型位变量只能是全局的或静态的。
PICC将把定位在同一bank内的8个位变量合并成1个字节存放于一个固定地址。
因此,所有针对位变量的操作将直接使用PIC单片机的位操作汇编指令高效实现。
基于此,位变量不能是局部自动型变量,也无法将其组合成复合型号高级变量。
1.2.5运算符和表达式
数据处理是程序的核心部分。
在数据处理中,各种运算又是最主要的部分。
C语言不仅数据类型丰富,而且运算符也十分丰富,几乎所有的操作都可以用运算符来处理。
由运算符加适当的运算对象(常量、变量、函数等)可构成表达式,而表达式是C语言的重要要素之一,因此掌握好运算符的使用对编写程序十分重要。
对于每一个运算符,要注意从两个方面去把握:
运算符的优先级和运算符的结合性。
运算符的优先级指多个运算符用在同一个表达式中时先进行什么运算,后进行什么运算;而运算的结合性是指运算符所需要的数据是从左边开始取还是从右边开始取,因而有所谓“左结合性”和“右结合性”之说。
C语言提供了丰富的运算符,它们能构成多种表达式,处理不同的问题,从而使C语言的运算功能十分强大。
另外C语言的运算符可以分为12类,如表1-2-3所示。
表1-2-3C语言的运算符
运算符名
运算符
算术运算符
+-*/%++--
关系运算符
><==>=<=!
=
逻辑运算符
!
&&||
位运算符
<<>>~&|^
赋值运算符
=
条件运算符
?
:
逗号运算符
指针运算符
*&
求字节数运算符
sizeof
强制类型转换运算符
(类型)
下标运算符
[]
函数调用运算符
()
表达式是由运算符及运算对象组成的、具有特定含义的式子。
C语言是一种表达式语言,表达式后面加上分号“;”就构成了表达式语句。
这里我们主要介绍在Hitech-PICC编程中经常用到的算术运算、赋值运算、关系运算、逻辑运算、位运算、逗号运算及其表达式。
1.运算符的优先级和结合性
学习C语言的运算符,不仅要掌握各种运算符的功能,以及它各自可连接的运算对象个数,而且还要了解各种运算符彼此之间的优先级和结合性,运算符可按其优先级从高到低分为15个等级,如表1-2-4所示。
表1-2-4运算符的优先级和结合性
优先级
运算符
含义
运算量个数
结合性
1
()
[]
->
.
括号运算符
下标运算符
指向结构体成员运算符
成员运算符
自左至右
2
!
~
++--
-
(类型)
*&
sizeof
逻辑非运算符
按位取反运算符
自加、自减运算符
负号运算符
强制类型转换运算符
指针和地址运算符
取长度运算符
单目运算符
右结合
3
*/%
乘、除、求余运算符
双目运算符
自左至右
4
+-
算术加、减运算符
双目运算符
自左至右
5
<<>>
位左移、右移运算符
双目运算符
自左至右
6
<<=>>=
关系运算符
双目运算符
自左至右
7
==!
=
关系运算符
双目运算符
自左至右
8
&
按位与运算符
双目运算符
自左至右
9
^
位异或运算符
双目运算符
自左至右
10
|
位或运算符
双目运算符
自左至右
11
&&
逻辑与运算符
双目运算符
自左至右
12
||
逻辑或运算符
双目运算符
自左至右
13
?
:
条件运算符
三目运算符
右结合
14
=+=-=*=/=%=
<<=>>=&=|=^=
组合算术运算符
组合运算符
双目运算符
右结合
15
逗号运算符
自左至右
(1)优先级
求解表达式时,总是先按运算符的优先次序由高到低进行操作。
优先级是用来标志运算符在表达式中的运算顺序的。
相当于加括号,运算时进行脱括号运算。
(2)结合性
当一个运算对象两侧的运算符优先级相同时,则按运算符的结合性确定表达式的运算顺序。
它分为两类:
一类是运算符的结合性为“从左到右”(大多数运算符是这样的),另一类运算符的结合性为“从右到左”。
例如:
3-5*2,按运算符的优后次先乘后减,表达式的值为了-7;3*5/2,5的两侧是“*”和“/”优先级相同,则按结合性处理,算术运算符的结合性为“从左到右”,则先乘后除,表达式的值为7。
C语言规定了各种运算符的结合方向(结合性),关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。
2.算术运算符与算术表达式
Hitech-PICC中的算术运算符如表1-2-5所示。
表1-2-5算术运算符
运算符
名称
功能
+
加法
求两个数的和,例如8+9=17
-
减法
求两个数的差,例如20-7=13
*
乘法
求两个数的积,例如20*5=100
/
除法
求两个数的商,例如20/5=4
%
取余
求两个数的余数,例如20%9=2
++
自增1
变量自动加1
--
自减1
变量自动减1
在使用上述运算符时,应注意以下几点:
①要注意除法运算符在进行浮点数相除时,其结果为浮点数,如20.0/5所得值为4.0;而进行两个整数相除时,所得值是整数,如7/3,值为2。
②取余运算符(模运算符)“%”要求参与运算的量均为整型,其结果等于两数相除后的余数。
③Hitech-PICC提供的自增运算符“++”和自减运算符“--”,作用是使变量值自动加1或减1。
自增运算和自减运算只能用于变量而不能用于常量表达式,运算符放在变量前和变量后是不同的。
后置运算:
i++(或i--)是先使用i的值,再执行i+1(或i-1)。
前置运算:
++i(或--i)是先执行i+1(或i-1),再使用i的值。
对自增、自减运算的理解和使用是比较容易出错的,应仔细地分析,例如:
inti=100,j;
j=++i;//j=101,i=101
j=i++;//j=101,i=102
j=--i;//j=101,i=101
j=i--;//j=101,i=100
编程时常将“++”、“--”这两个运算符用于循环语句中,使循环变量自动1;也常用于指针变量,使指针自动加1指向下一个地址。
3.赋值运算符与赋值表达式
赋值运算符“=”的作用变是给变量赋值,如“x=10;”。
用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式,在表达式后面加“;”便构成了赋值语句。
赋值勤语句的格式如下。
变量=表达式;
例如:
k=0xff;//将十六进制数FFH赋予变量k
b=c=33;//将33同时赋予变量b和c
d=e;//将变量e的值赋予变量d
f=a+b;//将表达式a+b的值赋予变量f
由此可见,赋值表达式的功能是计算表达式的值再赋予左边的变量。
赋值运算符具有右结合性,因此有下面的语句:
a=b=c=5;
可以理解为:
a=(b=(c=5));
按照C语言的规定上,任何表达式在其末尾加上分号就构成语句。
因此“x=8;”和“a=b=c=5;”都是赋值语句。
如果赋值运算符两过的数据类型号不相同,系统将自动进行类型转换,即把赋值右边的类型换成左边的类型。
具体规定如下:
1实型赋给整型,舍去小数部分。
②整型赋给实型,数值不变,但将以浮点开式存放,即增加小数部分(小数部分的值为0)。
③字符型赋给整型,由于字符型为1字节,而整型2字节,故将字符ASCII码值放到整型量的低8位中,高8位为0。
④整型赋给字符型,只把低8位赋给字符量。
图1-2-4表示了各数据类型自动转换的规则。
低
int
unsigned
long
double
unsignedlong
shor、char
float
高
图1-2-4各种数据类型的高低顺序
在C语言程序设计中,经常使用复合赋值运算符对变量进行赋值。
复合赋值运算符就是在赋值符“=”之前加上其他运算符,表1-2-4中优先级14就是复合赋值运算符。
构成复合赋值表达式的一般形式为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 语言 学习 进步 基础 入门 实例