c51单片机c语言程序,C51单片机的C语言程序设计.ppt

《C51单片机的C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《C51单片机的C语言程序设计.ppt(44页珍藏版)》请在人人文库网上搜索。

1、2020/8/7,1,第10章 80C51的C语言程序设计,单片机C语言概述,10.1,C51的数据类型与运算,10.2,C51流程控制语句,10.3,C51的指针类型,10.4,C51的函数,10.5,C51编程实例,10.6,2020/8/7,2,10.1 单片机C语言概述,10.1.1 C51程序开发过程,编译器能自动完成变量的存储单元的分配 对常用功能模块和算法编制相应的函数,方便移植,采用C51的优点,C语言具有良好的可读性、可移植性和基本的硬件操作能力。,C51程序开发过程,编写源程序 建立工程,加入源程序 编译生产目标程序 仿真调试、写存储器,2020/8/7,3,2020/8/。

2、7,4,10.1.2 C51程序结构,#include #include void delayms(unsigned); void main(void) unsigned char i; P1=0 x01; do for (i=0;i=7;i+) delayms(5000); P1=P11; if(P1=0 x0)P1=0 x01; while(1); ,void delayms(unsigned x) unsigned char j; while(x-) for(j=0;j123;j+); ,2020/8/7,5,10.2.1 C51的数据类型,10.2 C51的数据类型与运算,数据类型决定。

3、其取值范围、占用存储器的大小及可参与哪种运算。,2020/8/7,6,尽可能采用无符号格式 bit用于定义位变量的名字,编译器会对其分配地址(RAM的20H 2FH 区域) sbit用于定义位变量的名字和地址,地址是确定的且不用编译器分配(SFR及RAM的20H2FH 区域) C51编译器在编译时会自动进行类型转换,几点说明:,2020/8/7,7,10.2.2 C51数据的存储类型,C51的存储器类型,2020/8/7,8,经常使用的变量应该置于片内RAM中,要用bdata、data、idata来定义。 不经常使用的变量或规模较大的变量应该置于片外RAM中,要用pdata、xdata来定义。。

4、 默认存储器类型由编译控制命令的存储模式指令限制。,2020/8/7,9,10.2.3 80C51硬件结构的C51定义,特殊功能寄存器的声明,sfr 特殊功能寄存器名 = 地址常数;,格式:,例如: sfr SCON = 0 x98; sfr P0 = 0 x80;,2020/8/7,10,特殊功能寄存器中特定位的声明,sbit 位变量名=特殊功能寄存器名位的位置(07) 例如: sfr PSW = 0 xD0; sbit OV = PSW2;,sbit 位变量名 = 字节地址位的位置(07) 例如: sbit OV = 0 xD02; sbit CY = 0 xD07;,sbit 位变量名 。

5、= 位地址 例如: sbit OV = 0 xD2; sbit CY = 0 xD7;,2020/8/7,11,内部RAM中可位寻址对象的定义,先定义变量的数据类型和存储类型 例如: int bdata ibase; char bdata array4;,再利用sbit进行声明 例如: sbit mybit0 = ibase0; sbit mybit15 = ibase15; sbit ary07 = array07; sbit ary37 = array37;,访问示例: ibase = -1; array2 = a; array2 = 0,2020/8/7,12,算术运算符和算术表达式,1。

6、0.2.4 C51的运算符和表达式,基本算术运算符 例如: + 加法运算符; - 减法(取负)运算符; * 乘法运算符; / 除法运算符; % 取余数运算符。,示例: 25.0/20.0 = 1.25 25/20 = 1 25%20 = 5,取负运算优先级最高。,2020/8/7,13,自增、自减运算符(仅能用于变量) 例如: + 自增运算符; - 自减运算符;,类型转换运算符 自动转换,顺序:bitcharintlongfloat 强制类型转换,如:(double)a,2020/8/7,14,关系运算符和关系表达式,关系运算符 大于; = 大于等于; = = 等于; != 不等于。,关系表达。

