【文档说明】C51程序设计精品课件.ppt,共(36)页,250.000 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2187.html
以下为本文档部分文字说明:
第五章C51程序设计单片机的C语言应用程序设计张正华第1页,共36页。第一部分C51基础第2页,共36页。概述汇编语言:1、直接操纵系统的硬件资源2、编写比较复杂的数值计算程序就非常困难3、可读性不强,修改困难,效率不高C
51:1、易于开发复杂的单片机程序2、易于移植第3页,共36页。一、C语言与MCS-51数据类型与变量定义,必须要与单片机存储器结构关联。否则编译器不能正确地映射定位。C51编写单片机应用程序,要根据单片机存储结构及内部资源定义相应的C
语言中的数据类型和变量。第4页,共36页。二、C51数据类型及存储方式bit,位寻址区unsignedchar,unsignedint,unsignedlongsingedchar,singedint,singedlongfloat
,double一般指针第5页,共36页。三、C51数据的存储类型与MCS-51存储结构data:内部存储器RAMbdata:内部存储器RAM,可位寻址idata:内部存储器RAM,可间接寻址pdata:外
部RAM可分页xdata:外部RAM16位code:ROM16位第6页,共36页。带存储类型的变量的定义的一般格式chardatavar1;bitbdataflags;floatidataX,Y,Z;unsingedintpdatavar2;
unsignedcharvector[3][4];第7页,共36页。四、SFR格式:sfrsfr-name=intconstant;sfrSCON=0x98;sfrTMOD=0x89;sfr16T2=0xcc;*所有的sfr定义放入一个头文件reg51.h
第8页,共36页。定义语句的一般格式有三种形式1sbitbit-name=sfr-name^intconstant;sfrPSW=0xD0;sbitOV=PSW^2;sbitCY=PSW^7;2sbitbit-name=intconstant^intconstant;sbitO
V=0xD0^2;sbitCY=0xD0^7;3sbitbit-name=intconstant;sbitOV=0xD2;sbitCY=0xD7;第9页,共36页。五、MCS-51并行接口的C51定义sf
rP0=0x80;sfrP1=0x90;#include<absacc.h>#definePORTAXBYTE[0xFFC0]absacc.h是C51中绝对地址访问函数的头文件。第10页,共36页。六、位变量的C51定义
除了C的数据类型外,C51编译器支持“bit”数据类型1、位变量C51定义位类型标识符位变量名bitdirection_bit;bitlook_point;2、函数可包含类型为“bit”的参数、也可将其作为返回值bitfunc(bitb0,b
itb1){…return(b1);}第11页,共36页。六、位变量的C51定义3、对位变量定义的限制位变量不能定义成一个指针如不能定义:bit*bit_pointer不存在位数组,如不能定义:bitb_array[]在位定义中
,允许定义存储类型,位变量都被放入一个位段。第12页,共36页。六、位变量的C51定义例1先定义变量的数据类型和存储类型:bdataintibase;/*定义ibase为bdata整型变量*/bdatacharbary[4];/*bary[4]定义为bdat
a字符型数组*/然后可使用“sbit”定义可独立寻址访问的对象位:sbitmybit0=ibase^0;sbitmybit15=ibase^15;sbitAry07=bary[0]^7;sbitAry37=bary[3]^7;对象ibase和bary也可以字节寻址:Ary37=0;
bary[3]=‘a’第13页,共36页。七、C51构造数据类型前面讲的字符型(char)、整型(int)、浮点型(float)、位型(bit)等数据类型,都属于C51的基本数据类型。C语言还提供了一些扩展数据类型,它们是由基本数据类型
按一定的规则组合成的数据类型,称之为构造数据类型。以指针类型说明第14页,共36页。1、基于存储器的指针基于存储器的指针以存储器类型为参量,它在编译时才被确定。因此,为指针选择存储器的方法可以省掉,以便这些指针
的长度为一个字节(idata*,data*,pdata*)或2个字节(code*,xdata*)。(1)charxdata*px;在xdata存储器中定义一个指向字符型(char)的指针变量px。指针自身在默认存储区,长度为
2个字节(值为0~0xFFFF)。第15页,共36页。1、基于存储器的指针(2)charxdata*datapdx;除了明确定义指针位于内部存储区data外,其它与以上相同。(3)datacharxdata
*pdx;与上例完全相同第16页,共36页。1、基于存储器的指针(4)structtime{charhour;charmin;charsec;structtimexdata*pxtime;}在结构中structtime中,除了其它结构成员外,还包含有一个
具有和structtime相同的指针pxtime,time位于外部数据存储器(xdata),指针pxtime具有两个字节长度。第17页,共36页。1、基于存储器的指针(5)structtimeidata*ptime;这个声明定义了一个位于默认存储器中的指针,它指向结构
time,time位于idata存储器中,结构成员可以通过间接访问。ptime为一个字节长度。(6)ptime->pxtime->hour=12;使用上面的关于structtime和structidata*ptime的定义,指针“pxtime”被从结构中间接调用,它指向位于x
data存储器中time结构。结构成员hour被赋值为12。第18页,共36页。2、一般指针一般指针包括3个字节:1个字节存储类型和2个字节偏移地址地址+0+1+2内容存储器类型偏移量高位地址偏移量高位地址第19页,
共36页。2、一般指针其中,第一字节代表了指针的存储类型,存储器类型编码如下:存储器类型idataxdatapdatadatacode值12345第20页,共36页。2、一般指针以xdata类型的0x1234地址为指针表示如下地址+0+1+2
内容0x020x120x34第21页,共36页。2、一般指针当用常数作为指针时,必须注意正确定义存储类型和偏移量。如将常数0x41写入地址0x8000的外部数据存储器。#defineXBYTE((char
*)0x20000L)XBYTE[0x8000]=0x41;其中,XBYTE被定义为(char*)0x20000L,0x20000L为一般指针,其存储类型为2,偏移量为0000H,这样XBYTE成为xdata零地址的指针。而XBYTE[8000]则是
外部数据存储器的0x8000绝对地址。第22页,共36页。第二部分C51程序第23页,共36页。任务一点亮彩灯/*驱动LED每秒闪烁一次*/#include”reg51.h”#defineucharun
signedcharsbitlight=P2^0;voiddelay05s(void)//延时0.5S{unsignedchari,j,k;for(i=5;i>0;i--){for(j=200;j>0;j--){f
or(k=250;k>0;k--){;}}}}voidmain(void)//主函数{while(1){light=0;delay05s();light=1;delay05s();}}第24页,共36页。任务一点亮彩灯/*依次点亮发光二极管的程序*/#include”reg51.h”#de
fineucharunsignedcharvoiddelay05s(void)//延时0.5S{unsignedchari,j,k;for(i=5;i>0;i--){for(j=200;j>0;j--){for(k=250;k>0;k--){;}}}}voidmain(void
){uchari,j;while(1){j=0x01;for(i=0;i<8;i++){P2=~j;delay05s();j=j<<1;}}}第25页,共36页。任务一点亮彩灯/*任意变化的彩灯控制程序*/#include”reg
51.h”#defineucharunsignedcharuchardispcode[8]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};voiddelay05s(void)//延时0.5S{unsignedchari,j,k;for
(i=5;i>0;i--){for(j=200;j>0;j--){for(k=250;k>0;k--){;}}}}voidmain(void){uchari;while(1){for(i=0;i<8;i++){P2=disp
code[i];delay05s();}}}第26页,共36页。任务二、简易数字钟/*数码管静态显示0~9的演示程序,P2口作为段码驱动*/#include<reg51.h>#defineucharunsignedcharuchardispcode[10]={0x3f,0x06,0x5b,0x4f
,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voiddelay05s(void){unsignedchari,j,k;for(i=5;i>0;i--)for(j=200;j>0;j--)for(k
=250;k>0;k--);}voidmain(void){uhari;while(1){for(i=0;i<10;i++){P2=dispcode[i];delay05s();}}}第27页,共36页。任务二、简易数字钟/*动态显
示8位数码管,P0口接数码管的段码另接上拉电阻,P2接数码管的位码*/#include<reg51.h>#defineucharunsignedcharuchardisplay_code[]={0x3f,0x06,0x5b,0
x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchardisplay_data[8]={1,2,3,4,5,6,7,8};uchardelay(v
oid){uchari;for(i=250;i>0;i--);}voiddisplay(){uchari;uchark;k=0x80;for(i=0;i<8;i++){P2=0;P0=display_code[display_data[i]];P2=k;k=k>>1;delay();}P2=0;
}voidmain(void){while(1){display();}}第28页,共36页。任务二、简易数字钟/*实现24进制的程序设计*/#include<reg51.h>#defineucharunsignedcharuchardisplay_code[
]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchardisplay_data[8]={0,0,0
,0,0,0,0,0};uchartime[]={0,0,0};voiddelay(void){uchari;for(i=250;i>0;i--);}voiddisplay(){uchari,k;k=0x80;for(i=0;i<8;i++){P2=0;P
0=display_code[disp_data[i]];P2=k;k=k>>1;delay();}P2=0;}第29页,共36页。任务二、简易数字钟/*实现24进制的程序设计*/voidcalc(){time[0]++;if(time[0]>23)time[0]=0;}voidconve
rt(){disp_data[0]=time[0]/10;disp_data[1]=time[0]%10;}voidmain(void){uchari;while(1){for(i=0;i<250;i++){display();}calc();convert();}}第3
0页,共36页。任务三、软件编程存储器块清零xdataunsignedcharBuffer[256]_at_0x4000;voidmain(){unsignedintindex;unsignedcharxdata*ptr;pt
r=&Buffer;//起始地址for(index=0;index<=255;index++){*ptr++=0;//清0,地址加一}}第31页,共36页。任务三、软件编程//将Number拆为三个BCD码
,并存入Result数组voidmain(){unsignedcharResult[3];unsignedcharNumber;Number=123;Result[0]=Number/100;//除以100,得百位数Result[1]=(N
umber%100)/10;//余数除以10,得十位数Result[2]=Number%10;//余数为个位数}第32页,共36页。任务三、软件编程//将A拆为二个ASCII码,并存入Result数组codeunsignedcharASCIITable[16]="0
123456789ABCDEF";//定义数字对应的ASCII表voidmain(){unsignedcharResult[2];unsignedcharNumber;Number=0x1a;Result[0]=ASCIITable[Number/16];
//高四位Result[1]=ASCIITable[Number&0xf];//低四位}第33页,共36页。任务三、软件编程//数据块的移动xdataunsignedcharBuffer1[256]_at
_0x3000;xdataunsignedcharBuffer2[256]_at_0x4000;voidmain(){unsignedintindex;unsignedcharxdata*ptr1;
unsignedcharxdata*ptr2;ptr1=&Buffer1;ptr2=&Buffer2;for(index=0;index<=255;index++){*ptr2++=*ptr1++;}}第34页,共36页。任务三、软件编程//在分支
结构程序中,能够按调用号执行相应的功能完成指定的操作voidFunc0(){}voidFunc1(){}voidFunc2(){}voidFunc3(){}voidFuncEnter(unsigne
dcharFuncID){switch(FuncID){case0:Func0();break;case1:Func1();break;case2:Func2();break;case3:Func3();break;de
fault:break;}}voidmain(){FuncEnter(0);FuncEnter(1);FuncEnter(2);FuncEnter(3);while(1);}第35页,共36页。任务三、软件编程//随机数排序#defineSiz
e10unsignedcharArray[Size];voidmain(){bitChange;unsignedcharindex;unsignedcharTemp;do{Change=0;for(index
=0;index<(Size-1);index++){if(Array[index]>Array[index+1]){Change=1;Temp=Array[index];Array[index]=Array[index+1];Array[index+1]=Temp;}}}wh
ile(Change);}第36页,共36页。