ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:22.10KB ,
资源ID:18964775      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18964775.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机的C语言程序设计与应用基于Proteus仿真第2版Word格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机的C语言程序设计与应用基于Proteus仿真第2版Word格式.docx

1、 /访问定时器0,设置时间常数 TH0=ox3c; TR0=1; /启动定时器0 3-3 sbit型变量的定义示例程序如下:sfr PSW=0xD0;sbit OV=PSW2;sbit OV=0xd02;sbit OV=0xD2;unsigned char bdata flag;sbit flag0=flag0;sfr p1=0x90;sbit p1_0=p10;sbit p1_1=p11;sbit p1_2=p12;sbit p1_3=p13;sbit p1_4=p14;sbit p1_5=p15;sbit p1_6=p16;sbit p1_7=p17;3-4 片内I/O口及其位的定义示例。

2、sfr P1=0x90; /P1口的SFR定义 sfr P3=0xB0; /P3口的SFR定义 sbit DIPswitch=P14; /P3口的4位DIP开关输入sbit greenLED=P15; /P1口的5位的绿LED输出 unsigned char data inval; inval=0; /inval的初始化值 while(1) P1=0XFF; inval=p1&0x0f; /从P1读位03 3-5 片内RAM、片外RAM及I/O的定义示例absacc.h#define PA XBYTE0xffec /将PA定义为外部I/O口,地址为0xffec#define NRAM DBYT

3、E0x40 /*将NRAM定义为片内RAM,地址为40H,长度为8位*/ PA=0x3A; /将数据3AH写入地址0xffec的外部I/O端口 NRAM=0x01; /将数据01H写入片内RAM40H单元3-6 通过_at_实现绝对地址的访问示例。data unsigned char x1 _at_ 0x40; /*在data区定义字节变量x1,它的地址为40H*/xdata unsigned int x2 _at_ 0x2000; /*在xdata区定义字符变量x2,它的地址为2000H*/ x1=0xff; x2=0x1234; while(1);3-7 将片外RAM 6000H开始的连续

4、的10个字节单元内容清0.xdata unsigned char Buffer10 _at_ 0x6000;void main (void) unsigned char index; for(index=0;index0;b=71=32; c=7!=0; d=-12a=%d,b=%d,c=%d,d=%dn,a,b,c,d); a=0,b=0,c=1,d=13-10 逻辑运算的程序示例 int a,b,c,d,e; a=!0 ; b=15&22 ; c=35& d=17.3|0 ; e=17.3|2.6 ;a=%d,b=%d,c=%d,d=%d,e=%dn,a,b,c,d,e);a=1,b=1,

5、c=0,d=1,e=13-11 利用位移运算符进行循环移位的示例。若a=11000011B,将a值右循环位移2位。a右循环n位,即将a中原来左面(8-n)位右移n位,而将原来右端的n位移到最左面的n位。上述问题可以由下列步骤来实现。1.将a的右端n位先放到b中的高n位中:b=an3.将b、c进行或运算:a=c|b对a进行循环右移两位的程序如下:main() unsigned char a=0xc3,b,c; int n=2; b=a(8-n);n; a=c|b;结果如下:循环右移前a=11000011B 循环右移后a=11110000B3-12 位运算程序示例 int a,b,c; a=23;

6、b217; c=a&b;a&b=%dn,c); c=a|b;a|b=%dn c=ab;ab=%dn c=a;a=%dn c=a3;a2;bb=17a|b=223ab=206a=-243=1842=543-13 分支编程示例有一个函数如下: 1 xy= 0 x=0 -1 x编写一个程序,输入一个x值,输出y值。使用嵌套的if语句判断函数y的取值。 #include main() int x,y; scanf() if(x=90) grade=A; else if(score=80)B=70)C=60)D else grade=Escore=%d,grade=%cn,score,grade);sc

7、ore=45,grade=E3-17 Proteus仿真电路如图所示。AT89C51单片机的P1.0和P1.1引脚接有两只按键,其4种逻辑组合分别点亮由P2.0P2.3控制的4只LED(低电平点亮),试编程实现此功能。参考程序如下: char a; do P1=0xff; a=p1; a=a&0x03; switch (a) case 0:P2=0x0e;break; case 1:P2=0x0d; case 2:P2=0x0b; case 3:P2=0x07; while(1);3-18 实型数组sample存有10个采样值,编写一个函数返回其平均值(即平均值滤波程序)float avg(f

8、loat *sample) float sum=0; char no=0; sum+=sampleno; no+; while(no10); return (sum/10)3-19 时间延迟程序举例循环的基本用途之一是用嵌套产生时间延迟,执行的指令消磨一定已知的时间。这种延时方法是依靠一定数量的时钟周期来计时的,所以延时依赖于晶振频率。8051单片机的数据手册中列出了每一条机器指令所需要的时钟周期数,使用2MHzDE晶振,12个震荡指令花费1s下面是一个延时1ms的延时程序。如果给这个程序传递一个50的数值,则可产生约50ms的延时。void msec(unsignes int x) unsi

9、gned char j; while(x-) for(j=0;j4000) break; /退出整个循环 由于不知道什么时候能够超过4000,所以使用一个无限循环,每次计算和之后判断当前sum的值,当sum超过4000时使用break退出整个循环,不再执行。3-21 continue语句退出当前循环,不再执行本轮循环,从下一轮循环开始执行。无符号char型数据sdata内存放一个随机数,这个数据每秒产生一次,如果这个数据不等于0x45,则计算这些数据的和,当和超过4000时停止计算,保存出现的0x45的个数并且计算整个过程花费的时间。 int counter;counter=0; /计算秒和

