第1章单片机C语言概述.ppt_第1页
第1章单片机C语言概述.ppt_第2页
第1章单片机C语言概述.ppt_第3页
第1章单片机C语言概述.ppt_第4页
第1章单片机C语言概述.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,单片机的C语言程序设计与应用 (第2版) 电子工业出版社,前言:,1.为什么开这门课? 2.学好这门课需要的基础知识? 3.怎样掌握这门课? 4.课程内容。 5.要求。,1.为什么开这门课?,(1)专业的需要 电气工程及其自动化、电子技术 不需要人的干预自动工作、仪表的智能化 (2)工作的需要 自动化产品、仪器仪表,2.需要的基础知识?,单片机硬件基础、C语言基础 3.怎样掌握这门课? 程序设计=算法+语言 (1)重点:算法-框图 (2)兴趣,4.课程内容,(1)概述 (2)软件工具 (3)C语言基础 (4)中断、定时器/计数器、串行口的C语言编程基础 (5)键盘/显示、模拟量的C语言编程基

2、础,5.要求,自觉学习 快乐学习 认真学习,第1章 单片机的C语言概述,11 C语言与单片机编程 12 C51程序 13 C51编程举例,11 C语言与单片机编程,一、单片机的C语言的特点 二、单片机的C语言与标准C语言的比较 三、单片机的C语言与汇编语言的比较 例子:,【例1-1】将外部数据存储器的000BH和000CH单元的内容相互交换,ORG 0000H MOVDPTR, #000BH MOVXA, DPTR MOVR7, A INCDPTR MOVXA, DPTR MOVDPTR, #000BH MOVXDPTR, A INC DPTR MOVA, R7 MOVXDPTR, A SJM

3、P $ END,C语言编程:,#include void main(void) char c; c=XBYTE11; XBYTE11=XBYTE12; XBYTE12=c; while(1); ,上述的C语言反汇编:,0 x0000 020013 LJMP STARTUP1(C:0013);跳转 0 x0003 90000B MOV DPTR, #0 x000B 0 x0006 E0 MOVX A, DPTR 0 x0007 FF MOV R7, A 0 x0008 A3 INC DPTR 0 x0009 E0 MOVX A, DPTR 0 x000A 90000B MOV DPTR, #0

4、x000B 0 x000D F0 MOVX DPTR, A 0 x000E A3 INC DPTR 0 x000F EF MOV A, R7 0 x0010 F0 MOVX DPTR, A 0 x0011 80FE SJMP C:0011 0 x0013 787F MOV R0, #0 x7F;以下是清零部分 0 x0015 E4 CLR A 0 x0016 F6 MOV R0,A 0 x0017 D8FD DJNZ R0,IDATALOOP(C:0016) 0 x0019 758107 MOV SP(0 x81),#0 x07 0 x001C 020003 LJMP main(C:0003)

5、,【例1-2】二进制数转换成十进制数(BCD码),将累加器A中给定的二进制数,转换成3个十进制数(BCD码),并存入Result开始的3个单元。,汇编语言源程序如下:,Result EQU 20H ORG 0000H LJMP START START: MOV SP, #60H;主程序 MOV A, #123 LCALL BINTOBCD SJMP $ BINTOBCD: MOV B, #100 ;设置转换子程序 DIV AB MOV Result,A;除以100得百位数 MOV A, B MOV B, #10 DIV AB MOV Result+1, A;余数除以10得十位数 MOV Res

6、ult+2, B;余数为个位数 RET END,C51源程序如下:,void main(void) unsigned char Result3; unsigned char Number; Number=123; Result0=Number/100;/除以100得百位 Result1=(Number%100)/10;/余数除以10得十位 Result2=Number%10;/余数为个位 while(1);/等待暂停 ,【例1-3】二进制数转换成ASCII码程序。,将累加器A中的内容分为两个ASCII码,并存入Result开始的两个单元。,汇编语言源程序如下:,Result EQU20H OR

