单片机C语言程序设计500_第1页
单片机C语言程序设计500_第2页
单片机C语言程序设计500_第3页
单片机C语言程序设计500_第4页
单片机C语言程序设计500_第5页
已阅读5页,还剩495页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.掌握C51语言的基本知识2.掌握51内核单片机的基本原理3.掌握开发软件与工具的使用4.掌握程序设计的流程与方法5.建立规范书写风格与模块化编程思想6.会编写、调试基础级的应用程序C51程序设计简介——目标应用电子技术C51程序设计简介——教材主要内容:1.编程载体:单片机与开发软件2.输出口编程:花样灯3.IO口编程:键控灯4.思维训练专题5.内部主要资源应用编程:中断、定时/计数器6.动态扫描编程7.串口应用8.AD与DA应用超星学银在线开放课程:

单片机C语言程序设计小球计数、秒闪灯、测量正脉冲宽度、看谁反应快、键控PWM调光灯、可调时钟、多功能秒表、打地鼠游戏、生日快乐歌、串口控制8*8点阵、LCD显示的简易电压表、简易波形发生器1.重渔——程序设计方法

问题→算法设计→数据抽象→流程设计→语句选择→程序书写→调试、测试与判定→总结,解决学生“怎么想?(思想方法)怎么写(编程落地)

2.趣味任务驱动,循速渐进共设计了8个项目,包括42个任务、32个进阶任务。3.理论、仿真、实践相融合4.注意工程意识的培训,强调编程书写规范、模块化设计5.强调程序调试

C51程序设计简介——教学方法与手段小球计数、秒闪灯、测量正脉冲宽度、看谁反应快、键控PWM调光灯、可调时钟、多功能秒表、打地鼠游戏、生日快乐歌、串口控制8*8点阵、LCD显示的简易电压表、简易波形发生器C51程序设计简介——学习建议记忆必要的基础知识:C语言知识、单片机、存储器结构、工作原理;知识是思考的起点!软硬结合,不可分离;

坚持手、脑并用的原则——思考+操练;先谋后动——谋划流程后选语句结构再编写代码;

书写规范想、看、写、调、测、结合,多参加工程实践项目1:认识编程载体——单片机和编程开发环境

目标:知识与技能要求:(1)了解单片机内部硬件框架结构。(2)掌握程序开发环境Keil基本应用。(3)建立结构化程序设计意识。(4)建立规范书写程序的意识。程序设计技能C51语言基础硬件基础:单片机开发工具应用项目1:认识编程载体-单片机和编程开发环境1.1单片机的应用及主要类型1.2单片机外形与框架1.3C51语言及其开发环境简介1.4任务1:KeilC应用入门-单片机输出“HelloC51”1.5任务2:结构化程序设计-建立函数概念1.6单片机硬件知识补充项目1:认识编程载体-单片机和编程开发环境哪些电子产品需要软件?软件起到了什么作用?软件在哪个部件上运行?软件硬件关系电脑、手机。。。。1.1单片机的应用及主要类型

单片机在哪?电脑→CPU→微控制器→单片机常用的单片机产品

Intel8051单片机

PIC单片机AVR单片机ARM系列单片机STC

。。。。。。单片机在哪里?电磁炉与单片机输入设备(箭头指向单片机):加、减按钮输出设备(箭头指向设备):4个指示灯、电磁线圈的驱动电路1.2单片机外形与框架单片机之与个人PC机(比较认识)1.2.1内部结构框图和主要部件

大小、接口、CPU运行速度(主频)、容量1.2单片机外形与框架1.2.2引脚:数据输入/输出通道(8951有4*8=32条引脚)

1.3C51语言及其开发环境简介计算机语言历程:机器语言→汇编语言→高级语言→面向对象,可视化,,,:0300000002001FDC:10001F00758169758920758DFDD28E759852C2488C:0B002F0090003A12000E12000380F552:0D003A00544553542050524F4752414D0041:10000300740D120047740A12004722204804E49337:0C0013008001E06006120047A380F0228C:080047003099FDC299F59922E0:00000001FF

JBTXTBIT,PS1CLRAMOVCA,@A+DPTRSJMPPS2PS1:MOVXA,@DPTRPS2:JZEXITCALLPUTCHAR

