1、.8.9 邱宏邱宏18951309290办公室:S303 C语言程序设计语言程序设计单片机单片机第1页单片机基本功效单片机基本功效单片机能直接做什么?C语言怎么实现?引脚功效1、最小化电路1电源电路:提供能量2晶振电路:推进 CPU工作3复位电路:规范CPU工作起点2、IO端口功效一、数据输入和输出功效1输入状态时电气标准:(1)输入端高阻(1-10M欧)(2)逻辑数据:3.5V-1;0.4V-0(3)安全电压:5.5V2输出信号电气标准:(1)电平信号大小:1-3.55V(5V理想值),0-00.4V(0V理想值)。(2)电流输出能力:03mA(通常需要扩展才能驱动外设);单个引脚可到达20
2、mA 2电流越大,则电平信号越偏离理想值第2页怎样编程?怎样编程?什么是编程?人希望单片机实现某个功效,将功效分解成C语言能够直接执行任务单元,再按照一定次序组合,依次执行,(流程设计)用C语言,在KEILC编写环境下,把为了实现该功效,而需要单片机逐一完成一个个任务单元讲述一遍,(编程)然后KEIL C软件检验没有语法错误,翻译成机器语言,(编译)按ROM存放范围,排版成规范格式,(链接)烧录到ROM中,然后CPU逐一取出执行,实现人功效意图怎样才能编程?1知道单片机能直接干什么?基本功效2知道C语言能直接让单片机干什么,指令语句,语法3依据要实现总任务功效,任务分解,细化到详细指令,再按照
3、一定次序和逻辑关系重新组合,形成指令流程4用C语言描述指令流程。第3页端口端口IO功效功效以4个并行口为单位,直接输入或者输出0 x00-0 xFF数据单片机从P0.0P0.7读取数据,或者向外界输出信号,都是经过位于RAM编号为0 x80存放器进行,该编号(地址)不好记忆,所以取名P0,取名指令,由sfr来下达。sfr P0 =0 x80;sfr P1 =0 x90;sfr P2 =0 xA0;sfr P3 =0 xB0;定义了名字以后,P0若等于0 x37,表示引脚信号:P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 0 0 1 1 0 1 1 1P1-P3
4、一样。单片机中每个专用存放器都有专门地址,为了便于记忆,都进行了命名,这个工作量挺大,C语言事先把这个工作已经做好了,存放在文件“reg51.h”中,我们能够直接引用,引用规则:#include reg51.h 这么一来,包含reg51.h文件中全部内容到本程序中,无须重新编写其中内容,而直接利用其中内容。降低工作量,方便。该文件普通不可缺乏。第4页宏定义宏定义假如P0口数据是来自AD转换数据,P1口是按键数据,那怎样愈加便于记忆端口详细功效?比如:你在等快递,这时快递员张三来了,他人告诉你”张三来了“,与“快递员来了”,更轻易让你了解?能够重新给P0口取个新名字:#define AD_dat
5、a P0#define key_data P1格式:#define new_name defined_nameC 语言在程序中,自动将new_name等效看成defined_name。这就是宏定义第5页并行口数据输入输出并行口数据输入输出并行口输出并行口名=源数据;/;表示指令(语句)结束比如:P0=0 x5F;并行口输入并行口作为源数据时,并行口名只要出现一次,就读取一次当前端口数据比如:in_data=P0;第6页单独引脚单独引脚IO对并行口某一个引脚单独IO,其余不变1依据引脚功效,给该引脚取个名字,2让单片机知道更名字对应使用是哪个引脚比如P1.0是按键up,P1.1是按键down,P
6、2.1是ledsbit up_key=P10;sbit down_key=P10;sbit led=P21;单独引脚输出:引脚名=源数据;/;表示指令(语句)结束比如:led=0;led=1;单独引脚输入单独引脚作为源数据时,该引脚名只要出现一次,就读取一次当前端口数据比如:if(up_key=0)led=0;第7页变量数据存放变量数据存放变量:完成某个任务过程中,需要暂时保留数据。存放在RAM中,新数据替换原来数据。RAM是连续一段存放单元,变量数据存放在哪里,需要跟单片机说清楚4个问题:1,存放数据要几个字节?数据类型 unsigned char;int long float 2,数据存放
7、在那个RAM区域?默认片内RAM data(可省略0-7f)位寻址区 bdata ;片外RAM xdata 3,在区域中那个位置?地址编号不好记,给变量命名 变量名 4,初始值是多少?比如:int data in_data=0 x00;in_data=-;第8页指令指令1 赋值语句赋值语句功效:类似于MOV格式:(接收数据)变量名 =数据源;数据源:能够是一个常数,能够是别变量,能够是一个变量、数据组合而成一个算术或者逻辑运算表示式。使用条件:语句中全部包括变量和数据都必须是已经定义或者已知。比如:in_data=0 x12;第9页3、C程序基本结构程序基本结构1包含文件:头文件2宏定义,类型
8、重定义3变量、常量初始化4主程序第10页3、C程序基本结构程序基本结构/*程序功效、编写日期等概述FILE NAME:loopled_key.cCHIP TYPE:AT89C51TIME:-8*/#include reg51.h“#include“stdio.h”#include“math.h”/头文件调取,有些功效,在别任务中曾经用到,为了防止重复编写,把包含这些功效文件调取过来,/可供此次任务直接使用#define out_port P2/比如定义P2口输出控制信号/比如定义P0口0和1脚采集按键状态 sbit key_state=P00/定义新类型typedef unsigned cha
9、r u_8;typedef unsigned int u16;#/为完成任务各个角色定义数据 u_8 loop_num=0;/定义循环次数:0-7float code PI=3.14;/常数 void delayms(uint);/定义输出彩灯效果数据常数 uchar led_out8=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;void main(void)/演出正式开始!第11页C语言运算符及表示式语言运算符及表示式一、运算符及表示式1.1.C C运算符介绍运算符介绍算术运算符算术运算符:+-*/%+-+-*/%+-关系运算符关系运算符:
10、=!=!=逻辑运算符逻辑运算符:!:!&|&|位运算符位运算符 :|&|&赋值运算符赋值运算符:=及其扩展及其扩展条件运算符条件运算符:?:?:逗号运算符逗号运算符:,指针运算符指针运算符:*&求字节数求字节数 :sizeofsizeof特殊运算符特殊运算符:()().-.-第12页 2.2.运算符分类运算符分类单目运算符单目运算符前缀单目运算符前缀单目运算符:-a,+a,-a:-a,+a,-a后缀单目运算符后缀单目运算符:a+,a-:a+,a-双目运算符双目运算符:+-*/%:+-*/%三目运算符号三目运算符号:?:?:第13页 三、算术运算符三、算术运算符1.1.基本算术运算符基本算术运算
11、符:+-*/%(+-*/%(取模或取余取模或取余)说明:说明:1.1.两整数相除两整数相除,结果为整数结果为整数,舍去小数部分舍去小数部分.2.2.%要求两侧均为整型数据要求两侧均为整型数据.例例 -5/2.0=-5/2.0=2*3=2*3=5/2=5/2=+5=+5=-2.5-2.56 62 25 5例例 5%2 =5%2 =-5%2 =-5%2 =1%10 =1%10 =5%1 =5%1 =5.5%2 5.5%2 1 1 -1-11 10 0()第14页2.2.自增自增(+)(+)、自减、自减(-)(-)v运算方法:运算方法:(2)(2)在混合运算中在混合运算中main()main()in
12、t m=3,i int m=3,i,b;b;i=+m;i=+m;b=m+;b=m+;printf(printf(“m=%d,i=%dm=%d,i=%d”,m,i);,m,i);前缀方式前缀方式:在表示式计算前在表示式计算前,先执行先执行m=m+1,m=m+1,再使用再使用m m 代替代替+m+m计算表示式值计算表示式值.后缀方式后缀方式:在表示式计算前在表示式计算前,先使用先使用m m代替代替m+m+计算出计算出 表示式值表示式值.再执行再执行m=m+1.m=m+1.等价于等价于m=m+1;m=m+1;i=m;i=m;运行结果运行结果:m=5,i=4,b=4m=5,i=4,b=4三、算术运算符
13、三、算术运算符第15页 说明:说明:(1)(1)不能不能用于用于常量和表示式常量和表示式2.2.自增自增(+)(+)、自减、自减(-)(-)如 float f=6.5;f+;/*f=7.5 */如 5+(a+b)+第16页3.3.算术表示式算术表示式与数学中概念一致与数学中概念一致 说明:说明:(1)(1)表示式中不能使用表示式中不能使用 和和 .(2)C(2)C语言语言没有乘方运算没有乘方运算运算符运算符.如如 x x3 3如如 数学表示式数学表示式:(b-c)+(a-d)(b-c)+(a-d)2 2 4 4 x*x*xx*x*xC C表示式表示式:(b-c)+(a-d)(b-c)+(a-d
14、)*2*2)*4*4第17页C语言解读语言解读4.4.算术运算符优先级和结合性算术运算符优先级和结合性v优先级优先级 使用使用1,2,3,41,2,3,4.表示表示,数字越小数字越小,优先级越高优先级越高,运运 算时优先级高运算符先运算算时优先级高运算符先运算.v结合性结合性 左结合性左结合性:+-*/%:+-*/%右结合性右结合性:+-:+-+-2 +-2 高高*/%3/%3+-4 +-4 低低 第18页如如 a+b/ca+b/c先先/后后+先先+后后-a=b=4 a=b=44.4.算术运算符优先级和结合性算术运算符优先级和结合性v表示式计算方法表示式计算方法 先优先级先优先级,后结合性后结
15、合性:优先级高运算符先运算优先级高运算符先运算,当同一优先级运算符同时出现时当同一优先级运算符同时出现时,按它们结合按它们结合 性确定运算次序性确定运算次序.先先b=4 b=4 后后a=ba=ba*(b+c)a*(b+c)先先+后后*a-+ia-+i-i+i+等价于等价于a-(+i)a-(+i)等价于等价于-(i+)-(i+)a+b-ca+b-c第19页例:输入一个球半径值,计算并输出球例:输入一个球半径值,计算并输出球体积。体积。(V=4/3V=4/3r r3 3)main()main()float r,v;float r,v;printf(printf(请输入球半径请输入球半径:);:);
16、scanf(%f,&r);scanf(%f,&r);v=4.0/3*3.14*r*r*r;v=4.0/3*3.14*r*r*r;printf(printf(球体积为球体积为:%fn,v);:%fn,v);第20页四、关系运算符四、关系运算符1.1.关系运算符关系运算符(比较运算符比较运算符)序号序号运算符运算符 优先级优先级 结合性结合性1 1 6 6左左结结合合性性2 2=4 4=5 5=7 76 6!=!=2.2.运算规则运算规则:条件满足条件满足,则结果为真则结果为真(1),(1),不然为假不然为假(0).(0).例例 2=3 2=3 值为值为 a a50(32)5(32)值为值为 53
17、2532值为值为 5=4+15=4+1值为值为第21页五、逻辑运算符五、逻辑运算符序号序号 运算符运算符优先级优先级结合性结合性1 1&1111左结合性左结合性2 2|12123 3!2 2右结合性右结合性1.1.逻辑运算符逻辑运算符 2.2.运算规则运算规则a ab ba&ba&ba|ba|b!a!a0 00 00 00 01 10 01 10 01 11 11 10 00 01 10 01 11 11 11 10 0例例 -5&2-5&2 值为值为 3&0 3&0 值为值为 3|0 3|0 值为值为 !8!8 值为值为 !8!8 值为值为 0|8&!50|8&!5值为值为1 10 01 1
18、0 01 10 0第22页 逻辑运算符、算术运算符和关系运算逻辑运算符、算术运算符和关系运算符之间优先级比较符之间优先级比较 运算符运算符优先级优先级!高高低低算术运算符算术运算符关系运算符关系运算符&|&|五、逻辑运算符五、逻辑运算符第23页 想一想:想一想:数学表示式数学表示式3x103x10所对应所对应C C语言表示式应怎样语言表示式应怎样表示?表示?数学表示式数学表示式:3x103x10 C C表示式表示式:3x&x103x&xb)?a:c (ab)?a:c值为值为_._.第25页赋值运算符赋值运算符类别类别运算符运算符优先优先级级结合结合性性简单赋值运算符=1414右右结结合合性性复
19、合赋值复合赋值运算符运算符+=+=、-=-=、*=、/=/=、&=&=、|=|=、等、等第26页main()main()int a=3,b=-3,c;int a=3,b=-3,c;c=a*2+b;c=a*2+b;a+=5;a+=5;b*=c-1;b*=c-1;printf(printf(“%d,%d,%dn%d,%d,%dn”,a,b,c),a,b,c);第27页九、数据之间混合运算九、数据之间混合运算.自动转换自动转换(隐式转换隐式转换)转换规则转换规则:(1)(1)总则总则:不一样类型数据混合运算时不一样类型数据混合运算时,先转换成先转换成同一类型同一类型,然后进行运算然后进行运算.(2)
20、(2)转换按数据长度增加方向进行转换按数据长度增加方向进行,以确保精度以确保精度不降低不降低.(3)(3)全部浮点数都是以全部浮点数都是以floatfloat型进行运算型进行运算.(4)(4)赋值运算左边量和右边量类型不一致时赋值运算左边量和右边量类型不一致时,将右边量类型自动转换为左边量类型将右边量类型自动转换为左边量类型.第28页 数据类型间转换数据类型间转换doubledoublefloatfloatlonglongintintchar,shortchar,short低低高高运算对象类型不一运算对象类型不一样时由低向高转换样时由低向高转换.例例 int i=2;int i=2;float
21、 f=1.0;float f=1.0;long d=40;long d=40;char l=2;char l=2;例例 int i;int i;i=4.5/2;i=4.5/2;左边左边:int:int右边右边:double:doubledoubleintdoubleint10+10+a a+i*f +i*f d/ld/l第29页例例 (double)(3/2)(double)(3/2)(double)3/2 (double)3/22.2.强制类型转换强制类型转换(显式转换显式转换)普通形式:普通形式:(数据类型名)(数据类型名)(操作对象操作对象)例例 float x;int i;char c
22、h;float x;int i;char ch;ch=(char)(97);ch=(char)(97);x=(float)3;x=(float)3;i=(int)3.6;i=(int)3.6;i=(int)(x+4.5);i=(int)(x+4.5);第30页C程序解读程序解读第31页第32页C 程序解读程序解读uchar const led_out8=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;本项目中,循环彩灯在特定循环次数时输出数据是个固定量,是个常量,所以,预先设定好,放在连续ROM中,取个名字:led_out,预置初值.常量定义常量
23、定义常量:在完成任务过程中,需要一个或者多个固定数据。存放在ROM中,预留一块固定大小存放空间(依据数据大小范围),而且取个名字,便于查找,也能够预置数据常量定义结构:类型名 常量定义符合 变量名 =初值;类型名:依据数据大小范围,预留一块固定大小存放空间Char int long float 常量定义符合:const常量名:跟命名规则一样。初值一定要写第33页C 程序解读程序解读void main(void)/演出正式开始!out_port=0 xff;/赋值语句,指令格式:接收数据变量=给出数据(常量或者变量);delayms(1000);/子程序调用格式:子程序名(运行子程序所需数据);
24、out_port=0;out_port=led_out0;If(key_state=0)主程序是不可缺乏结构,程序功效执行从它开始主程序是不可缺乏结构,程序功效执行从它开始第34页C 程序解读程序解读void delayms(uint);屡次使用任务模块,称为子程序,在正式使用之前,亮个相,在它以后程序都认识它,也就能够使用它了。结构:返回结果数据类型 子程序名称 (运行子程序需要数据类型);本例中,延时(范围在0-65535)个毫秒。delayms(1000);/延时1秒第35页3、C程序基本结构程序基本结构 一、运算符 1算术运算符+,-,*,/,%运算规则:1与代数运算规则相同,2括号优
25、先,3结果自动类型转换成多字节例:char x=8,z;int y=120;z=(char)(x+y)/4;2逻辑运算符&,|,,运算规则:相同位数两个数据逐位进行。3移位运算符规则:左移 ,右移。移出丢失,空出补04关系运算符 ,=,!=,&,|规则:关系正确,结果是 1;关系不对,结果是 0.第36页3、C程序基本结构程序基本结构二、表示式由变量,常数,括号,运算符组成,表示按规则运算后结果。三、语句语句就是C语言表示指令,是基本任务单元。1,赋值语句格式:目标变量=源数据表示式;含义:源数据表示式运算后,将结果赋给目标变量。2,自增、自减语句格式:变量+;变量-;+变量;-变量;3,if()语句4,while()语句5,switch()语句6,for(;)语句第37页3、C程序基本结构程序基本结构 四、函数(子程序)1,应用场所:任务含有独立完整性,(每次执行都按摄影同步骤进行),而且需要重复被使用。2,种类:库函数(系统自带,方便编程者使用);自定义函数3,结构:函数返回值类型 函数名 (形式参数类型)函数体语句return;第38页