10、if(sdata=0x45) /如果等于0x45 counter+; /统计出现的个数 continue; /退出本次循环,不计算sum else /如果不等于0x45 sum=sum+sdata; 当sdata等于0x45时,利用continue语句退出本次循环;当sum和大于4000时,使用break语句退出整个循环。3-22 goto语句无条件转移语句计算1100的和,存放到sum中 unsigned char counter; int sum;sumadd:sum=sum+counter; counter+; if(counter101) goto sumadd;3-23 一维数组程序

11、示例如图所示为一由MCS-51单片机控制指示灯的proteus仿真电路,此电路从P0口相连的8个开关读入空置量信息,将最近读入的10次信息存储在10字节数组char array10中,并把读入的信息显示在与P2口相连接的8位LED指示灯上。每次读入显示信息间隔100ms,由延时程序msec(100)完成。相应的C语言程序流程图如下void msec(unsigned int); unsigned char array 10; unsigned char i; for(i=0;i=9;i+) arrayi=p2=p0; msec(100);void msec(unsigned int x); w

12、hile(x-)!=0) for(j=0; ;3-24 将摄氏温度转换成华氏温度#define uchar unsigned charuchar code tempt=32,34,36,37,39,41; /* 数组,设置在EPROM中,长度为实际输入的数值数*/uchar ftoc(uchar degc) return temptdegc /* 返回华氏温度值*/ uchar x; x=ftoc(5); /*得到与5相应的华氏温度值*/3-25 利用指针变量完成A/D接口的启动和读取结果值。unsigned char xdata *ADC; /*定义ADC0809的端口指针*/unsigne

13、d char xdata *ADCdata; /*定义ADC0809数据缓冲器指针*/unsigned char i; ADC=0x00f0;ADCdata=0x1000; /*定义地址端口和数据缓冲器地址*/ i=8; /*ADC0809有8个模拟输入通道*/ EA=1;EX1=1;IT1=1; /*开中断*/ *ADC=i; /*启动ADC0809*/ while(i); /*等待8个通道转换结束*/void int1() interrupt 2 unsigned char tmp; tmp=*ADC; *ADCdata=tmp; /*读出A/D转换结果*/ ADCdata+; /*数据存

14、到数据缓冲器*/ i-; /*启动下一个模拟输入通道A/D转换*/3-26 无参函数举例。程序如下func()( printf(Function In func respond the call of Mainn); printf(Function In Main Calls A Function in funcn func();上面的程序中,实际上定义了两个函数main()和func()。它们都是无参函数,因此它们的返回值类型标识符可以省略,默认值是int类型。3-27 求两个数的最大公约数 程序如下int gcd(u,v)int u,v; int temp; while(v! temp=u

15、%v; u=v; v=temp; return(u); int result, a=150,b=35; SCON=0x50; TM0D=0x20; TH1=0xf3; TR1=1; T1=1; result=gcd(a,b);The gcd of %d and %d is %dn,a,b,result);程序运行结果为a=150 b=35The gcd of 150 and 35 is 53-28 中断函数举例 程序如下unsigned int interruprcnt;unsigned char second;void timer0(void) interrupt 1 using 2 if(

16、+interruprcnt=4000) second+; interruptcnt=0;定义中断函数要注意:1 interrupt和using不能用于外部中断;2 使用using定义寄存器组时,要保证寄存器组切换在所控制的区域内,否则出错。I/O函数函数 功能_getkey 从串行口读入一个字符_getchar 从串行口读入一个字符并输出该字符gets 从串行口读入一个字符串ungetchar 将读入的字符回送到输入缓冲区putchar 通过8051的串行口输出字符printf 按照一定的格式输出数据或字符串sprintf 按照一定的格式将数据或字符串输出到内存缓冲区puts 将字符串和换行符

17、写入串行口scanf 将字符串和数据按照一定的格式从串行口读入sscanf 将格式化的字符串和数据送入数据缓冲区vprintf 将格式化字符串输出到内存数据缓冲区vsprintf 将格式化字符串和数字输出到由指针所指向的内存数据缓冲区内部函数库_crol_ 将char型变量循环向左移动指定位数后返回_irol_ 将int型变量型循环向左移动指定位数后返回_lrol_ 将long型变量循环向左移动指定位数后返回_cror_ 将char型变量循环向右移动指定位数后返回_iror_ 将int型变量循环向右移动指定位数后返回_lror_ 将long型变量循环向右移动指定位数后返回_nop_ 使单片机产

18、生延时(相当于插入汇编指令NOP)_testbit_ 对字节中的一位进行测试(相当于JBCbit)指令绝对地址访问函数CBYTE 对8051单片机的存储空间进行字节寻址CODE区DBYTE 对8051单片机的存储空间进行字节寻址DATA区PBYTE 对8051单片机的存储空间进行字节寻址PDATA区XBYTE 对8051单片机的存储空间进行字节寻址XDATA区CWORD 对8051单片机的存储空间进行字寻址CODE区DWORD 对8051单片机的存储空间进行字寻址DATA区PWORD 对8051单片机的存储空间进行字寻址PDATA区XWORD 对8051单片机的存储空间进行字寻址XDATA区3-29字节型空间访问示例 /头文件 char ch; DBYTE0x0040=0x41; /赋值 PBYTE0x0002=0x42; XBYTE0x0003=0x43; ch=CBYTE0x0002; /读取并输出ch=%bxn,ch); ch=DBYTE0x0040; ch=PBYTE0x0002; ch=XBYTE0x0002; 运行结果如下 ch=6a ch=41 ch=42 ch=433-30 字型空间访问示例 int ch1; DWORD0x0040=0x41; PWORD0x0002=0x42; XWORD0X0002=0X43; ch1=CWORD0x0002; /

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1