C51程序设计精品课件

PPT
  • 阅读 54 次
  • 下载 0 次
  • 页数 36 页
  • 大小 250.000 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C51程序设计精品课件
可在后台配置第一页与第二页中间广告代码
C51程序设计精品课件
可在后台配置第二页与第三页中间广告代码
C51程序设计精品课件
可在后台配置第三页与第四页中间广告代码
C51程序设计精品课件
C51程序设计精品课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 36
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】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,unsignedlongsingedchar,singedint,singedlongfloat

,double一般指针第5页,共36页。三、C51数据的存储类型与MCS-51存储结构data:内部存储器RAMbdata:内部存储器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

e10unsignedcharArray[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页。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?