unsignedcharj;while(1){for(j=0x01;j<0x80;j<<=1){/*BlinkLED0,1,2,3,4,5,6*/P1=j;/*OutputtoLEDPort*/for(i=0;i<10000;i++){/*Delayfor10000Counts*/wait();1.3C51语言及其开发环境简介计算机语言历程:机器语言→汇编语言→高级语言→面向对象,可视化,,,渐离硬件基础,渐近人的表达语言如,C可执行易读写,不执行机器码源程序编译软件集成开发环境IDE:编辑&编译&调试,如KEILC语言特点1.语言简洁、紧凑使用方便、灵活。C语言一共只有32个关键字,9种控制语句程序书写形式自由,区分大小写。2.数据结构丰富即描述现实世界对象的数据组织方式,是单一的,如年龄,整数;百米跑的时间,浮点-小数;立方体的长宽高。。。。3.具有结构化的控制语句LOREMIPSUMLOREMIPSUMLOREMIPSUMC语言特点4.

语法限制不太严格,程序设计自由度大一般的高级语言语法检查比较严,能检查出几乎所有的语法错误。而C语言放宽了语法检查,允许编程者有较大的自由度,但语法正确性要自己确保,过分依赖C编译查错是不可取的“限制”与“灵活”是一对矛盾。5.位(bit)操作能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此C既具有高级语言的功能,又具有低级语言的许多功能,可用来写系统软件。C语言的这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言。KEIL软件窗口界面1.4任务1:KeilC应用入门-单片机输出“HelloC51”

1.4.1Keil入门应用七步法,跟着书本自己能完成! 关键字:文件夹、工程、型号、源文件,添加、设置、编译 认识几个便捷图标:1.4.2KEIl的初步调试:查看串口输出“HelloC51”注意窗口式软件的操作的相似性调试——判断正误工程管理窗口开关属性设置编译调试串口复位运行停止运行初识函数与文件架构LOREMIPSUMLOREMIPSUMLOREMIPSUMLOREMIPSUMLOREMIPSUMLOREMIPSUMLOREMIPSUM1.5任务2:结构化程序设计-建立函数概念一个项目/工程的的软件函数树型结构:从函数角度:每个C51程序都由一个或多个函数组成;主函数(main()有且只有一个)统领其它函数,其它函数只有在调用时才会执行到。从文件组织角度:一个工程软件可由N个源文件组成,“*.c”。每个源文件由N个函数组成。一个文件中的函数可能会调用其它文件中的函数。由此想到,,,,,,

函数的基本格式任何函数都是由函数说明和函数体两部分组成。根据函数是否需要参数,可将函数分为无参函数和有参函数两种。无参函数:

函数类型函数名(void)

{说明语句部分;可执行语句部分;

}有参函数:函数类型函数名(

数据类型参数[,数据类型参数2……])

{说明语句部分;可执行语句部分;

}F1.C文件架构与函数F1.CMAIN()F1.C

MAIN()FU1()FU....N()MAIN()FU1()FU....N()F2.CFA1()FB1()F2.HFC1()1C1MAIN()1C多函数多C多函数C项目中程序文件的组织结构举例1.5.1仅由main()函数构成的C语言程序/*案例代码文件名:EX1.C*//*功能:仅由main()函数构成的C语言程序示例*/#include<stdio.h>voidmain(){printf(“ThisisaC51program.\n”);}程序运行结果:

ThisisaC51program.1.5.2由main()+max()构成的C语言程序/*案例代码文件名:EX2.C*//*功能:由main()函数和1个其他函数max()构成的C语言程序示例*/intmax(intx,inty) //求两数中较大的函数,//置于主函数前可被直接调用

{

return(x>y?x:y);}voidmain()

{…….…….printf(“max=%d\n”,

max(num1,num2));

//输出最大值,函数调用

}

1.5.3C51程序的一般结构#include<reg51.h> //预处理命令voidfun1(void);//函数声明,函数于主函数后时须声明charfun2(形参);unsignedcharx,y,z; //定义全局变量……voidmain()

{ ……//函数调用fun1(); …… fun2(实参); …… }

voidfun1(void) //功能函数定义{函数体……}charfun2(形参)//功能函数定义{函数体……}1.5.4规范书写程序语句规范——

素质——

质量注释1.5.5程序设计流程图左侧表达的意思是?明了的流程清晰的思路1.5.5程序设计流程图秒分时1.5.5程序设计流程图程序由函数组成,主函数统领其它函数单片机的存储器及IO口引脚存储器简介随机存储器

随机存取存储器(randomaccessmemory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。随时读写,快,掉电不存。通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。只读存储器

只读存储器(英语:Read-OnlyMemory,简称:ROM)。ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出。外储存器:是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等。1.6单片机硬件知识补充1.6.1存储器:永久程序和临时数据的住所

图1-19程序存储器ROM结构图1-20数据存储器RAM结构类似于硬盘与内存、缓存1.6单片机硬件知识补充最大存储容量与片上存储器大小最大容量由单片机的16地址线宽度决定,为65536,地址编号从0-65535(0-FFFF)集成在片上的ROM、RAM较小。同一系列不同型号单片机的存储器大小不一样。单片机外形与引脚引脚:数据输入/输出通道(8951有4*8=32条引脚)

结构决定读写操作方式一脚多功能1.6.2I/O(输入/输出)口结构、功能1.6.2I/O(输入/输出)口结构、功能P2:IO高8位地址线P0:IO&数据&低8位地址线1.6.3I/O口的负载能力(AT89s51)1.I/O口的位(引脚)驱动能力P0口的每一位可以吸收电流方式或提供电流方式驱动8个LSTTL输入(1个LSTTL输入:高电平时为20

A,低电平时为0.36mA)。P1~P3口的每一位以吸收或提供电流方式驱动4个LSTTL输入。可见,P0~P3口每一位吸收电流方式的驱动能力比提供电流方式的驱动能力大得多。2.稳定状态下,IOL(引脚吸收电流)的严格限制每个引脚上的最大IOL=10mAP0端口8个引脚的最大IOL=26mAP1、P2、P3端口8个引脚的最大IOL=15mA所有输出引脚上的IOL总和最大为IOL=71mA兼容机有差异非单个引脚简单相加小结软件是控制系统的灵魂,硬件是载体,两者严密配合,如在哪个端口输入输出数据。软件开发是需要工具的。软件开发是有方法的:函数,流程,书写规范等。习题与思考一1、在自己的计算机上安装KeilUvision4软件。2、参考1.4节,从单片机的串口输出“ThisismyfirstCprogram!”3、简述使用KeilC51开发工具开发软件的流程。4.执行程序总是从主函数入口,然后从最上面顺序往下读(碰到循环就执行循环,碰到选择就执行选择),有且只有一个main函数。项目2:多变的花样灯

目标:建立软件控制硬件的思想,将控制要求演化为输出特定的或有规律变化的数据。通过编程实现控制8个发光管以多种显示效果循环显示。 如亮点流动;暗点流动;一一亮起;交替闪烁等。

超星学银在线开放课程:

单片机C语言程序设计项目2:多变的花样灯知识与技能要求:(1)理解单片机的引脚与软件操作的对应关系。(2)掌握单片机控制发光管亮灭的电路设计及程序编写。熟练应用“输出数据”命令。(3)掌握位运算、循环移位函数的应用。(4)掌握简单的头文件编写方法,掌握无参函数的设计与调用。

2.1任务1:点亮一个灯用单片机控制一个发光管亮起来。掌握用sbit进行引脚定义;掌握单片机控制LED的硬件电路设计;掌握通过对引脚位变量的赋值来控制LED亮灭的指令书写。一引脚,

一位

P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0权值27

26

25

2423

22

21

202进制→16进制,从右到左,4位一分隔

23222120

23222120

高4位低4位 8421

842110进制2进制16进制10进制2进制16进制000000910018+0+0+19200100+0+2+021311018+4+0+1D701110+4+2+171511118+4+2+1F8100082.1.1一位引脚定义和应用

一位引脚定义——sbitsbit位名=特殊功能寄存器名^整型常数位编号

sbitP10=0x90^0;sbitP10=0x90;sbitled=P1^0;sbitled3=P1^3;

用户设置的位定义:bit位名

=位地址某引脚,

某位变量2.1.2sfr,一组引脚定义、输入/出一字节数据sfr为字节型(8位二进制)特殊功能寄存器类型,占一个内存单元,利用它可以访问MCS-51内部的所有特殊功能寄存器。如单片机的4组IO口,P0、P1、P2、P3。如:sfrP0=0x80; P0=0x12;//从P0口输出十六进制数据12(即时从P0.7~P0.0输出8位二进制数00010010)单个引脚,位操作8位引脚,寄存器操作,一字节数据并行操作先定义指向特定地址,再进行读写操作一组引脚,

寄存器变量应用电子技术2.1.3亮灯逻辑1、引入:灯亮原理电流条件电压条件结论:灯亮条件(1)正向电压2~5V(2)额定电源10mA2.1.4PROTEUS元件操作-自习2.1.5亮一个灯的电路、程序设计sfrP1=0x90;sbitled=P1^0;voidmain(void) {for(;;) {led=0; }}

阳极固定高电平阴极受控1:灭0:亮初始化,位定义亮灯总结:输出低电平:位引脚=0输出高电平:位引脚=1//LED11.czlb2015-1点亮一个发光管//#include<reg51.h>//包含51单片机的硬件资源定义的头文件sfrP1=0x90; //P1口对应的特殊功能寄存器定义,地址0x90sbitled=P1^0; //引脚的位定义,代表P1.0引脚的位变量为led/*****************************************函数名称:main*输入:无输出:无*功能:函数主体注意多行注释的格式/**/******************************************/voidmain(void) //有且只有一个MAIN函数{ for(;;) //死循环

{//清0,即输出低电平,灯亮

led=0; }}2.1.6编译、代码下载、仿真、测判加载目标代码文件*.HEX、设置时钟频率

2.仿真调试

图2-10加载目标代码文件和设置时钟频率P1.0相连的发光管亮了?仿真、单步、暂停、停止2.1.7STC单片机代码下载图2-11STC单片机的代码下载软件包下载软件→安装驱动→连接硬件→设置确认串口→下载一般会自动识别,有问题时可通过上面第三步确认123.Bin\Hex图2-13STC单片机代码下载软件操作示意图4.先单击“下载”,再对目标板上电2.1.8

实物制作与上电测试虚实结合仿真快速开发实际运行测试2.1.9进阶设计与思路点拨1:亮多个灯2.1.9进阶设计与思路点拨1:亮多个灯①控制P1.1上的发光管亮,程序如何修改?●思路点拨

P1.1引脚按位操作时,先经sbit定义再使用。②控制P1.2上的发光管亮③控制P1.3上的发光管亮?④控制P1.4上的发光管亮?⑤控制P1.0、P1.1、P1.7上的发光管亮,程序如何修改?●思路点拨多个引脚按位操作时,均要先经sbit定义。相应的发光管要亮,对它们依次赋值为0即可。流程如图2-16所示。2.1.9进阶设计与思路点拨1:亮多个灯⑦控制P1.7---P1.0上的发光管亮,使其表示自己的学号,灯亮表示1,灯灭表示0,程序如何修改?

P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0如学号23,原始值00100011灯的亮/灭灭灭亮灭灭灭亮亮实际控制逻辑11011100实际输出的十六进制数据DC高4位低4位P1=0xdc;应用电子技术2.1.10进阶设计与思路点拨2:

用简易数码管显示自己的学号数字集成电路引脚—1bit掌握4位2进制简便识别方法:8421码:

2322212084211/01/01/01/04位2进制数X3X2X1X0b=(8*X3+4*X2+2*X1+1*X0)100011红点:1蓝点:0认识简易数码管#include"reg51.h"sbitP1_0=P1^0;sbitP1_1=P1^1;sbitP1_2=P1^2;sbitP1_3=P1^3;voidmain(){P1_0=1;P1_1=0;P1_2=0;P1_3=0;}如在BCD数码管上显示“1”简易数码管显示学号①题目:②电路设计:在PROTEUS中完成电路设计,补全图1,补上振荡、复位电路,EA引脚接正电源。(报告中要求画完整的电路)③画流程图④程序设计:在KEIL中完成程序设计,源程序的扩展名为.c,注意设置输出选项。(在管理器窗口target上右击,选optionfortarget,选弹出窗口的output,再选中createHEX复选框,按确定后,再编译。报告中要求写出程序)。同时设置输出OMF文件。⑤仿真调试。⑥问题解决与收获作业:实践报告2.2任务2:有规律变化的花样灯-亮点流动2.2.1任务要求与分析

8个发光管,每一刻只有一个亮,亮点由低位向高位循环流动。1.掌握显示的顺序输出控制。2.学会将一串显示效果分解为一个个稳定状态,然后按先后次序主线将它们一一串起来。即按一定的顺序依次输出控制数据。3.掌握循环移位函数_crol_()的应用。

2.2任务2:有规律变化的花样灯-亮点流动2.2.1任务要求与分析

8个发光管,每一刻只有一个亮,亮点由低位向高位循环流动。命令执行时长nus每个状态的时间约500ms每个状态命令后的延时以维持状态2.2.2头文件reg51.h解读硬件资源用sfr、sbit等统一定义成一个头文件,供所有应用该单片机的控制源程序调用。头文件引用格式:#include<文件名>//搜索优先顺序:关键字INCDIR指定的编译器包含文件路径C51库函数头文件

用户工程文件所在路径。

#include“文件名”//用户工程文件所在路径C51库函数头文件

2.2.2头文件reg51.h解读#include<reg51.h>包含后可引用其中的寄存器和特殊位大小写要一致

2.2.3亮点流动的程序设计-依序而下#include<reg51.h>//包含定义特殊功能寄存器的头文件

//包含定义特殊功能寄存器的头文件voidDly()/*延时函数,约0.5s*/{unsignedchari;unsignedintj;for(j=0;j<655;j++)

{for(i=0;i<252;i++)

{;}

}}voidmain(){star:P1=0xFE;Dly();P1=0xFD;Dly();P1=0xFB;Dly();P1=0xF7;Dly();P1=0xEF;Dly();P1=0xDF;Dly();P1=0xBF;Dly();P1=0x7F;Dly();gotostar;}2.2.4编译、代码下载、仿真、测判2.2.5应用移位库函数_crol_

设计亮点流动封闭的循环移位函数:左移、右移N位图2-20循环移位函数说明_crol_(,)、_irol__(,)、_lrol_(,)、2.2.5应用移位库函数设计亮点流动程序

_cror_(,)、_iror_(,)、_lror_(,)。2.2.5应用移位库函数_crol_设计亮点流动下一状态数据=上一状态数据循环左移1位=_crol_(上一状态数据,1)

OutData=_crol_(OutData,1);//循环左移

2.2.5应用移位库函数_crol_设计亮点流动voidmain() //有且只有一个主函数{unsignedcharOutData;OutData=0xFE;star:P1=OutData;//数据输出

OutData=_crol_(OutData,1);//循环左移

Dly();//调用延时函数

gotostar; //无条件跳转,实现无条件循环}思维方法与能力:动态分解→静态→分析出数据再按时间先后的主线一一串起,每个状态后必要的延时思路开放,一题多解!2.2.5应用移位库函数_crol_设计亮点流动深入理解移位函数将程序倒数第三句改一改,想一想:(1)OutData=_crol_(OutData,2);现象为:

(2)OutData=_crol_(OutData,3);现象为:

(3)OutData=_cror_(OutData,1);现象为:

总结移位函数的应用:作业:两个亮点从高位向低位循环流动。有电路有完整程序的截图1.电路和程序必须保存在同一文件夹中2.在KEIL中设置OMF文件并编译成功3.将OMF文件添加到单片机中4.仿真成功后,暂停仿真5.若无源程序程序弹出,点击菜单debug,选8051CPUsourcecode作业提交说明2.3任务3:有规律变化的花样灯-一一亮起来2.3.1任务要求与分析

1.任务要求8个发光管,依次亮起来,即亮一个,亮两个……8个全亮,循环。假设从最低位亮起。掌握分解与主线串联的问题分析方法;学习现象分析并用表达式表示;掌握goto语句应用。掌握位运算符:与(&)、或(|)、异或(^)、非(~);开放的左移(<<)右移(>>)的应用。2.3.1任务要求与分析2.3.2用“位”运算符实现一一亮灯1.位的逻辑运算符~:将一个数的各二进制位取反,即将0变为1,1变为0。2.3.2用“位”运算符实现一一亮灯2.位的移位运算符<<:将一个数的各二进制位全部左移若干位,右面补0,高位左移后溢出舍弃。

>>:将一个数的各二进制位全部右移若干位,无符号数高位补0,低位右移后溢出舍弃。

a=0xc3;//a为8位,char型,a=11000011Ba=a<<2; //a=1100001100B=0x0c=12。超界丢弃补入0a=0xc3;//a为8位,char型,a=11000011Ba=a>>2;//a=0011000011B=0x30。超界丢弃补入02.3.2用“位”运算符实现一一亮灯则下一状态由上一状态经表达式:OutData=OutData<<1;得到应用电子技术2.3.3预处理:条件编译:#if#else#endif等预处理:对源程序编译之前做一些处理,生成扩展C源程序。一般情况下对C语言程序进行编译时,所有的程序行都参加编译,但如果要对其中的一部分内容进行编译,可以使用条件编译。选择不同的编译条件,产生不同的代码,可为一个程序提供多个版本,实现不同的版本功能,广泛应用于商业软件。条件编译的格式为:2.3.4自定义头文件:dly05s.h模块化设计的必要!只要包含,#include””,即可调用头文件中的函数!减少重复写代码,提高程序的复用率2.3.4设计延时函数头文件“dly05s.h”

#ifndef__DLY05S_H__//如果没有定义__DLY05S_H__,则定义,避免重复定义。#define__DLY05S_H__voidDly05s(void){unsignedchari; //变量i定义为无符号字符型,8位二进制位数

unsignedintj; //变量j定义为无符号整型,16位二进制位数for(j=0;j<655;j++)

{ for(i=0;i<252;i++) {;} }}#endif//条件编译结束保存在自己的工程文件夹中,经:#include”dly05s.h”,再调用Dly05s();2.3.5流程与程序设计2.3.7进阶设计与思路点拨3:

1-8个灯逐一熄灭状态数据的实现算法下一状态数据=(上一状态数据<<1)|0x01

表示状态的变量为OutData,表达式为:OutData=(OutData<<1)|0x01

注意:共9个状态!头文件不仅定义硬件资源,如REG51.h

还可做为功能函数的仓库,只要包含就可调用其中的函数特别提醒1.工程中加C不加H2.4高低4位交替闪烁2.4.1任务要求与分析1.任务要求8个发光管,高4位与低4位交替闪。假设初始状态为高4位灭,低4位亮。掌握分解与主线串联的问题分析方法;学习现象分析并用表达式表示;掌握用goto语句应用。灵活应用位运算符及移位函数。2.4任务4:高低4位交替闪烁1111,0000取反:0000,1111

移位函数:高低4位位置互换X:1111,0000_crol_(X,1):1110,0001_crol_(X,1):1100,0011_crol_(X,1):1000,0111_crol_(X,1):0000,1111_crol_(0xf0,4):0000,1111_cror_(0xf0,4):0000,1111

异或逻辑运算

1111,0000^1111,11110000,1111相同为0,相异为12.4.2流程与程序设计#include<reg51.h>//特殊功能寄存器定义的头文件#include<intrins.h> //包含循环移位函数//延时函数,约0.5s//包含自定义延时函数所在的头文件,其设计见2.3.4节#include<dly05s.h>voidmain() //主函数,有且只有一个{unsignedcharOutData; //变量定义为无符号字符型

OutData=0xF0;star: P1=OutData; //数据输出

//OutData=~OutData;//取反,3种高低4位互换的方式任选一种

//OutData=OutData^0xff; //与FF异或

//OutData=_crol_(OutData,4); //循环左移4位

OutData=_cror_(OutData,4); //循环右移4位

Dly05s(); //调用延时函数

gotostar;

//无条件跳转,实现无条件循环}一题多解两个亮点相向2.4.4两个亮点相背运动2.4.4进阶设计4:两个亮点相向或相背运动1.相向运动任务要求8个发光管,最高位和最低位的两个亮点相向运动,相邻时重新循环。学习现象分析并用表达式表示。2.任务分析:

3.任务实现#include"reg51.h“#include”dly05s.h”voidmain() //主函数有且只有一个{unsignedchari,OutData; //变量定义为无符号字符型star0:i=

; OutData=

;star:P1=OutData; //数据输出

OutData=__________________;Dly05s();i++;if(___________)

gotostar0;

gotostar;}STARSTAR0PROTEUS源码调试要求1.文件、文件夹命名不要出现中文,以字母、数字、下划线组成2.电路文件与程序保存在一个文件夹下3.在KEIL中设置输出OMF文件4.在PROTEUS的单片机中加载OMF文件加载OMFOMF保存文件文件夹命名4.两个亮点相背运动可参考表2-12把数据变化规律分析清楚,先完成表2-13。程序流程参考图2-24,注意数据初始化及数据处理的不同。程序框架参考2.4.4节。请自行分析、设计、仿真调试。下一状态数据(((上一状态数据>>1)&0x0F)|0x08)|(((上一状态数据<<1)&0xF0)|0x10)

注意括号()匹配两个亮点相向2.4.5两个亮点相背运动2.4.5进阶设计5:

移位函数实现两个亮点相向运动封闭的循环移位函数:左移、右移N位图2-20循环移位函数说明_crol_(,)、_irol__(,)、_lrol_(,)、_cror_(,)、_iror_(,)、_lror_(,)。回顾移位函数的操作特点2.4.5进阶设计5:移位函数实现两个亮点相向运动高4位右移,左入1,所以入高位的低位数据应是1高4位独立由一字节7F依次移位可得故:低4位独立由一字节FE依次移位可得低4位左移,右入1,所以移入低位的高位数据应是1高低4位分别由两个变量独立变化再组合成状态数据2.4.5进阶设计5:移位函数实现两个亮点相向运动注意括号()匹配STARSTAR0初始化,OutData,i=0OutData1=0x7f,OutData2=0xfe数据处理数据输出P1=OutData延时状态数累计+1状态数i==4?否是OutData=((_cror_(OutData1,i))&0xF0)|((_crol_(OutData2,i))&0x0F)

2.4.6进阶设计与思路点拨6自行完成:用移位函数实现两个亮点相背运动思维方法与能力:动态分解→静态→分析出数据数据变化规律→分析与构建表达式,用IF语句判断状态记数、监控思路开放,一题多解!2.5任务5:3种效果的花样灯设计任务与要求设计一个花样灯,有多种显示花样。根据2.2~2.4节,将它们的显示效果串联起来,即先亮点流动一个循环,接下来依次亮起来,最后高低4位交替闪烁一次,如此三种效果循环显示。设计4个函数,由主函数循环调用2.5任务5:3种效果的花样灯设计#include<reg51.h"> //特殊功能寄存器定义的头文件#include<intrins.h>

//包含循环移位函数//包含自定义延时函数所在的头文件,其设计见2.3.4节#include<dly05s.h>#defineucharunsignedchar//宏定义,以uchar代替unsignedchar简化书写#defineOutportP1 //数据输出IO口宏定义voidflow(void); //函数声明,只有函数头,没有函数体 //注意加分号voidled1_8(void);voidshyH_L(void);voidmain() //主函数,有且只有一个{star: flow(); //函数调用

led1_8(); shyH_L(); gotostar; //无条件跳转,实现无条件循环}2.5任务5:3种效果的花样灯设计//亮点移动函数

voidflow(void){uchari=0,OutData=0xFE;loop:Outport=OutData;//数据输出

OutData=_crol_(OutData,1);//循环左移

Dly05s(); //调用延时函数

i++; //状态数+1,累计

if(i<8) //状态数判断gotoloop;

//无条件跳转}

函数中循环的有限次执行控制2.5.4在Keil中进行延时程序调试掌握Keil的基本调试方法,自行完成!2.6算术运算、赋值运算算术运算算术运算符:(+:加;-:减;*:乘;/:除;%:整数求余;++:自加1;--:自减1;) 自增(++)、自减(--)运算符的作用是使变量值加1或减1。包括前置和后置两种形式: 前置++i,--i(先执行i+1或i-1,再使用i值) 后置i++,i--(先使用i值,再执行i+1或i-1)

例如:

j=3;k=++j; //执行后k=4,j=4 j=3;k=j++; //执行后k=3,j=4++在前先加后用,++在后先用后加。2.6算术运算、赋值运算2.6.2赋值及复合赋值运算1.“=”赋值运算符变量=表达式;例如:

a=0xFF; //将常数十六进制数FF赋于变量a b=c=33; //同时赋值给变量b,c d=e; //将变量e的值赋于变量d f=a+b; //将变量a+b的值赋于变量f2.复合赋值运算符复合赋值运算符有+=-=*=/=%=<<=>>=&=^=|=2.7函数说明有且只能有一个名为main的主函数C程序的执行总是:始于main,止于main函数不能嵌套定义但可嵌套调用。函数调用2.7.1函数格式//函数定义,包括返回值类型、函数名(形式参数声明列表)等,如下。

返回值类型函数名(形参表)[函数模式][reentrant][interruptm][usingn]//

函数体,由一对大括号“{}”括起来。

{

局部变量定义 执行语句 //完成一系列功能或算法处理

[return][……] //返回或返回数据

}应用电子技术2.7.2函数调用中参数的传递函数调用的一般形式如下:

函数名(实参列表) 对于有参数的函数调用,若实参列表包含多个实参,则各个实参之间用逗号隔开。 按照函数调用在主调函数中出现的位置,函数调用方式有以下三种:

(1)函数语句。把被调函数作为主调用函数的一个语句,这时不要求函数返回值,只要求函数完成一定的操作,如,dly05s();dly_nms(100);

(2)函数表达式。函数被放在一个表达式中,以一个运算对象的方式出现。这时要求被调函数带有返回语句,以返回一个明确的数值参加表达式的运算。如:c=2*max(a,b);

(3)函数参数。被调函数作为另一个函数的参数。如:disply(max(a,b));2.7.2函数的调用中参数的传递两个数据交互的函数:#include<stdio.h>图2-30参数的传值分析voidmain(){intx=7,y=11;

swap(x,y);//(实参,传递x,y的数值)}voidswap(inta,intb)//(形参,被调时才分配存储地址){inttemp;//参数传递的效果:a=x;b=y;temp=a;a=b;b=temp;//结果:a、b中的值互换了}X、 y的值互换了吗由此可见,数值传递不能解决主调程序中数据的互换。只有传地址才能实现要求。2.7.3自定义函数的声明函数类型函数名(形式参数表);数的声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便调用函数时系统进行对照检查。函数的声明后面要加分号。

外部函数声明:extern函数类型函数名(形式参数表);调用的函数不在本文件内部,而在其他C文件中,则声明时须带extern:2.7.4预处理:#include引用库、自定义函数通过包含该头文件,可引用其中的函数,格式特点是:(1)“#”开头;(2)占单独书写行;(3)语句尾不加分号。

1、包含库文件如:#include<reg51.h>、#include<stdio.h>

2、包含自定义文件

#include”***.h”一个include命令只能包含一个头文件文件包含可以嵌套,但要注意次序。2.7.5设计变时长的延时函数头文件dly_nms.hDly_nms(400);探索、发现、技能、价值2.7.6进阶设计与思路点拨7:变速流水灯可设计某种亮灯规律的流水灯:(1)速度越来越快,或越来越慢;(2)以浙变的速度在最快与最慢速度间循环运行。小结1、建立用指令语句来操作硬件的思想。理解软硬件间的对应关系。一个引脚输入/输出——一位二进制数据一组引脚P0~P3——输出输入一字节(8位二进制)数据2、掌握程序开发过程:任务分析→电路设计→确定方案绘制流程→程序编写→仿真调试代码下载→实际运行调试。3、理解逻辑运算符,灵活应用位运算符:与(&)、或(|)、异或(^)、非(~);开放的左移(<<)右移(>>);移位函数,如_crol_()、_cror_()等。4、掌握算术运算符+、-、*、/、%;++、--;注意++i,和—i的区别。5、认识复合赋值运算符:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。6、函数、头文件是C结构化程序设计的主要元素,注意应用、体会、掌握。根据头文件的访问次序,一般引用库中的头文件通过#include<>,而存放于自己工程所在的文件夹中的自定义头文件通过#include”

”。7、编译预处理包括引用头文件、条件编译和宏定义(其中宏定义的内容见4.1.5)。思维方法与能力:动态分解→静态→分析出数据再按时间先后的主线一一串起,每个状态后必要的延时思路开放,一题多解!习题与思考二1.试设计4种花样灯的流程及程序,并完成仿真调试。2.数据在计算机中保存是以

进制的形式存储,数据存放的位置就是它的

。3.bit是

其值是

。4.分析以下赋值语句是否正确?在以下()中打√或X(赋值的左边只能是一个变量)(1)intx=y=10:()(2)intx,y;x=y=10;()//定义完成后,可以连续赋值。(3)intx=7.7; ()(4)floaty=7; ()

5、inta=2;

a*=2+3;运行完成后,a的值是____________。项目3:键控花样灯超星学银在线开放课程:

单片机C语言程序设计

目标:能正确判断独立按键的输入,能通过各种语句、运算输出各种数据控制一组LED以不同的方式显示

知识与技能要求:(1)掌握独立按键输入电路及输入指令。(2)掌握由if语句、switch语句等构成的分支结构;(3)掌握while、for等循环语句的应用。

3.1任务1:键控灯1:用if语句实现3.1.1任务要求与分析1.任务要求K1按下,P1口的LED全亮,K2按下,P1口的LED全灭。3.1.1任务要求与分析建立对控制系统输入/输出的认识。掌握独立按键的状态判别。认识if语句,掌握初步应用。2.任务分析:3.1.2if条件语句结构if语句用来判定所给的条件是否满足从而决定执行的顺序。if语句有以下3种形式。单分支if(表达式) {语句;}双分支

if(表达式) {语句1;}else{语句2;}3.1.2if条件语句结构-多分支当有多个分支选择时,可采用if-else-if语句,其一般形式为:if(表达式1){语句1;} elseif(表达式2){语句2;} elseif(表达式3){语句3;} …… elseif(表达式n-1)

{语句n-1;}else{语句n;}多分支前两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为:

if(表达式1){语句1;} elseif(表达式2){语句2;} elseif(表达式3){语句3;}

…… elseif(表达式n-1){语句n-1;}else{语句n;}3.1.2if条件语句结构例:根据不同的工资水平salary,设置其对应的比例系数index:当工资salary>1000,index=0.4;当工资800<salary<=1000,index=0.3;当工资600<salary<=800,index=0.2;当工资400<salary<=600,index=0.1;当工资salary<=400,index=0.05;程序语句的实现:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0.05;if语句总结:If语句的执行是根据if关键字之后的表达式的值是0还是1来决定程序的走向。该表达式通常是逻辑表达式或关系表达式、算术表达式、一个变量,甚至是一个常量,但也可以是其他表达式,如赋值表达式等。在if语句中,条件判断表达式必须用括号()括起来,在语句之后不用加分号。所有的执行语句最好用大括号{}括起来,if(a>b) { a++;b++;}else {b=10;}//或省略{},直接写成b=10;

特别注意:省略{}时,else总是和它上面离它最近的未配对的if配对。应用电子技术3.1.3关系运算符和关系表达式

表达式1关系运算符表达式2(1)a>b;//若a大于b,则表达式值为1(真)(2)b+c<a;//(b+c)<a;若a=3,b=4,c=5,则表达式值为0(假)(3)(a>b)==c;//若a=3,b=2,c=1,则表达式值为1(真)。(4)c==5>a>b;//c==(5>a>b);若a=3,b=2,c=1,则表达式值为0(假)。(5)x1=3>2;结果是x1=1,(6)请自行分析x2=3<=2;的结果是

。3.1.4程序流程及程序设计非零按下K1?初始化,位定义按下K2?灯亮灯灭K1按下灯全亮,K2按下灯全灭YYNN#include"reg51.h"sbitk1=P3^2;sbitk2=P3^3;voidmain(){ for(;;) { k1=1;k2=1;

if(k1==0)

P1=0;

if(k2==0) P1=0xff; }}3.1.5仿真、分析、记录3.2任务2--键控灯2用if-else语句实现3.2任务2:键控灯2:用if-else语句实现3.2.1任务要求与分析1、任务要求控制电路如图3-1所示。按住K1灯亮;松开K1灯灭。2、任务分析:控制框图如图3-7所示。因条件判断只有一个,K1是否按下;条件成立与否执行不同的语句,所以用if-else语句即可实现控制。建立对控制系统输入/输出的认识。掌握独立按键的状态判别。认识if-else语句,掌握初步应用。3.2.2程序流程及程序设计3.2.3仿真、分析、记录进行仿真调试。填写表,并分析、做解释说明。将代码下载到实物板进行测试。3.3任务3--键控灯3用if-else-if多分支语句3.3任务3:键控灯3:用if-else-if多分支语句3.3.1任务要求与分析1、任务要求:控制电路如图3-1所示。按下K1点亮LED,按下K2熄灭LED,且K2优先,只要K2被按下LED就不能被点亮。2、任务分析:控制框图如图3-9所示。根据任务,不管是否按下K1,只要K2按下灯灭。只有K1一个键按下灯才亮。所以先判断K2,K2未按下时再判断K13.3.2程序流程及程序设计建立对控制系统输入/输出的认识。掌握独立按键的状态判别。初步掌握if-elseif多分支语句的应用。3.3.3仿真、分析、记录将代码下载到实物板进行测试。PROTEUS源码调试要求1.文件、文件夹命名不要出现中文,以字母、数字、下划线组成2.电路文件与程序保存在一个文件夹下3.在KEIL中设置输出OMF文件4.在PROTEUS的单片机中加载OMF文件加载OMFOMF保存文件文件夹命名3.4任务4--键控灯4用if嵌套语句实现3.4任务4:键控灯4:用if嵌套语句实现3.4.1任务要求与分析1、任务要求:K1和K2按下全亮,K2松开不灭,K1松开全灭。2、任务分析:K1按下时再判断K2,即K1条件满足时嵌套判断K2的状态。判断K1用if-else结构,一旦K1未按下,经else语句控制灯灭。建立对控制系统输入/输出的认识。掌握独立按键的状态判别。初步掌握if语句的嵌套应用。3.4.2if语句嵌套3.4.2if语句嵌套省略{}时,else总是和它上面离它最近的未配对的if配对,如图3-13所示。3.4.3程序流程及程序设计3.4.4仿真、分析、记录将代码下载到实物板进行测试。谋写仿测判PROTEUS源码调试要求1.文件、文件夹命名不要出现中文,以字母、数字、下划线组成2.电路文件与程序保存在一个文件夹下3.在KEIL中设置输出OMF文件4.在PROTEUS的单片机中加载OMF文件加载OMFOMF保存文件文件夹命名3.5任务5--键控灯5用switch多分支语句3.5任务5:键控灯5:switch多分支语句3.5.1任务要求与分析1、任务要求:按K1,P1.0,P1.4灯亮;按K2,P1.1,P1.5灯亮;按K3,P1.2,P1.6灯亮;按K4,P1.3,P1.7灯亮。2、任务分析:3.5.2switch语句switch(表达式)