7、G 0000H LJMP START START: MOV SP, #40H MOV A, #00011010B LCALL BINTOHEX SJMP $ BINTOHEX: MOV DPTR, #ASCIITAB MOV B, A SWAP A ANL A, #0FH;取A的高4位 MOVC A, A+DPTR MOV Result, A MOV A, B ANL A, #0FH;取A的低4位 MOVC A, A+DPTR MOV Result+1, A RET ASCIITAB: DB 0123456789ABCDEF END,C51源程序如下:,code unsigned char A

8、SCIITAB16=0123456789ABCDEF; void main(void) unsigned char Result2; unsigned char Number; Number=0 x1a; Result0=ASCIITABNumber/16;/高4位 Result1=ASCIITABNumber ,12 C51程序,本节主要介绍C51程序的结构、规范、注意事项、标识符、关键字等。 一、C51的程序结构 二、C51编程规范及注意事项 三、C51的标识符与关键字,一、C51的程序结构,#include #include void Function1(void); unsigned

9、int ch; void main(void) SCON=0 x50; TMOD=0 x20; TH1=221; TR1=1; TI=1; /以上是串口调试需要 while(ch=5) Function1( ); printf(char=%dn,ch); while(1); void Function1(void) unsigned char ps; ps=1; ch=ch+ps; ,从上面的例子可以看出:,一个典型的C51源程序包含预处理命令、自定义函数声明、main主函数和自定义函数。这几部分完全类似于C语言的程序结构。 预处理命令部分常用#include命令来包含一些程序中用到的头文件。

10、这些头文件中包含了一些库函数以及其他函数的声明及定义。 自定义函数声明部分用来声明源程序中自定义的函数。,main()主函数是整个C51程序的入口。不论main()函数位于程序代码中的哪个位置,C51程序总是从main()函数开始执行的。 自定义函数部分是C51源程序中用到的自定义函数的函数体。 除了扩展名为“.c”的源程序文件,C51程序还支持扩展名为“.h”的头文件以及扩展名为“.lib”的库文件等。,在一般的编译系统中,通常以项目(工程)结构来管理复杂的C51程序文件。例如Keil Vision2编译环境中,整个项目结构如图1-1所示。 在这里整个项目由项目文件管理、项目文件扩展名为“.

11、Uv2”。整个工程项目中可以包含如下几类文件。,头文件用来包含一些库函数,系统变量声明以及将不同的C文件连接起来。 C源文件是C51程序的主要部分,用来实现特定的功能。C源文件可以有一个,也可以按照不同的功能分成多个,但所有这些C源文件中有且仅有一个可以包含一个main( )主函数。 库文件是实现特定功能的函数库,供C源文件调用。 编译中间文件是源程序在编译链接过程中生成的中间文件,其中包含了文件编译调试的信息。 可烧录文件是编译系统生成的可以烧录到单片机内部供执行的文件,类似于“exe”可执行文件。在C51语言中,一般扩展名为“.hex”或者“.bin”等。,二、C51编程规范及注意事项,1

12、注释 注释语句只对代码起到功能描述的作用,在实际的编程链接过程中不起作用。在C51语言中可以通过两种方式不是表示注释内容。 (1)用“/”开头来注释一行 如“/变量声明”。 (2)用“/*”符号开头,并以“*/”符号结束 如用“/*声明整型变量ch*/”。本方法灵活多变,可以注释多行printf(“ch=%dn”,/*整型变量ch*/ch); 一个好的C51源程序应该添加必要的注释内容。,2命名,在进行程序设计时,经常需要自定义一些函数或变量。一般来说,重要符合C51命名规范即可通过编译。但是,为了便于源程序的理解和交流,在进行命名时应注意以下几点: 自定义函数或者变量的名称最好能反映该函数或

13、变量的功能用途。因此,需要选用有意义的单词或者字母组合来表示。例如MAX表示最大值、MIN表示最小值等。 变量名通常加上表示数据类型的前缀,例如“ucSendData”的前缀“uc”表示unsigned char。 在命名时不要和系统保留的标识符以及关键字产生冲突或者歧义。,3格式,为了程序阅读方便,在进行C51程序设计时,在程序结构以及语句书写格式方面应注意以下几点: 虽然C51语言对main( )函数放置位置没有限定,但为了程序阅读的方便,最好把它放置在所有自定义函数的前面,即依次为头文件声明、自定义函数以及全局变量声明、main( )函数、自定义函数。 C51语句可以写在一行上也可以写在