7、式 关系表达式的值为逻辑值:真(1)和假(0),2020/8/7,15,逻辑运算符和逻辑表达式,逻辑运算符 条件表达式;更新表达式)语句,if语句与goto语句结合,当型循环 形式为: loop:if(表达式) 语句 goto loop; ,2020/8/7,23,直到型循环 形式为: loop:语句 if(表达式) goto loop; ,continue是一种循环中断语句,它并不跳出循环体; break语句只能跳出它所处的那一层循环; goto语句可以用于跳出多重循环(从内层到外层)。,注意:,2020/8/7,24,10.4 C51的指针类型,有一个变量a,利用 void delay(v。

8、oid) int a = 5000; while(a - - )_nop_( ); ,void int_srv(void)interrupt 0 delay( ); if(INT0 = = 0)P10 = ! P10;while(INT0 = = 0); ,void main() P10 = 0; EA = 1; EX0 = 1; while(1); ,2020/8/7,33,定时计数器编程示例,【例10-2】 利用定时/计数器T0的方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms的方波,采用中断方式,设系统时钟频率为12 MHz。,1、计算计数初值X: Nt/ Tcy 101。

9、0-3/110-610000 计数器初值应为-10000。即应将 -(10000/256)送入TH0中,-(10000%256)送入TL0中。,2、求T0的方式控制字TMOD: M1M0 = 01,GATE = 0,C/T = 0,可取方式控制字为01H。,3、程序清单(见下页),2020/8/7,34,#include “reg51.h” sbit P10 = P10; void timer0(void)interrupt 1 P10 = ! P10; TH0 = -(10000/256); TL0 = -(10000%256); ,void main(void) TMOD = 0 x01;。

10、 P10 = 0; TH0 = -(10000 / 256); TL0 = -(10000 % 256); EA = 1; ET0 = 1; TR0 = 1; while(1); ,2020/8/7,35,10.6.2 80C51扩展资源的编程,通用并行口编程示例,【例10-3】用81C55作为微型打印机与单片机间的接口电路。,2020/8/7,36,#include “reg51.h” #include “absacc.h” /*含有对XBYTE等绝对地址访问宏的定义*/ #define uchar unsigned char #define COMD8155 XBYTE0 x7f00 #d。

11、efine PA8155 XBYTE0 x7f01 #define PB8155 XBYTE0 x7f02 #define PC8155 XBYTE0 x7f03 sbit BUSY = P33;,2020/8/7,37,uchar code tab17 = 0 xb8,0 xdf,0 xbd,0 xcc,0 x20, 0 xb3,0 xf6,0 xb0,0 xe6,0 xc9,0 xe7,0 x20, 0 x32,0 x30,0 x30,0 x38,0 x0a;/*高教 出版社 2008*/ uchar t1 = 17;,void ptr(uchar d) /*打印字符函数*/ PA8155。

12、 = d; PC8155 = 0 x00; /*产生选通脉冲*/ PC8155 = 0 x01; while(BUSY); ,2020/8/7,38,void main(void) COMD8155 = 0 x0f;/*送命令字*/ prt(0 x1c); /*送中文打印方式命令字高字节*/ prt(0 x26); /*送中文打印方式命令字低字节*/ EA = 1; EX1 = 1; while(1); ,2020/8/7,39,void int1(void)interrupt 2 using 1 uchar i; EA = 0; for(i = 0;i t1;i +)prt(tabi); E。

13、A = 1; ,2020/8/7,40,A/D转换接口编程示例,【例10-4】 ADC0809与单片机的接口电路如图。,2020/8/7,41,# include “reg51.h” # include “absacc.h” # define uchar unsigned char # define IN0 XBYTE0 x7ff8 sbit ad_busy = P33;,2020/8/7,42,void ad0809(uchar idata *x) uchar i; uchar xdata * ad_adr; ad_adr = & IN0; for(i = 0;i 8;i +) * ad_adr = 0; /*启动转换*/ i = i; /*延时等待*/ i = i; while(ad_busy ! = 0); xi = * ad_adr; /*存转换结果*/ ad_adr +; /*下一通道*/ ,2020/8/7,43,void main(void) static uchar idata ad10 ; ad0809(ad); ,Thank You。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值