{

case

常量表达式E1:语句组1;break;

case

常量表达式E2:语句组2;break;

……

case

常量表达式En:语句组n;break;

default: 语句组n+1;break;

}3.5.3程序流程与程序设计3.5.3程序流程与程序设计应用位运算符设置一字节中的某些位:或1变1,设置部分为输入无关位或0不变3.5.4仿真、分析、记录将代码下载到实物板进行测试。试用switch语句来改写3.1.2中的工资系数的程序谋写仿测判3.5.5Proteus单步调试1.修改程序,绘流程图在键控灯5中,若无break,程序执行情况会如何?绘流程图体会break的作用。自行跟着教材学习:掌握Proteus的代码单步调试功能,理解、监测程序运行。PROTEUS源码调试要求1.文件、文件夹命名不要出现中文,以字母、数字、下划线组成2.电路文件与程序保存在一个文件夹下3.在KEIL中设置输出OMF文件4.在PROTEUS的单片机中加载OMF文件加载OMFOMF保存文件文件夹命名3.5.6进阶设计11.进阶设计(1)将P1口的发光管改为BCD数码管,将一个BCD数码管接到P1.0-P1.3。电路可参考2.1.10节。修改程序使之有如下功能,并画出程序的流程图。点击K1,BCD数码管显示1,松开维持显示;点击K2,BCD数码管显示2,松开维持显示;点击K3,BCD数码管显示3,松开维持显示;点击K4,BCD数码管显示4,松开维持显示3.5.6进阶设计12.进阶设计(2)试修改进阶设计(1),按下K1~K4,BCD数码管显示1~4,松开显示F。注意default语句应用。3.进阶设计(3)试用if语句完成进阶1。比较if多分支结构与SWITCH语句结构。灵活选用便捷的语句。3.6任务6--学习循环结构3.6任务6:学习循环结构,求C语言可实现循环的语句:(1)goto语句(2)while语句(3)dowhile语句(4)for语句3.6.1goto语句goto语句一般格式:goto标号;