14、多行上。为了程序理解的方便,最好将每个语句单独写在一行,并加以注释。有时某几个相连的语句或者共同执行某个功能则可以放置在一行。 对于源程序文件不同结构部分之间要留有空行。例如,头文件声明、自定义函数声明、main( )函数以及自定义函数之间均要空一行,来明显区分不同结构。 对于if、while等块结构语句中的“”和“”要配对对齐,以便于程序阅读时能够理解该结构的起始和结束。 源代码安排时可以通过适当的空格以及Tab键来实现代码对齐。,三、C51的标识符与关键字,1标识符 标识符常用来声明某个对象的名称,如变量和常量的声明、数组和结构的声明、自定义函数的声明以及数据类型的声明等。示例如下。 in

15、t count; void Function1( ); 在上面的例子中,count为整型变量的标识符,Function1为自定义函数的标识符。 在C51语言中,标识符可以由字母、数字(09)或者下划线“_”组成,最多可支持32个字符。C51标识符的第一个字符必须或者下划线“_”,例如“unt”、“ch_1”等都是正确的,而“5count”则是错误的标识符。另外,C51的标识符区分大小写,例如“count”和“COUNT”代表两个不同的标识符,,使用标识符时应注意以下几点:,在命名C51标识符时,需要能够清楚地表达其功能含义,这样有助于阅读和理解源程序。 C51的标识符原则上可以使用下画线开头,

16、但有些编译系统的专用标识符或者预定义项是以下划线开头的。为了程序的兼容性和可移植性,所以建议一般不使用下划线开头来命名标识符。 尽量不要使用过长的标识符,以便于使用和程序理解方便。 自定义的C51标识符不能使用C51语言保留的关键字,也不能和用户已使用的函数名或C51库函数透明。例如“char”是关键字,所以不能作为标识符使用。,13 C51编程举例,【例1-5】PROTEUS仿真电路如图所示,8个发光二极管D1D8经限流电阻分别接至P1口8个引脚,阳极共同接高电平。编程实现发光二极管的流水点亮,即按照D1D2D8的顺序,每次点亮一个发光二极管,一段时间后熄灭该发光二极管,然后点亮下一个发光二

17、极管,重复循环。,C51源程序如下:,#include #include /移位库函数包含于此头文件中 void delay(unsigned int d) /定义延时子函数 while(-d0); void main( ) unsigned char i,sel; while(1) sel=0 xfe; for(i=0;i8;i+) P1=sel; /显示变量赋给P1口 delay(50000); /延时 sel=_crol_(sel,1);/改变显示变量 ,也可以这样编程:,#include void delay(unsigned int d) while(-d0); void main(

18、 ) unsigned char i,sel,a; while(1) sel=0 xfe; for(i=0;i8;i+) P1=sel; delay(50000); a=sel1; sel=sel|0 x01; ,【例1-6】单片机的P1口接8个发光二极管,P0口接8个开关,编程实现当开关动作时,对应的发光二极管亮或灭。,汇编语言源程序如下: ORG 0000H MOV P0,#0FFH LOOP:MOV A,P0 MOV P1,A SJMP LOOP,C51语言源程序如下:,#include void main(void) unsigned char i; P0=0 xff; for(;)

19、i=P0; P1=i; ,【例1-7】单片机外接12MHz晶振,用P1.7输出1kHz和500Hz的音频信号驱动扬声器,作为报警信号,要求1kHz信号与500Hz信号交替进行,P1.0接一开关S进行控制,当开关合上响报警信号,当开关断开报警信号停止,C51源程序如下:,#include #include /空操作库函数包含于此头文件 sbit S=P10; /定义位变量 sbit BUZ=P17; /定义位变量 unsigned char k; /定义循环变量 void delay(void) /定义延时子函数 unsigned char i; for(i=250;i0;i-) _nop_( ); /空操作 ,void main(void) while(1) BUZ=0;/关闭声音 S=1; if(P1_0=0) /判断开关是否闭合 BUZ=0;delay( ); BUZ=0;delay( ); BUZ=1;delay( );d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论