




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四部分单片机实验基础篇前
言
C语言主要有三种结构:顺序结构、选择结构、循环结构。不管哪几种结构,所有的程序都是从main函数开始的。本章节通过五个项目的实例讲解,复习第三部分中C语言基础:常量和变量;运算符与表达式;分支语句,包括:if、if-else、switch;循环语句,包括:while、do-while、for;函数的调用等。4.1LED显示LED是日常生活中运用广泛的显示器件之一,包括LED灯、数码管等。本小节我们通过LED灯程序,学习IO口的位控制、并行操作。【例4.1.1】硬件电路如图4.1.1所示,参数如表4.1.1。设计一个LED闪烁灯:让P1.0为高电平,延时一段时间后,让P1.0为低电平。以此循环就可以让D1闪烁。表4.1.1序号元件元件参数Proteus中元件名1电阻R1:10K;R2:300欧RES2电容C1:10uF;C2、C3:30PCAP3LEDD1:红色LED-RED4晶振X1:12MCRYSTAL5单片机AT89C51AT89C51图1.1.2上拉电阻4.1LED显示#include<REGX52.H>//单片机头文件,包含相关特殊寄存器物理映射。voiddelay()//延时程序{unsignedinti=50000;//局部变量i。while(i--);}voidmain(void){while(1)//死循环{P1_0=1;//让P1.0输出高电平,LED灭。delay();//延时函数的调用P1_0=0;//让P1.0输出低电平,LED亮。delay();//延时函数的调用}}//////////////////////////////////////////////////////////////////////////////此后,双击Proteus中AT89C51,将ProgramFile路径指向KeiluVision4生成的HEX文件,即可在Proteus中看到仿真结果。图4.1.1中单片机18、19脚的晶振电路和9脚的复位电路在仿真中可以不用画出。4.1LED显示【例4.1.2】为了更好的描述程序与硬件的关系,例4.1.1的程序经常使用sbit、define等语句让程序通俗易懂、方便修改。#include<REGX52.H>#defineon0//用define定义on为0,以下所有on都表示为0。#defineoff1//用define定义off为0,以下所有off都表示为1。sbitLED1=P1^0;//用sbit定义LED1为单片机的P1.0引脚voiddelay(void)//延时程序{unsignedinti=50000;//局部变量i。while(i--);}voidmain(void){while(1)//死循环{LED1=off;//让P1.0输出高电平,LED灭。delay();//延时函数的调用LED1=on;//让P1.0输出低电平,LED亮。delay();//延时函数的调用}}4.1LED显示【例4.1.3】硬件电路如图4.1.3所示,设计一个流水灯程序:让LED从上往下做流水动作,如表格4.1.3所示,用于练习并行口的程序编写。首先让P1值为0xfe,延时一段时间后让P1值为0xfd,以此类推到P1值为0x7f,并以此循环。(图4.1.3中R1是排阻,在Proteus中的元件名为:respack-8。单片机的外部晶振电路、复位电路在仿真中都可省略。)LEDD7D6D5D4D3D2D1D0P1值P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.00xfe111111100xfd111111010xfb111110110xf7111101110xef111011110xdf110111110xbf101111110x7f01111111表格4.1.3图4.1.3#include<REGX51.H>voiddelay(void)//延时函数{unsignedinti=50000;//局部变量i。while(i--);}voidmain(){while(1){P1=0xfe;delay();P1=0xfd;delay();P1=0xfb;delay();P1=0xf7;delay();P1=0xef;delay();P1=0xdf;delay();P1=0xbf;delay();P1=0x7f;delay();}}4.1LED显示【例4.1.4】上例4.1.3中程序可以采用调用数组的方法来实现。只要将P1的值存放于数组numtab[]中,并按顺序调用即可。此时可声明一个变量t,让t自加并调用numtab[]依次传输给P1。#include<REGX51.H>unsignedcharnumtab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voiddelay(void)//延时函数{unsignedinti=50000;//局部变量i。while(i--);}voidmain(void){unsignedchart;//局部变量t。while(1){P1=numtab[t];//将数组numtab[t]的值传输给P1。//P1=numtab[3];相当于P1=0xf7;delay();//延时函数的调用t++;//t自加。if(t>=8)i=0;//由于数组的值仅有8个,所以t的值不得大于等于8,//否则P1的值将是不确定值。}}////////////////////////////////////////////////////////////////////4.2独立按键
按键在电路设计中经常使用到,比如:时钟时间的调整、某种状态的确定或切换。现实中按键的各类很多,现的实物图如图4.2.1所示。
由于按键接触采用物理接触,所以在键按下时会出现抖动问题如图4.2.2。单片机在读取按键状态时应采用延时法做防抖处理:当判断按键按下时延时10ms左右,等到键稳定后再一次判断键是否按下再做相关处理。图4.2.2图4.2.14.2独立按键【例4.2.1】硬件电路如图4.2.3所示,设计一个程序:采用单片机的P3.0读取独立按键的逻辑状态,通过P2.7的控制LED:当按键按下时让LED亮,否则不亮(按键在Proteus库中的元件名为:BUTTON)。图4.2.34.2独立按键#include<REGX51.H>sbitkey=P3^0; //定义硬件的接口sbitled=P2^7;#definekey_on0//定义相关常量#definekey_off1#defineled_on0#defineled_off1voiddelay()//延时函数{unsignedinti=10000;while(i--);}voidmain(){while(1) //死循环{key=key_off; //将P3.0电平拉高,以方便检测期是否为低电平。if(key==key_on)//判断P3.0是否为低电平。{delay(); //延时程序,防抖等待键稳定。if(key==key_on) { led=led_on;//当有键按下时,让LED亮。 } while(key==key_on);//松手检测,等待手放开按键弹起。}elseled=led_off;//当无键按下时,LED灭。}}说明:上诉程序中while(key==key_on)是对按键按下的等待:当有键按下时,LED灯亮后执行到该语句,此时key的值为0也就是key_on,此时该语句相当于while(1),程序将一直停于该处;当键无按下时,key的值不为1,while(key==key_on)不成立,程序继续往下执行。4.3静态数码管显示数码管是将LED按一定的排列封装起来,如图4.3.0所示数码为8段数码管(由8个LED组成,分别为a,b,c,d,e,f,g,DP)。按公共端结构可将其分为两类:共阴数码管和共阳数码管。共阴数码管是将LED的阴极连接在一起,共阳数码管是将LED的阳极连接在一起。图4.3.04.3静态数码管显示【例4.3.1】硬件电路如图4.3.2所示,设计一个共阴数码管显示程序:让数码管从0显示到9并以此循环。如表格4.3.1所示,只要单片机I/O引脚给适合的值,数码管就会显示相对的数字。比如要显示0:让数码管的a、b、c、d、e、f段为高电平,g、DP为低电平,数码管将会显示0;对应的单片机I/O引脚只需让P1.0~P1.5为高电平,P1.6、P1.7为低电平,P1的值为0x3f。由此,就可以推出显示其他数字时P1的值。(共阴数码管在Proteus库中的元件名为:7SEG-COM-CAT-GRN)。表4.3.1数码管DPgfedcba
显示内容P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0P1值0001111110x3f1000001100x062010110110x5b3010011110x4f4011001100x665011011010x6d6011111010x7d7000001110x078011111110x7f9011011110x6f图4.3.14.3静态数码管显示#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管代码表voiddelay()//延时函数{unsignedinti=50000;while(i--);}voidmain(){unsignedchart;while(1){P1=num[t++];if(t>9)t=0;//当t大于9时将t清零。delay();}}////////////////////////////////////////////////////////////////////4.3静态数码管显示【例4.3.2】硬件电路如图4.3.2所示,采用独立按键和数码管设计一个程序实现以下功能:按键每按一次,数码管加1;当数码管加到9后又从0开始。图4.3.1#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管代码表sbitkey=P2^0; //定义硬件的接口#definekey_on0#definekey_off1voiddelay()//延时程序,用于按键防抖。{unsignedinta=10000;while(a--);}voidmain(){unsignedchari;//定义i,用于计算按键按下次数。while(1){P1=num[i];//用P1显示按键按下的次数。if(key==key_on)//检测按键是否按下。{ delay();//防抖 if(key==key_on) { i++;if(i>9)i=0;//每次按键按下i加1;如果i等于10,i变为0。 } while(key==key_on);//检测按键是否松手放开。}}}///////////////////////////////////////////////////////////////////////////4.4动态数码管显示将2位及以上数码管的数据端分别接在一起,即第一个数码管的a段与第二个数码管的a段接起来(可以多个数码管),以此接完所有LED,并留出每位数码管的公共端如图4.4.0。动态方式显示时,各数码管分时轮流选通,在某一时刻只选通一位数码管,并送出相应的字型码(如表4.3.1),在另一时刻选通另一位数码管,并送出相应的字型码,依此规律循环,即可使各位数码管显示将要显示的不同字符。但由于人眼存在视觉暂留效应,只要每位显示间隔足够短就可以给人同时显示的感觉。一般的,每位数码管显示周期20ms即可,周期太短会有重影,周期太长会有闪烁现象。图4.4.04.4动态数码管显示【例4.4.1】硬件电路如图4.4.1所示,采用动态显示的方式让数码管从0显示到99,并以循环。2位数码管在Proteus中为:7SEG-MPX2-CC-BLUE。图4.4.1#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管代码表voiddelay(){unsignedinta=500;while(a--);}voidmain(){unsignedchari,j;//定义i,j;while(1){j++;if(j>100){j=0;i++;if(i>99)i=0;}P1=num[i/10];P3_0=0;P3_1=1;delay();P3_0=1;P3_1=1;//消影处理;P1=num[i%10];P3_0=1;P3_1=0;delay(); P3_0=1;P3_1=1;//消影处理;}}////////////////////////////////////////////////////////////////////////////以上程序定义i,让i自加。通过if语句判断:当i大于99时让i等于0,从而限制i的区间。当P3_0等于0时选通数码管的十位,显示的内容为i的十位,即:i/10。当P3_1等于0时选通数码管的个位,显示的内容为i的个位,即:i%10。4.5矩阵键盘与独立键盘不同,矩阵键盘如图4.5.0所示为4*4矩阵键盘。按键开关位于行与列的交叉点上,且每个开关的两端均分别与行、列线相连。图4.5.0矩阵键盘的程序一般采用逐行扫描的形式:首先:让P3值为0xff,让P30值为0。第二:查询P34、P35、P36、P37的值,确定第一列4个按键是否按下。第三:让P3值为0xff,让P31值为0。第四:查询P34、P35、P36、P37的值,确定第二列4个按键是否按下。第五:重复以上步骤至到查询完所有列。4.5矩阵键盘【例4.5.1】硬件电路如图4.5.1所示,设计一个矩阵键盘程序并将按键值显示在数码管上。图4.5.14.5矩阵键盘#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管代码表voiddelay()//延时程序,用于按键防抖。{unsignedinta=10000;while(a--);}voidmain(){unsignedchari;//定义i,用于计算按键值。while(1) {P1=num[i];//用P1显示按键值。 P3=0xff;P3_0=0;//扫描第一列; if(P3_4==0){delay();if(P3_4==0)i=0;while(P3_4==0);}//扫描第一列第一行 if(P3_5==0){delay();if(P3_5==0)i=4;while(P3_5==0);}//扫描第一列第二行 if(P3_6==0){delay();if(P3_6==0)i=8;while(P3_6==0);}//扫描第一列第三行 if(P3_7==0){delay();if(P3_7==0)i=12;while(P3_7==0);}//扫描第一列第四行 P3=0xff;P3_1=0;//扫描第二列; if(P3_4==0){delay();if(P3_4==0)i=1;while(P3_4==0);} if(P3_5==0){delay();if(P3_5==0)i=5;while(P3_5==0);} if(P3_6==0){delay();if(P3_6==0)i=9;while(P3_6==0);} if(P3_7==0){delay();if(P3_7==0)i=13;while(P3_7==0);} P3=0xff;P3_2=0;//扫描第三列; if(P3_4==0){delay();if(P3_4==0)i=2;while(P3_4==0);} if(P3_5==0){delay();if(P3_5==0)i=6;while(P3_5==0);} if(P3_6==0){delay();if(P3_6==0)i=10;while(P3_6==0);} if(P3_7==0){delay();if(P3_7==0)i=14;while(P3_7==0);} P3=0xff;P3_3=0;//扫描第四列; if(P3_4==0){delay();if(P3_4==0)i=3;while(P3_4==0);} if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030全球RJ11连接器行业调研及趋势分析报告
- 小河口水电站环境影响评价报告书【专业版】
- 老年三轮车项目投资可行性研究分析报告(2024-2030版)
- 中国全钢子午线轮胎市场规模预测及投资战略咨询报告
- 税务师经济法课程选择
- 中国活动板房行业市场发展现状及投资方向研究报告
- 2023-2028年中国泸州市房地产行业发展前景预测及投资战略咨询报告
- 塑料筛项目投资可行性研究分析报告(2024-2030版)
- 开锁服务合同
- 产学研合作合同
- 有限空间作业及应急物资清单
- DB13(J)∕T 8060-2019 城镇供热管道及设备安装工程施工质量验收标准
- 《国际商务》课程
- 压力容器设计管理制度
- 比亚迪员工手册54
- 国际经济学期末考试试题库含答案
- 应力波理论复习资料
- 基于PLC的音乐喷泉控制系统的设计-毕业设计
- 体育场地与设施
- 五年级部编版语文下学期修改病句专项强化练习题
- 民办非企业单位清算报告
评论
0/150
提交评论