1、PIC单片机C语言入门实例 C语言入门PIC单片机1.2.1 认识PIC单片机C语言 用C语言来开发单片机系统软件最大的好处是编写代码效率高。软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C语编程在单片机系统设计中已得到越来越广泛的应用。 但在单片机上用C语言写程序和在PC机上写程序绝对不能简单等同。珊在的PC机资源十分丰富,运算能力强大,因此,程序员在写PC机的应用程序时,几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。写单片机的C语言程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有
2、对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用性很高的C语程序。 本书围绕PIC中档系统单机来展开讨论的,Microchip公司自己没有针对PIC中档系列单片机的C语言编译器,但很多专业的第三方公司有众多支持PIC单片机的C语言编译器提供,常见的有Hitech、CCS、IAR、Bytecraft等公司。其中笔者最常用的是Hitech公司的PICC编译器,它稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到广泛认可。其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。另外,Hitech公司针对广大PIC的业余爱好者和初学
3、者,还提供了完全免费的学习版PICC-Lite编译器套件。它的使用方式与完全版相同,只是支持的PIC单片机型号限制在PIC16F84、PIC16F877和PIC16F628等几款。这几款Flash型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此,笔者建议感兴趣的读者可以从PICC-Lite入手掌握PIC单片机的C语言编程。 我们一起来认识训练项目2跑马灯的仿真与演示的程序LEDS.C。 1 椣据畬敤灜捩栮 2 int a; /定义整型变量a 3 void main( ) 4 TRISB=0X00; /定义端口B为输出模式 5 while(1) /while循环语句 6 POR
4、TB=0XFE; /1111 1110 7 for(a=1000;a0;a-); /for循环语句 8 PORTB=0XFD; /1111 1101 9 for(a=1000;a0;a-); /for循环语句 10 PORTB=0XFB; /1111 1011 11 for(a=1000;a0;a-); /for循环语句 12 PORTB=0XF7; /1111 0111 13 for(a=1000;a0;a-); /for循环语句 14 PORTB=0XEF; /1110 1111 15 for(a=1000;a0;a-); /for循环语句 16 PORTB=0XDF; /1101 111
5、1 17 for(a=1000;a0;a-); /for循环语句 18 PORTB=0XBF; /1011 1111 19 for(a=1000;a0;a-); /for循环语句 20 PORTB=0X7F; /0111 1111 21 for(a=1000;a0;a-); /for循环语句 22 23 说明: 第1行:椣据畬敤灜捩栮是文件包含语句,表示把语句中指定文件的全部内容复制到此处,与当前的源程序文件链接成一个源文件。该语句中指定的文件pic.h是Hitech-PICC编译器提供的头文件,保存在“C:HT-PICinclude”路径下,该文件包含了对PIC单片机特殊功能寄存器SFR和位
6、名称的定义。在编写每一个程序时,首先编写的一条语句就是椣据畬敤灜捩栮。 第2行:int a。是定义一个整型变量a,具体什么是整型变量?有何功能?请看数据与数据类型号中的介绍。 第3行:void main( )。定义主函数void main( )。其是C语言程序中必不可少的主函数,也是程序开始执行的第一个函数。函数一般分成两个部分,一个部分为函数名:main,另一个部分为函数体:从第4行的到23行的为止。 端口数据方向为输B端口方向寄存器赋值,使B。是给单片机的TRISB=0X00行:4第接口及其应用。单片机寄存器功能请查看【知识链接3】PICI/O出方向,具体TRISB 循环语句。5行:whi
7、le(1)。是while( ) 第 ,具端口寄存器赋值,使B端口寄存器为0XFE。是给单片机的第6行:PORTB=0XFEB接口及其应用。】PIC单片机I/O体PORTB寄存器功能请查看【知识链接3 循环语句。forfor(a=1000;a0;a-)。是第7行: 语言知识等C7、行相类似,在此就不再重复,int 、while、for第821行都与第6接下将一一介绍。 1.2.2 数据与数据类型数据是计算机的对象,任何程序设计都要进行数据处理。具有一定格式的数字或数值称为数据,数据的不同格式称为数据类型。 语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型四在C型整所示。大类,
8、如图1-2-1 型度单精点浮型(实基本类型 度型精双语言的数据类型图1-2-1 C 字符型枚举类型号在进行PIC单片机程序设计时, 支持的数据类型与编译器相关。Hitech-PICC编译器所数组类型 Little-endian标准,多字节变量的低字节放在支持的数据类型如表1-2-1所示,其遵循构造类型数据类型 结构体类型存储空间的低地址,高字节放在高地址。 共用体类型指针类型 表1-2-1 Hitech-PICC编译器所支持的数据类型 空类型(void) 序数据类型 名称 长度(位数) 值 域 号 1 位类型 bit 1B 0或1 2 有符号字符型 char 8B -128 +127 3 无符
9、号字符型 unsigned char 8B 0 255 4 有符号整型 short 16B -32768 +32767 5 无符号整型 unsigned short 16B 0 65535 6 有符号整型 int 16B -32768 +32767 7 无符号整型 unsigned int 16B 0 65535 8 有符号长整型 long 32B -2 147 483 648 +2 147 483 647 9 无符号长整型 unsigned long 32B 0 4294 967 295 10 浮点型 float 24B -2 147 483 648 +2 147 483 647 11 双精
10、度浮点double 24B或32B -8 388 608 +8 388 607 位运算符 & | 赋值运算符= 条件运算符? : 逗号运算符, 指针运算符* & 求字节数运算符sizeof 强制类型转换运算符(类型) 下标运算符 函数调用运算符( ) 型 -算术运算符关系运算符逻辑运算符.2134638 + - * / % + - = . 括号运算符 下标运算符 指向结构体成员运算符 成员运算符 自左至右 2 ! + - - (类型) * & sizeof 逻辑非运算符 按位取反运算符 自加、自减运算符 负号运算符 强制类型转换运算符 指针和地址运算符 单目运算符 右结合 取长度运算符 3 *
11、 / % 乘、除、求余运算符 双目运算符 自左至右 4 + - 算术加、减运算符 双目运算符 自左至右 5 位左移、右移运算符 双目运算符 自左至右 6 = 关系运算符 双目运算符 自左至右 7 = != 关系运算符 双目运算符 自左至右 8 & 按位与运算符 双目运算符 自左至右 9 位异或运算符 双目运算符 自左至右 10 | 位或运算符 双目运算符 自左至右 11 & 逻辑与运算符 双目运算符 自左至右 12 | 逻辑或运算符 双目运算符 自左至右 13 ?: 条件运算符 三目运算符 右结合 14 = += -= *= /= %= = &= |= 组合算术运算符 组合运算符 双目运算符
12、右结合 20*5=100 /除法求两个数的商,例如20/5=4 求两个数的余数,例如%取余 20%9=2 +自增1变量自动加1 -自减1变量自动减1 11110 10100 11100 00001 11101 是按二进制位对位运算符的作用10001 1-2-7 算,表10101 位运算符00001 位变位变位 运 算 21量量 ababa&ba|bab 0011000 0110011 1001011 1100110 = - 条件条件减法 1条件2 21条件 求两个数的差,例如20-7=13 逻辑运算 逻辑运算 15 , * a 右移运算符:a 左移运算符:逗号运算符 乘法 b!a b!a 求两
13、个数的积,例如a|ba&b a|ba&b 自左至右 (1)优先级 求解表达式时,总是先按运算符的优先次序由高到低进行操作。优先级是用来标志运算符在表达式中的运算顺序的。相当于加括号,运算时进行脱括号运算。 (2)结合性 当一个运算对象两侧的运算符优先级相同时,则按运算符的结合性确定表达式的运算顺序。它分为两类: 一类是运算符的结合性为“从左到右”(大多数运算符是这样的),另一类运算符的结合性为“从右到左”。例如:3-5*2,按运算符的优后次先乘后减,表达式的值为了-7;3*5/2,5的两侧是“*”和“/”优先级相同,则按结合性处理,算术运算符的结合性为“从左到右”,则先乘后除,表达式的值为7。
14、C语言规定了各种运算符的结合方向(结合性),关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。 2算术运算符与算术表达式 Hitech-PICC中的算术运算符如表1-2-5所示。 表1-2-5 算术运算符 运算符名称功能 + 加法 求两个数的和,例如8+9=17 在使用上述运算符时,应注意以下几点: 要注意除法运算符在进行浮点数相除时,其结果为浮点数,如20.0/5所得值为4.0;而进行两个整数相除时,所得值是整数,如7/3,值为2。 取余运算符(模运算符)“%”要求参与运算的量均为整型,其结果等于两数相除后的余数。 Hitech-PICC提供的自增运算符“+”和自减运算符“-”
15、,作用是使变量值自动加1或减1。自增运算和自减运算只能用于变量而不能用于常量表达式,运算符放在变量前和变量后是不同的。 后置运算:i+(或i-)是先使用i的值,再执行i+1(或i-1)。 前置运算:+i(或-i)是先执行i+1(或i-1),再使用i的值。 对自增、自减运算的理解和使用是比较容易出错的,应仔细地分析,例如: int i=100,j; /j=101,i=101j=+i; /j=101,i=102 j=i+; /j=101,i=101 j=-i; /j=101,i=100 j=i-; ;也常用于”这两个运算符用于循环语句中,使循环变量自动1+”、“-编程时常将“指向下一个地址。1指针
16、变量,使指针自动加 赋值运算符与赋值表达式3 。用赋值运算符将一个变量与一;”赋值运算符“=”的作用变是给变量赋值,如“x=10”便构成了赋值语句。赋 的式子称为赋值表达式,在表达式后面加“;个表达式连接起来值勤语句的格式如下。 表达式; = 变量 例如: k=0xff; /将十六进制数FFH赋予变量k b=c=33; /将33同时赋予变量b和c d=e; /将变量e的值赋予变量d fa+b的值赋予变量f=a+b; /将表达式 由此可见,赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性,因此有下面的语句: a=b=c=5; 可以理解为: a=(b=(c=5); ”和x=8;C语言的规定上,任何表达式在其末尾加上分号就构成语句。因此“按照”都是赋值语句。“a=b=c=5; 如果赋值运算符两过的数据类型号不相同,系统将自动进行类型转换,即把赋值右边的类型换成左边的类型。具体规定如下: 实型赋给整型,舍去小数部分。 整型赋给实型,数值不变,但将以浮点开式存放,即增加小数部分(小数部分
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1