【文档说明】第6789次课第3章C51语言编程基础课件.ppt,共(106)页,1.083 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44651.html
以下为本文档部分文字说明:
第6次课主要内容:•编程语言KeilC51•C51语言的数据类型(背住)•数据类型的定义方法(背住)•数据类型编程(掌握)第3章C51语言编程基础1)机器语言定义:处理器能直接执行的二进制代码特点:效率高、但不易于使用10110110000
000001011010100000000ADDA,#193.1编程语言KeilC51简介1、编程语言2)汇编语言定义:以助记符的形式表示机器语言特点:速度快、体积小、但依赖于硬件体系3)高级语言独立于机器、面向过
程的、接近于人的自然语言。语言:FORTRAN、C语言、JAVA特点:与硬件无关、易于交流和使用、运行效率低X=X+1;编译器链接器X=X+1;…………程序员1001001010110010……高级语言程序机器码单片机如何执行程
序指令?KeilC51语言是在标准C的基础上,针对51单片机的硬件特点进行扩展,并向51单片机上移植的高效、简洁的实用高级语言。与汇编语言相比的特点:(1)可读性好。(2)可模块化开发。(3)可移植性好。(4)生成的代码效率较低。2、KeilC
51语言简介对于51单片机,目前广泛使用的是KeilC51语言,简称C51语言。3、C51与标准C的区别(1)库函数的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在KeilC51中,主要用于串行口数据的收发。(3)
C51的变量存储模式与标准C中的变量存储模式不一样。标准C是在通用计算机中只有一个程序和数据统一寻址的内存空间。51单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。(4)标准C语言没有处理单片机中断的方法。C51中有专门处理中断的中断函数。(2)数据类型有一
定的区别。在标准C的基础上又扩展了4种类型。(5)头文件的不同。51头文件把单片机内部的硬件资源如定时器、中断、I/O等所相应的特殊功能寄存器写入头文件内。(6)程序结构的差异。由于51单片机硬件资源有限,编译系统不允许太多的程序嵌套。其次,C51语言不支持标准C的递归特性。4、Kei
lC51的开发工具———KeilμVision2KeilμVision2是德国Keilsoftware公司开发的C51语言开发软件。这个软件集成了文件编辑处理、编译链接等功能。3.2C51语言程序设计基础1、数据类型
与存储类型1)数据类型画板书2)C51扩展的数据类型(4种扩展的数据类型)(1)位变量bitbit的值可以是1(true),或0(false)。bit变量名;格式:例如:bitflag;flag=0;画板书
(2)特殊功能寄存器sfr地址单元80H—FFH之间的片内数据存储区;“sfr”数据类型占用一个内存单元;利用它可以访问51单片机内部的所有特殊功能寄存器。sfrP1=0x90;//定义了P1口寄存器,地
址为0x90;P1=0xff;//把P1寄存器的值置为0xff,//P1口的所有输出引脚设置为高电平。例如sfr寄存器变量名=字节地址常数;格式:※重点、难点、熟练掌握画板书字节地址?P10x90变量名地址0xff存储器sfrP1=0x90;//定义了P1口寄存器,地址为0x90;P1=0xff;
//把P1寄存器的值置为0xff,//P1口的所有输出引脚设置为高电平。画板书sfrP2=0xA0;P2=0xA0;思考:sfrSBUF=0x99;习题1:往串行发送数据缓冲寄存器SBUF写入80SBUF=80;习题2:从P0口寄存器读取数据,存放到任意一个变量X。sfrP0=0x80;c
harx;x=P0;※难点、掌握例如:(3)特殊功能寄存器sfr16“sfr16”数据类型占两个内存单元;用于操作占两个字节的特殊功能寄存器。sfr16DPTR=0x82;//定义了片内16位数据指针寄存器DPTR,//低8位字节地址为82H,//高8位字
节地址为83H。DPTR=0x1234;sfr16寄存器变量名=字节地址常数;格式:字节地址为82H、83H存放的数据分别是多少?(4)特殊功能位sbit片内特殊功能寄存器的可寻址位。“^”前是特殊功
能寄存器的名字;“^”的后面数字是特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0-7。①sbit位变量名=特殊功能寄存器^位位置;格式:sfrPSW=0xd0;//定义PSW寄存器地址为0xd0sbitFO=
PSW^5;//定义F0位为PSW.5F0=0;例如:程序状态字寄存器PSWPSW的不同位表明程序运行的状态。习题3:片内I/O口P1口的P1.0寻址位置成高电平sfrP1=0x90;sbitP1_0=P1^0;P1_0=1;习
题4:从P2口的P2.7读取数据,存放到任意一个位变量X。sfrP2=0xA0;sbitP2_7=P2^7;bitx;x=P2_7;※难点②sbit位变量名=位地址常数;sbitCY=0xD7;/*CY位地址为0xD7*/sbitOV=0xD2;/
*OV位地址为0xD2*/if(CY==1){…}例如:格式:格式:③sbit位变量名=字节地址^位位置;sbitP1_0=0x90^0;P1_0=1;习题5:片内I/O口P1口的P1.0寻址位置成低电平sbit
P1_0=0x90;P1_0=0;在头文件AT89X51.h或者reg1.h中定义了常用的特殊功能寄存器和可寻址位。#include<AT89X51.h>sfrP1=0x90;sbitP1_0=0x90
;两者区别?数据类型区别、及其作用。bitsfrsfr16sbit讨论第7次课主要内容:•数据存储类型•绝对宏及程序习题•_at_关键字及程序习题3)数据存储类型数据存储类型是指数据存放在51单片机的哪一个存储器空间,不同的存储器
空间,寻址方式不同,访问速度不同。P46bdatadataidatapdataxdatacode画板书※重点、记住(1)DATA区。DATA区指片内RAM的低128字节的空间,可直接寻址;寻址是最快的,应该把经常使用的变量放在DAT
A区。unsignedchardatasystem_status=0;unsignedintdataunit_id[8];例如:格式:数据类型【存储类型】变量名;(2)BDATA区。BDATA区是内部RAM可位寻址的16字节存储区(字节
地址为20H~2FH)中的128个位。在这个区中声明变量就可进行位寻址。例如:unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;sbitstat_flag=status_byte^4;if(status_w
ord^15){stat_flag=1;}(3)IDATA区。IDATA区是片内RAM的0-256字节的存储区,只能间接寻址,速度比直接寻址慢。unsignedcharidatasystem_status=0;f
loatidatavalue;例如:(4)PDATA区和XDATA区。PDATA区和XDATA区位于片外存储区;PDATA区指的是外部数据存储区0—256字节。XDATA区指的是外部数据区64KB内的任何地址。unsignedcharxda
tasystem_status=0;unsignedintpdatauint_id[8];例如:(5)程序存储区CODE。CODE区是程序存储区,储存的数据是不可改变的。unsignedcharcodea[9]={0x00,0x
01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};例如:4)数据存储模式C51编译器设定的存储模式:SMALL、COMPACT和LARGE三种模式。若声明charvar1;在SMALL模式下,var
1被定位在data存储区;在COMPACT模式下,var1被定位在idata存储区;在LARGE模式下,var1被定位在xdata存储区中。2、C51语言的绝对地址访问C51语言提供了两种比较常用的访问绝对地址的方法,对片内RAM、片外RAM及I/
O进行访问。绝对地址C51编译器提供了一组宏定义对code、data、pdata和xdata空间进行绝对寻址。这组宏定义放在absacc.h头文件中:CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址;DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址
;XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址;PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址。#define变量名绝对宏[字节地址]格式绝对宏
画板书※难点1)绝对宏例题,片内RAM、片外RAM定义的程序如下:#include<absacc.h>#definePORTEXBYTE[0xFFC0]/*将PORTE定义为外部I/O,地址为0xFFC0*/#defineNRAMDB
YTE[0x40]/*将NRAM定义为片内RAM,地址为0x40*/main(){PORTE=0x3D;NRAM=0x01;}/*数据3DH写入地址0xFFC0的外部I/OPORTE*//*将数据01H写入片
内RAM的40H单元*/※难点习题6使用绝对宏将片内RAM20H的字节地址单元全部置1。#include<absacc.h>#defineMDBYTE[0x0020]/*将M定义为内部RAM,地址为0x0020*/main(){M=0xff;}习题7使用绝
对宏读取片外RAMF000H字节地址单元的内容。#include<absacc.h>#defineWRAMXBYTE[0xF000]main(){charx;x=WRAM;}使用关键字_at_可对指定的存储器空间的绝对地址进行访问。格式:[存储类型]数据类型变量名_at_地址常数
;地址常数:指定变量的绝对地址,位于存储器空间之内;使用_at_定义的变量必须为全局变量。板书※重点2)_at_关键字例题使用关键字_at_实现绝对地址的访问。dataunsignedchary1_at_0x50;/*在data区定义字节变量y1,地址为50
H*/xdataunsignedinty2_at_0x4000;/*在xdata区定义字变量y2,地址为4000H*/voidmain(void){y1=0xff;y2=0x1234;……while(1);}习题8使用关键字_at_读取片内RAM60H单元的内容。dataunsignedc
harM_at_0x60;voidmain(void){unsignedchary;y=M;}例题使用关键字_at_将片外RAM2000H开始的连续20个字节单元清0。voidmain(void){unsignedchari;for(i=0;i<20;i++){buffer[i]=0;}}xda
taunsignedcharbuffer[20]_at_0x2000;程序记忆1※重点dataunsignedcharbuffer[8]_at_0x40;voidmain(void){unsignedcharj;f
or(j=0;j<8;j++){buffer[j]=0;}}习题9:使用关键字_at_把片内RAM40H单元开始的8个单元内容清0。第8次课主要内容:•C51的基本运算•C51的二分支结构•C51语言单词、语法熟记,程序设计C51语言的基本运算与标准C类似
,主要包括算术运算、关系运算、逻辑运算、位运算和赋值运算及其表达式等。1)算术运算符3、C51的基本运算※重点读程序,z值是多少?charx,y,z;x=60;y=40;z=x/y;x=10;y=4;z=x%y;z=x/y;x=10
0;y=10;z=x*y;有一个任意2位数,求出个位数、十位数。编程实现。例题intc;chargw,sw;c=52;gw=c%10;sw=c/10;习题10有一个任意3位数,求出个位数、十位数、百位数。编程实现。gw=c%10;sw=(c/10)%10;bw=c/100;
intc;chargw,sw,bw;c=851;※难点2)关系运算符关系表达式intx=3;inty=6;intR;R=x>y;3)逻辑运算符逻辑表达式intx=1;inty=1;intR=0;R=x&&y;10<X<100,编程语句。X<100或者X>1000,编程语句。判断X是否能被3整
除的整数,编程语句。(X>10)&&(X<100)(X<100)||(x>1000)0==(X%3)判断X是否能被3整除却不能被6整除的整数,编程语句。(0==(X%3))&&(0!=(X%6))本次课暂不做,习题11求100
到1000之间,能被100整除不能被3整除的整数,编程语句。4)位运算符01001000&1111111100001000>>26<<301001001|11111111charx=65;x=~x;※重点00000001&00110111010000
00|0000000100001000<<332>>4习题12(9<<3)|(1<<1)(1<<4)|(1<<2)|(1<<1)0xF0|0x010xFF&0x10综合例题以字节操作方式对P1口的P1.5清0,P1.1置为1,其他位保持不变。XX0XXX1X
P1.5P1.1P1.0综合例题以字节操作方式对P1口的P1.5清0,P1.1置为1,其他位保持不变。XX0XXX1XP1.5P1.1sfrP1=0x90;P1=(P1&0xDF)│0x02;P1.0sfrP2=0xA0;P2=P2|0x10;综合习题11以字节操作方式,把P2口的P2.4位置成1
,其它位保持不变。sfrP0=0x80;Bitflag;flag=P0&0x40;综合习题12以字节操作方式,读取P0口的P0.6位是否为1?4、C51的分支与循环程序结构程序结构分为三类:顺序结构、分支结构、循环结构。1)分支结构控制语句格式二分支if语句if(表达式){语句;}if(x>y)
{max=x;}比较变量x和变量y,如果x>y,则把x赋给变量max。习题13比较变量x和变量y,如果x和y相等,则把0赋给变量max。if(x==y){max=0;}格式:if(表达式){语句1;}else{语句2;}if(x>y){max=x;}else{
max=y;}比较变量x和变量y,如果x>y,则把x赋给变量max;否则把y赋给变量max。例题14,说明下列语句的作用if(x>y){m=y;}else{m=x;}比较变量x和变量y,把二者最小值赋给变量m习题15如果变量x满足关系10<x<20,
则把变量y置成1;否则把y置成0。if((x>10)&&(x<20)){y=1;}else{y=0;}sfrP2=0xA0;sfrP1=0x90;sbitP24=P2^4;sbitP10=P1^0;综合习题16如果读取P2口的P2.4位为1,则把P1口的P1.0置成0。v
oidmain(){if(1==P24){P10=0;}}if(表达式1)语句1;elseif(表达式2)语句2;……elseif(表达式n)语句n;else语句n+1;多分支if语句0表达式1表达式2表达式n语句n+100语句n语句2语句1非0非0非0…当成绩≥
90时,输出verygood,当80≤成绩<90时,输出good,当60≤成绩<80时,输出pass,当成绩<60时,输出fail。intscore;if(score>=90)printf(“verygood");elseif(score>=80)printf(“g
ood");elseif(score>=60)printf(“pass");elseprintf(“fail");注意ifelse配对问题第9次课主要内容:•C51的多分支结构,while、switch-
case•break语句和continue•数组、函数•IO口编程•学习方法:•背住C语言语法、执行流程、程序分析方法多分支switch语句switch(表达式1){case常量表达式1:{语句1;}break;case常量表达式2:{语句2;}break;……case常量表达式n:{语句n;}b
reak;default:{语句n+1;}}格式:switch表达式1语句1语句2语句n语句n+1…式1式2式ndefaultcaseswitch(key){case1:y=1;break;case2:y=2;break;case3:y=4;break;de
fault:;}在单片机程序设计中,常用switch语句作为键盘中按键的判别。当按下键的键号变量key=1,则变量y=1;键号变量key=2,则变量y=2;键号变量key=4,则变量y=3;没有按下键,则变量y不变。板书key=2;switch(key){case1:
y=1;case2:y=2;case3:y=4;default:;}习题:读程序执行的结果y=?习题17y=x(x<1)2x-1(1≤x<10)3x-11(x≥10)思考:多分支语句区别:if…elseif…else…和switchcase语句2)循环结构控制语句while(表达式){循
环体;}格式:表达式循环体假(0)真(非0)先判断表达式,后执行循环体。while语句画板书main(){inti=0;inty;while(i<3){i++;}y=i;}i++执行几次?y=?习题:读程序执行的结果y=?注意方法main(){inti=0;inty;while(i<7){i=i+
3;}y=i;}y=?习题:读程序执行的结果y=?do{循环体;}while(表达式);格式:表达式循环体假(0)真(非0);不可省略!切记!!先执行循环体,后判断表达式。do-while语句画板书main(){in
ti=0;inty;do{i=i+2;}while(i<3);y=i;}i++执行几次?y=?习题:读程序执行的结果y=?main(){inti=0;inty=0;do{i++;y=y+i;}while
(y<7);}习题:读程序执行的结果y=?for(表达式1;表达式2;表达式3){语句;}格式:for语句画板书※重点main(){inti,y;y=0;for(i=1;i<4;i++){y=y+i;}}y=?习题:读程序执行的结
果y=?main(){inti,y;y=5;for(i=2;i<6;i++){y=y+i;}}y=?习题:读程序执行的结果y=?main(){inti,y;y=0;for(i=0;i<20;i++){if(0==(i%3))y=y+i;}}y=?习题:读程序执行的结果y
=?while语句和for语句区别?思考循环语句3)break语句和continue语句break功能:跳出switch结构;在循环语句中,终止并跳出本层循环。continue功能:结束本次循环,跳过本层循
环体中尚未执行的语句,执行循环体的判断。#definePI3.1415main(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;if(area>100)break;printf(
"r=%d,area=%.2f\n",r,area);}}计算r=1到r=10的圆面积,直到面积大于100时停止。运行结果:r=1,area=3.14r=2,area=12.57r=3,area=28.27r=4,area=50.26r=5,a
rea=78.54结束整个for循环把100~200之间不能被3整除的数输出。main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(“%d",n);}}结束本次循环,循环体的剩余语
句被忽略,执行表达式3,进入下一循环。main(){intn;for(n=100;n<=200;n++){if(n%3==0)break;printf(“%d",n);}}习题:读程序执行的结果?习题:循环检测P1.0引脚,只有检测P1.0为低电平时,
循环结束。sfrP1=0x90;sbitP10=P1^0;main(){while(1){if(P10==0)break;}}5、数组数组是用来存储一组相同数据类型的数据结构。一维数组格式:数据类型变量名[N];inta[10]
;inta[5]={1,2,3,4,5};初始化:charb[10];inty;y=a[2]+a[4];求下列数组的和。inta[5]={1,2,3,4,5};main(){inta[5]={1,2,3,4,5};inti,sum;sum=0;
for(i=0;i<5;i++){sum=sum+a[i];}}习题:求数组a[5]中能被2整除的数的和。inta[5]={10,2,33,54,15};main(){inta[5]={10,2,33,54,15};inti,sum;sum=0;for(i=0;i<5;i++
){if(sum[i]%2==0){sum=sum+a[i];}}}习题18:输入输出对应关系。如果P0口只有P00输入低电平,则P1口只有P10输出高电平;如果P0口只有P01输入低电平,则P1口只有P11输出高电平;……如果P0口只有P07输入低电平,则P1口只有P17输出
高电平。输入二进制数00000001输出0x10;输入二进制数00000010输出0x20;输入二进制数00000100输出0x40;输入二进制数00001000输出0x80;输入二进制数00010000输出0x11;输入二进制数00100000输出0x21;
输入二进制数01000000输出0x41;输入二进制数10000000输出0x81。习题19:将一组数中100个数的值按逆序重新存放。10,2,13,54,55,54,13,2,100,991,982,97i,99-i二维数组格式:数据类型变量名[N][M];inta[3][2];i
nta[3][2]={{1,2},{3,4},{5,6}};行数列数求下列数组的和。main(){inta[3][2]={{1,2},{3,4},{5,6}};inti,j,sum;sum=0;for(i=0;i<3;i++
){for(j=0;j<2;j++)sum=sum+a[i][j];}}inta[3][2]={{1,2},{3,4},{5,6}};求下列数组的和。6、自定义函数intadd(inta,intb)//被调用函数{intc;c=a+b;returnc;}
main(){intx,y,z;x=5;y=6;z=add(x,y);//调用函数}形式参数函数名类型※难点7、C51语言的中断函数函数是一个完成某个相关功能的代码段;C51程序只有一个主函数main(),并且从主函数开始运行。中断服务函数格式:函数类
型函数名()interruptnusingninterruptn:表示中断号,n的值为0—4;usingn:表示寄存器组号,n的值为0—3;sfrP2=0xA0;P2=P2|0x10;综合习题11以字节操作方式,把P2口的P2.4
位置成1,其它位保持不变。XXX1XXXXP2.4习题19:将一组数中数值按逆序重新存放。10,2,13,54,55,54,13,2,10综合习题以字节操作方式对P1口的P1.5清0,P1.1置为1,其他位保持不变。XX0XXX1XP1.5P1.1sfrP1=0x90
;P1=(P1&0xDF)│0x02;P1.0sfrP0=0x80;Bitflag;flag=P0&0x40;综合习题12以字节操作方式,读取P0口的P0.6位是否为1?sfrP2=0xA0;sfrP1=0x90;sbitP24=P2^4;sbitP10=P1^0;综合习题16如果读取P2口的P
2.4位为1,则把P1口的P1.0置成0。voidmain(){if(1==P24){P10=0;}}综合习题:检测P1.0引脚,只有等到检测P1.0为低电平时,才让P1.1输出高电平。sfrP1=0x90;sbitP10=P1^0;main(){while(1){if(P10==0
)break;}}综合习题18:输入输出对应关系。如果P0口只有P00输入低电平,则P1口只有P10输出高电平;如果P0口只有P01输入低电平,则P1口只有P11输出高电平;……如果P0口只有P07输入低电平,则P1
口只有P17输出高电平。输入二进制数00000001输出0x10;输入二进制数00000010输出0x20;输入二进制数00000100输出0x40;输入二进制数00001000输出0x80;输入二进制数00010000输出0x11;输入二进制数00100000
输出0x21;输入二进制数01000000输出0x41;输入二进制数10000000输出0x81。作业:P68一、3-5三、1、2四、1补充,例3-4main(){inti,y;y=0;for(i=2;i<5;i++){y=y+i;}}9、读程序执行的结
果y=?