PIC单片机C语言入门实例.docx
- 文档编号:9623202
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:35
- 大小:154.19KB
PIC单片机C语言入门实例.docx
《PIC单片机C语言入门实例.docx》由会员分享,可在线阅读,更多相关《PIC单片机C语言入门实例.docx(35页珍藏版)》请在冰点文库上搜索。
PIC单片机C语言入门实例
标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]
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——跑马灯的仿真与演示的程序。
1#include""
2inta;7F1.2.21-2-11-2-11-2-11-2-1
1.2.31-2-2
表示数据的最高位
=65535
1-2-21-2-3
134638
2
图1-2-3实数在内存中的存放形式
(5)字符型变量
字符型变量用来存放字符常量,注意只能存放一个字符。
例如:
charc1,c2,c3,c4,c5;1.2.51-2-31-2-3
1-2-41-2-4
括号运算符
下标运算符
指向结构体成员运算符
成员运算符
自左至右
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
在使用上述运算符时,应注意以下几点:
①要注意除法运算符在进行浮点数相除时,其结果为浮点数,如5所得值为;而进行两个整数相除时,所得值是整数,如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表示了各数据类型自动转换的规则。
图1-2-4各种数据类型的高低顺序
在C语言程序设计中,经常使用复合赋值运算符对变量进行赋值。
复合赋值运算符就是在赋值符“=”之前加上其他运算符,表1-2-4中优先级14就是复合赋值运算符。
构成复合赋值表达式的一般形式为:
变量双目运算符=表达式;
它等效于:
变量=变量运算符表达式;
例如:
a+=5;//相当于a=a+5;
x*=y+7;//相当于x=x*(y+7);
r%=p;//相当于r=r%p;
在程序中使用复合赋值运算符,可以简化程序,有利于编译处理,提高编译效率并产生质量较高的目标代码。
4.关系运算符与赋值表达式
在前面介绍过的分支选择程序结构中,经常需要比较两个变量的大小关系,以决定程序下一步的操作。
比较两个数据量的运算符称为关系运算符。
C语言提供了6种关系运算符:
①大于运算符:
>;
②大于等于运算符:
>=;
③小于运算符:
<;
④小于等于运算符:
<=;
⑤等于运算符:
==;
⑥不等于运算符:
!
=;
在关系运算符中,<、<=、>、>=的优先级相同,==和!
=优先级相同;前者优先级高于后者。
例如:
“a==b>c;”应理解为“a==(b>c);”。
关系运算符优先级低于算术运算符,高于赋值运算符。
例如:
“a+b>c+d;”应理解为“(a+b)>(c+d);”。
关系表达式是用关系运算符连接的两个表达式。
它绵一般形式为:
表达式关系运算符表达式
关系表达式的值只有0和1两种,即逻辑的“真”与“假”。
当指定的条件满足时,结果为1,不满足时结果为0。
例如表达式“5>0;”的值为“真”,即结果为1;而表达式“(a=3)>(b=5);”由于3>5不成立,故其值为“假”,即结果为0。
a+b>c//若a=1,b=2,c=3,则表达式的值为0(假)
a>3/2//若x=2,则表达式的值为1(真)
c==5//若c=1,则表达式的值为0(假)
5.关系运算符与赋值表达式
C语言中提供了三种逻辑运算符,一般形式有以下三种。
①逻辑与运算符:
&&;
②逻辑或运算符:
||;
③逻辑非运算符:
!
;
逻辑表达式的一般形式有以下三种。
逻辑与:
条件式1&&条件式2
逻辑或:
条件式1||条件式2
逻辑非:
!
条件式
“&&”和“||”是双目运算符,要求有两个运算对象,结合方向是从左到右。
“!
”是单目运算符,只要求一个运算对象,结合方向是从右至左。
(1)逻辑与:
a&&b,当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。
(2)逻辑或:
a||b,当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。
(3)逻辑非:
!
a,当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。
表1-2-6给出了执行逻辑运算的结果
条件1
条件2
逻辑运算
a
b
!
a
a&&b
a||b
1
1
0
1
1
1
0
0
0
1
0
1
1
0
1
0
0
1
0
0
表1-2-6执行逻辑运算的结果
例如:
设x=3,则(x>0)&&(x<6)的值为“真”(即为“1”),而(x<0)&&(x>6)的值为“假”(即为“0”),!
x的值为“假”。
逻辑运算符“!
”的优先级最高,其次为“&&”,最低为“||”。
具体请读者见表1-2-4运算符的优先级和结合性。
6.位运算符与位运算表达式
在PIC系列单片机应用系统设计中,对I/O端口的操作是非常频繁的,因此往往要求程序在位(bit)一级进行运算或处理,因此,汇编语言具有强大灵活的位处理能力。
Hitech-PICC语言直接面对:
PIC系列单片机硬件,也提供了强大灵活的位运算功能,使得c语言也能像汇编语言一样对硬件直接进行操作。
Hitech-PICC提供了6种位运算符:
①按位与运算符:
&;
②按位或运算符:
|;
③按位异或运算符:
^;
④按位取反运算符:
~;
⑤右移运算符:
>>;
⑥左移运算符:
<<;
位运算符的作用是按二进制位对变量进行运算,表1-2-7是位运算符的真值表。
表1-2-7位运算符的真值表
条件1
条件2
逻辑运算
a
b
!
a
a&&b
a||b
1
1
0
1
1
1
0
0
0
1
0
1
1
0
1
0
0
1
0
0
位变量1
位变量2
位运算
a
b
~a
~b
a&b
a|b
a^b
0
0
1
1
0
0
0
0
1
1
0
0
1
1
1
0
0
1
0
1
1
1
1
0
0
1
1
0
左移运算符“<<”的功能,是把“<<”左边的操作数的各二进制位全部左移若干位,移
动的位数由“<<”右边的常数指定,高位丢弃,低位补O。
例如:
“a<<4”是指把a的各二进制位向左移动4位。
如a=000000llB(十进制数3),左移4位后为00110000B(十进制数48)。
右移运算符“>>”的功能,是把“>>”左边的操作数的各二进制位全部右移若干位,移
动的位数由“>>”右边的常数指定。
进行右移运算时,如果是无符号数,则总是在其左端补
“0”;对于有符号数,在右移时,符号位将随同移动。
当为正数时,最高位补O,而为负数
时,符号位为1,最高位是补0还是补1取决于编译系统的规定。
例如:
设a=Ox98,如果a
为无符号数,则“a>>2”表示把B右移为001001lOB;如果a为有符号数,则“a>>2’’
表示把B右移为11100110B。
在使用位运算符时,有如下技巧:
按位与运算通常用来对某些位清零或保留某些位。
例如,要保留从PORTB端口的RB0和RB1读入的两位数据,可以执行"control=PORTB&0x03;"操作(0x03的二进制数为00000011B);而要清除PORTB端口的RB4~RB7为0,可以执行“PORTB=PORTB&OxOf;”操作(0x0f的二进制数为00001111B。
同样,按位或运算经常用于把指定位置1、其余位不变的操作。
流水灯控制程序就是采用移位运算来实现的发光二极管点亮位置的移动。
用位运算符“|”改写的流水灯控制程序如下。
1#include""
2inta;//定义整型变量a
3voidmain()
4{TRISB=0X00;//定义端口B为输出模式
5while
(1)//while循环语句
6{PORTB=PORTB|0XFE;//11111110
7for(a=1000;a>0;a--);//for循环语句
8PORTB=PORTB|0XFD;//11111101
9for(a=1000;a>0;a--);//for循环语句
10PORTB=PORTB|0XFB;//11111011
11for(a=1000;a>0;a--);//for循环语句
12PORTB=PORTB|0XF7;//11110111
13for(a=1000;a>0;a--);//for循环语句
14PORTB=PORTB|0XEF;//11101111
15for(a=1000;a>0;a--);//for循环语句
16PORTB=PORTB|0XDF;//11011111
17for(a=1000;a>0;a--);//for循环语句
18PORTB=PORTB|0XBF;//10111111
19for(a=1000;a>0;a--);//for循环语句
20PORTB=PORTB|0X7F;//01111111
21for(a=1000;a>0;a--);//for循环语句
22}
23}
分析上面程序可知,该程序实现的流水灯效果。
7.逗号运算符与逗号运算表达式
在c语言中逗号“,”也是一种运算符,称为逗号运算符,其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式,其一般形式为:
表达式1,表达式2,………,表达式n
逗号表达式的求值过程是:
从左军右分别求出各个表达式的值,并以最右边的表达式n
的值作为整个逗号表达式的值。
程序中使用逗号表达式的目的,通常是要分别求逗号表达式内各表达式的值,并不一定
要求整个逗号表达式的值。
例如:
x=(y=10,y+5);
上面括号内的逗号表达式,逗号左边的表达式是将10赋给y,逗号右边的表达式进行
y+5的计算,逗号表达式的结果是最右边的表达式“y+5”的结果15赋给x。
并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明、函数参数表中的逗号
只是用做各变量之间的间隔符,例如:
unsignedinti,j;
1.2.6基本语句
C语言程序的执行部分由语句组成。
C语言提供了丰富的程序控制语句,按照结构化程序设计的基本结构:
顺序结构、选择结构和循环结构,组成各种复杂程序。
这些语句主要包括表达式语句、复合语句、选择语句和循环语句等。
1.表达式语句
表达式语句是最基本的C语言语句。
表达式语句由表达式加上分号“;”组成,其一般形式如下:
表达式;
执行表达式语句就是计算表达式的值。
例如:
PORTB=0XFD;//赋值语句,在程序中将端口B赋值为0XFD
x=y+z;//y和z进行加法运算后赋值给变量x
i++;//自增1语句,i增加1后,再赋给变量i
在C语言中有一个特殊的表达式语句,称为空语句。
空语句中只有一个分号“;”,程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。
在程序中常常把空语句作为循环体,用于消耗CPU时间等待事件发生的场合。
例如,在函数中,有下面语句:
for(a=1000;a>0;a--);//for循环语句
上面的for语句后面的“;”是一条空语句,作为循环体出现。
在使用“;”时的小技巧:
①表达式是由运算及运算对象所组成的、具有特定含义的式子,例如“y+z”。
C语言是一种表达式语言,表达式后面加上分号“;”就构成了表达语句,例如“y+z”。
C语言中的表达式与表达式语句的区别就是前者没有分号“;”,而后者有“;”。
②在while或for构成的循环语句后面加一个分号,构成一个不执行其他操作的空循环体。
例如:
While
(1);
上面语句循环条件永远为真,是无限循环;循环体为空,什么也不做。
程序设计时,通常把该语句作为停机语句使用。
2.复合语句
把多个语句用大括号{}括起来,组合在一起形成具有一定功能的模块,这种由若干条语句组合而成的语句称为复合语句。
在程序中应把复合语句看在是单条语句,而不是多条语句。
复合语句在程序运行时,{}中的各行单语句是依次顺序执行的。
在C语言的函数中,函数体是一个复合语句,例如程序的主函数中包含两个复合语句:
voidmain()
{TRISB=0X00;//定义端口B为输出模式
while
(1)//while循环语句
{PORTB=PORTB|0XFE;//11111110
for(a=1000;a>0;a--);//for循环语句
PORTB=PORTB|0XFD;//11111101
…
…
PORTB=PORTB|0X7F;//01111111
for(a=1000;a>0;a--);//for循环语句
}
}
在上面的这段程序中,组成函数体的复合语句内还嵌套了组成while()循环体的复合语句。
复合语句允许嵌套,也就是在{}中的{}也是复合语句。
复合语句内的各条语句都必须以分号“;”结尾,复合语句之间有{}分隔,在括号“}”外,不能家分号。
复合语句不仅可由可执行语句组成,还可由变量定义语句组成。
在复合语句中所定义的变量,称为局部变量,它的有效范围只在复合语句中。
函数体是复合语句,所以函数体内定义的变量,,其有效范围也只在函数内部。
前面的main()函数体内定义的位变量left和right的有效使用范围局限在main()函数内部,与其他函数无关。
3.选择语句
跑马灯的C程序可以用以下程序代码来实现,即跑马灯先从上到下循环进行。
#include""
unsignedchartemp=0x01;
/**************************************************************************
**function:
main()
**功能描述:
主函数
**************************************************************************/
voidmain()
{INTCON=0X00;//设置INTCON的bit7~bit0为零:
关总中断
TRISB=0X00;//设置端口B为输出方式
PORTB=0Xff;//使端口B输出低电平
while
(1)
{PORTB=~temp;//按位取反
for(a=1000;a>0;a--);//for循环语句,起延时作用
if(temp==0x00)//判断变量temp是否等0x00
temp=0x01;//if语句成立,给变量temp赋0x01
else//if语句不成立
temp=temp<<1;//变量temp左移1位
}
}
我们看到,在上述程序中使用了如下if语句:
if(temp==0x00)//判断变量temp是否等0x00
temp=0x01;//if语句成立,给变量temp赋0x01
else//if语句不成立
temp=temp<<1;//变量temp左移1位
执行这些语句时,先判断“temp==0x00”是否成立,如果条件满足,则执行“temp=0x01;”后,回到“PORTB=~temp;”语句,执行该条语句,temp变量按位取反之后,变为0xFE(即B),则PORTB为0xFE(即RB0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 语言 入门 实例