……标号:语句;功能:无条件转移语句不能用整数作标号;标号只能出现在goto所在函数内,且唯一;只能加在可执行语句前面;尽可能少使用goto语句。3.6.1goto语句用if和goto语句编程求解:。3.6.2while语句while(表达式) {语句

;}循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)

{循环体;}用while语句编程求解:循环体表达式假(0)真(非0)while图3-25while结构示意3.6.3do-while语句do-while语句的一般形式为:do{

语句; }while(表达式);3.6.4for语句for(表达式1;表达式2;表达式3)

{语句;}for(循环变量初值;循环条件;循环变量增值)

{语句}例如:for(j=0;j<8;j++) {;}//循环体执行几次?J=0123456712345678用for语句编程求解:,完成以下填空,并编写完整程序进行测试。unsignedcharj;unsignedintsum=0;//定义加数、和数 for(j=

;j<

;j++) {sum=

;}for语句中表达式类型任意,都可省略,但分号“;”不可省。无限循环:for(;;)for语句可以转换成while结构3.6.5循环结构的嵌套与跳转总结:三种循环可互相嵌套,理论上层数不限,但实际应用时要考虑硬件资源能否承受。

外层循环可包含两个以上内循环,但不能相互交叉。禁止:从外层跳入内层;跳入同层的另一循环;向上跳转。3.6.6-7break、continue语句 BREAK功能:在循环语句和switch语句中,终止并跳出循环体.说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其他语句之中。CONTINUE功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。sum-仿真、分析、判断谋写仿测判PROTEUS源码调试要求1.文件、文件夹命名不要出现中文,以字母、数字、下划线组成2.电路文件与程序保存在一个文件夹下3.在KEIL中设置输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论