C51单片机应用设计与技能训练(第2版)课件 任务6 交通信号灯控制系统的设计与制作_第1页
C51单片机应用设计与技能训练(第2版)课件 任务6 交通信号灯控制系统的设计与制作_第2页
C51单片机应用设计与技能训练(第2版)课件 任务6 交通信号灯控制系统的设计与制作_第3页
C51单片机应用设计与技能训练(第2版)课件 任务6 交通信号灯控制系统的设计与制作_第4页
C51单片机应用设计与技能训练(第2版)课件 任务6 交通信号灯控制系统的设计与制作_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

单片机最小系统

一、单片机复位电路1.复位工作方式复位操作就是使单片机内部的一些部件恢复到某种预先确定的状态。复位状态:除以下SFR外,其余SFR都被硬件自动写入0口锁存器P0~P3:0FFH堆栈指针SP:07HSBUF:不定内部RAM不受复位操作的影响,但在单片机接通电源时,RAM中的内容不定。SFR复位值SFR复位值SFR复位值PCACCBPSWSPDPTRP0~P3IP(51子系列)IP(52子系列)IE(51子系列)IE(52子系列)SBUF0000H00H00H00H07H0000HFFH×××00000B××000000B0××00000B0×000000B不定

TMODTCONTH0TL0TH1TL1TH2(52子系列)TL2(52子系列)RCAP2H(52子系列)RCAP2L(52子系列)SCONPCON(HMOS工艺)PCON(CHMOS工艺)00H00H00H00H00H00H00H00H00H00H00H0×××××××B0×××0000B

单片机进入复位状态的条件在内部振荡器运行时,使复位输入端RESET至少保持两个机器周期(24个振荡周期)为高电平,由CPU采样复位信号,启动复位时序,完成复位操作。

2.上电复位电路上电复位电路

当VCC接通电源时,即可实现单片机的上电复位

RESET脚必须保持足够时间的高电平以使振荡器起振并持续两个机器周期以上的时间。上电时VCC的上升时间应小于几十毫秒。振荡器起振时间取决于振荡器频率,10MHz起振时间一般为1ms;1MHz起振时间一般为10ms。如果器件上电时不能正常复位,那么片内SFR,特别是程序计数器PC可能没有进入初始化状态,使CPU从不定地址开始执行程序,从而影响程序的正确执行。

3.按钮复位电路

按钮复位电路

二、单片机最小系统维持单片机运行的最基本的配置系统,构成单片机最小应用系统。对于8051、8751片内有RAM、EPROM的系统来讲,单片机与晶振电路及开关、电阻、电容等构成的复位电路组成单片机最小应用系统8

0

5

1单片机最小系统单片机的显示控制

段显示(7段、米字型等)和点阵显示(5×8、8×8点阵等)。一、单片机的显示控制发光二极管LED(LightEmittingDiode)显示器液晶LCD(LiquidCrystalDisplay)显示器CRT显示器……(一)LED显示器结构

LED显示器内部由多个发光二极管组成。(二)显示字形与字段码关系aabcdefgabcedgfGNDGND7691254938dpdpD7D6D5D4D3D2D1D0字dpgfedcba011000000111111001210100100310110000410011001510010010610000010711111000810000000910010000LED数码管显示字形与字段码关系

显示字形共阳极字段码共阴极字段码显示字形共阳极字段码共阴极字段码0C0H3FH990H6FH1F9H06HA88H77H2A4H5BHb83H7CH3B0H4FHCC6H39H499H66HdA1H5EH592H6DHE86H79H682H7DHF8EH71H7F8H07H“熄灭”FFH00H880H7FH

数码管与P1口接口连接电路P1=0x3F(共阴极)P1=0xC0(共阳极)dpgfedcba(三)LED数码显示方式及电路特点:每个数码管必须接一个8位锁存器用来锁存待显示的字形码。送入一次字形码显示字形一直保持,直到送入新字形码为止。优点:占用CPU时间少,显示便于监测和控制。缺点:硬件电路比较复杂,成本较高。静态显示接口电路有许多种,1.静态显示方式:并行口静态显示电路字段码位选线轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。(2)动态显示特点:将所有数码管的段选线并联在一起,通过控制位选信号来控制数码管的点亮。数码管采用动态扫描显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的限流电阻。4位LED动态显示电路5.2.4应用实例一维数组大量用在查表程序中。由于单片机的数据处理能力有限,因此对一些复杂的、高精度的数学运算往往无能为力,这时候就可以把数组作为一个表格,预先存储在存储器中,需要的时候可以通过查找数组元素快速地获得其中的数据。对于这些运行时无需修改的数组,通常将其定义为code存储器类型,将其存放在程序存储器中以节省数据存储器的空间。例一只数码管静态显示案例例一只数码管静态显示案例#include<reg51.h>unsignedcharseg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};main(){unsignedinti,j;while(1){for(i=0;i<10;i++){P0=seg[i];for(j=50000;j>0;j--);}}}例多只数码管静态显示案例74LS373功能表输入

输出OELEDQLHHHLHLLLL×Q不变H××高阻态例多只数码管静态显示案例#include<reg51.h>unsignedcharseg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};voidmain(){unsignedinti,ctr=0xfe;P2=0xff;for(i=0;i<3;i++){P0=seg[i];P2&=ctr;ctr<<=1;}while(1);}例数码管动态显示案例例数码管动态显示#include<reg51.h>unsignedcharseg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x70};unsignedcharcon[4]={0xfe,0xfd,0xfb,0xf7};unsignedinti=0;main(){TMOD=2;TH0=6;TL0=6;EA=1;ET0=1;TR0=1;while(1);}voidisr_time0()interrupt1{P2=con[i];P1=seg[i];i++;if(i==4)i=0;}案例设计计时器案例设计计时器#include<reg51.h>unsignedcharseg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsignedcharcon[6]={0x1,0x2,0x4,0x8,0x10,0x20};unsignedcharmm=0;unsignedcharss=0;unsignedcharhh=0;unsignedcharcount=100;main(){TMOD=1;TH0=-10000>>8;TL0=-10000;EA=1;ET0=1;TR0=1;while(1);}voidisr_time0()interrupt1{unsignedinti=0,j;unsignedchartime[6];TH0=-10000>>8;TL0=-10000;count--;if(count==0)

{

count=100;ss++;if(ss==60)

{ss=0;mm++; if(mm==60)

{mm=0;hh++; if(hh==24)hh=0;

}

}

}time[0]=hh/10;time[1]=hh%10;time[2]=mm/10;time[3]=mm%10;time[4]=ss/10;time[5]=ss%10;for(i=0;i<6;i++){P2=con[i];if(i==1||i==3)P1=seg[time[i]]&0x7f;elseP1=seg[time[i]];for(j=100;j>0;j--);}}LED点阵的显示在现代工业控制和一些智能化仪器仪表中,越来越多的场所需要用点阵图形显示器显示数字、字母或汉字,例如日常生活中经常见到的电梯楼层的显示与一些户外广告,都是用LED点阵作为显示器。LED点阵中要用到的一个典型数据结构就是二维数组。不论显示图形还是文字,都是控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光。通常事先把需要显示的图形文字转换成点阵图形,再按照显示控制的要求以一定的格式形成显示数据。对于只控制通断的图文显示屏来说,每个LED发光器件占据数据中的1位(lbit),在需要该LED器件发光的数据中相应的位填1,否则填0。当然,根据控制电路的安排,相反的定义同样是可行的。LED点阵的显示这样依照所需显示的图形文字,按显示屏的各行各列逐点填写显示数据,就可以构成一个显示数据文件。显示图形的数据文件,其格式相对自由,只要能够满足显示控制的要求即可,例如,可以用一个5×7(5列7行)的LED点阵显示数字“1”或“2”LED点阵的显示把同一列发光管的阳极连接在一起,把所有同一行的阴极连在一起。先送出对应第1列发光管亮灭的数据,然后选通第1列使其点亮一段时间后熄灭;再送出第2列的数据,然后选通第2列使其点亮相同的时间后熄灭;第5列之后又重新点亮第1列,这样反复轮回,当这样轮回的速度足够快时(每秒24次以上),由于人眼的视觉暂留现象就能看到显示屏上稳定的显示了。LED点阵的显示设用P1的低7位控制行的显示(最低位对应最上端的LED),用(P3的低5位控制列的显示。可以看出从左到右每一列的显示数据依次为0x00,0x42,0x7f,0x40,0x00。因此可以用下面的数组表示“1”:{0x00,0x42,0x7f,0x40,0x00}同理,可以用下面的数组表示“2”:{0x42,0x61,0x51,0x49,0x46}LED点阵的显示unsignedcharcodedigit_code[10][5]={{0x3e,0x41,0x41,0x41,0x3e},//0{0x00,0x42,0x7f,0x40,0x00},//1{0x42,0x61,0x51,0x49,0x46},//2

{0x22,0x41,0x49,0x49,0x36},//3{0x18,0x14,0x12,0x7f,0x10},//4{0x27,0x45,0x45,0x45,0x39},//5{0x3c,0x4a,0x49,0x49,0x30},//6{0x01,0x71,0x09,0x05,0x36},//7{0x36,0x49,0x49,0x49,0x36},//8{0x06,0x49,0x49,0x29,0x1e}//9};LED点阵的显示unsignedcharcodedigit_code[10][5]={{0x41,0x3e,0x3e,0x3e,0x41},//0{0x7f,0x3d,0x00,0x3f,0x7f},//1{0x3d,0x1e,0x2e,0x36,0x39},//2{0x5d,0x3e,0x36,0x36,0x49},//3{0x67,0x6b,0x6d,0x00,0x6f},//4{0x58,0x3a,0x3a,0x3a,0x46},//5{0x43,0x35,0x36,0x36,0x4f},//6{0x7e,0x0e,0x76,0x7a,0x7d},//7{0x49,0x36,0x36,0x36,0x49},//8{0x79,0x36,0x36,0x56,0x61}//9};D0D1D2D3D4D5D6LED点阵的显示5×7LED点阵的控制电路如右图所示。由于LED点阵中发光管的数量较多,单片初本身的端口达不到控制的要求,因此对于LED点阵的控制一般要对单片机的端口进行扩展。但本例主要介绍二维数组的应用,故对这些枝节问题没有过多地考虑,仍直接用单片机端作为列驱动。LED点阵的显示在程序中定义了一个delay()函数,该函数是一个延时,确定了轮流显示字符时每个字符显示的时间;定时器0初始化为24MHz下的4ms中断,这个4ms是显示某个字符时每一列显示的持续时间,5列循环显示,直到上述的delav()所确定的时间段耗完,转去显示下一个字符。用二维数组实现LED点阵的显示#include<reg51.h>unsignedcharcodedigit_code[10][5]={{0x41,0x3e,0x3e,0x3e,0x41},//0{0x7f,0x3d,0x00,0x3f,0x7f},//1{0x3d,0x1e,0x2e,0x36,0x39},//2{0x5d,0x3e,0x36,0x36,0x49},//3{0x67,0x6b,0x6d,0x00,0x6f},//4{0x58,0x3a,0x3a,0x3a,0x46},//5{0x43,0x35,0x36,0x36,0x4f},//6{0x7e,0x0e,0x76,0x7a,0x7d},//7{0x49,0x36,0x36,0x36,0x49},//8{0x79,0x36,0x36,0x56,0x61}//9};用二维数组实现LED点阵的显示voidmain(){init_time0();while(1){delay();number=(number+1)%10;}}voiddelay(){unsignedinti,j;for(i=0;i<1000;i++)for(j=0;j<500;j++);}unsignedcharnumber=0;unsignedcharcolumn=0;voiddelay();voidinit_time0();LED点阵的显示案例voidinit_time0(){TMOD=(TMOD&0xf0)|0x01;TL0=-8000;TH0=(-8000)>>8;EA=1;ET0=1;TR0=1;}voidisr_time0()interrupt1{TL0=-8000;TH0=(-8000)>>8;column=(column+1)%5;P1=digit_code[number][column];P3=(0x01<<column);}单片机与液晶显示器的连接单片机与液晶显示器的连接

LCD(LiquidCrystalDisplay)是液晶显示器的缩写,液晶显示器是一种被动式的显示器,即液晶本身并不发光,而是利用液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。液晶显示器具有功耗低、抗干扰能力强等优点,因此被广泛应用。例如我们在手机、BP机、笔记本电脑和计算器上看到的都是液晶显示屏幕。由于LCD的控制必须使用专用的驱动电路,且LCD面板的接线需要采用特殊技巧,再加上LCD面板十分脆弱,因此一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCM模块(LiquidCrystalDisplayMould,LCM)一起使用。LCM的种类繁多,可以根据不同的场合、不同的需要选择不同类型的LCM,本书主要介绍1602字符型LCM(即两行显示,每行可显示16个字符)。一、1602字符型LCM的特性及引脚功能1.字符型LCM的特性(1)具有字符发生器ROM(CharacterGenerateROM,CGROM),可显示192个5×7点阵字符,LCM显示的数字和字母部分的码值,刚好与ACSII码表中的数字和字母相同,所以在需要显示数字和字母时,只需要向LCM送入ASCII码即可。(2)具有64B的自定义字符RAM(CharacterGenerateRAM,CGRAM),可自行定义8个5×7点阵字符。(3)具有80B的数据显示存储器(DataDisplayRAM,DDRAM)。2.字符型LCM的引脚功能字符型LCM通常有16个引脚,也有14个引脚,当选用14个引脚的LCM时,该LCM没有背光。二、1602字特型LCM与单片机的连接1.直接访问方式连接该连接是由单片机的读(—RD引脚)、写(—WR引脚)和高位地址线共同控制LCM的E端,由高位地址线其中的两条分别与RS端和R/W端相连,由单片机的P0口LCM的DB0-DB7相连.这样就构成了三总线(数据DB、地址总线AB和控制总线CB)的连接方式,如图所示。由于构成了三总线的结构,所以在软件控制上比较简单,用通过访问外部地址的方式就能访问LCM。但是,在使用这种连接方式时需要注意单片机的控制总线时序和地址总线时序必须要与LCM所需要的时序相匹配,否则将无法访问。LCM与单片机的直接访问方式连接电路2.间接控制方式连接是利用HD44780所具有的4位数据总线的功能,简化电路接口的一种连接方式,如图8-2所示。直接访问方式连接电路中需要增加与非门和反相器,从原理图上看很简单,但在实际焊接时,增加两个器件就增加了很多麻烦,另外增加器件也意味着增加了故障点,所以在实际使用时并不采用此电路。在图中,省去了4位数据线,电路连接十分简单,也没有多余的器件,对于参加比赛来说非常方便。LCM与单片机的间接控制方式连接2.间接控制方式连接但是由于LCM本身为速度较慢的器件,每一次数据传输大概需要几十微秒至几毫秒的时间,如果采用间接控制方式访问,每传送一个字节的数据需要访问两次LCM,这将占用大量的时间,使CPU变得很繁忙,甚至影响CPU处理其他数据的传输速度。所以在实际的硬件电路连接中常采用如图8-3所示的电路。采用这种连接方式不能构成三总线的结构,所以不能通过地址的形式直接访问,而是需要按照LCM的方式进行数据的传输,同时由于数据总线使用了8条,所以在数据传输的时间上与直接访问的时间相同,速度较间接控制方式提高了一倍,缩短了CPU对LCM的访问时间。常用的LCM与单片机的连接三、1602字符型LCM的指令集提示(1)对LCM操作主要是4种基本操作:写命令、写数据、读状态和读数据。(2)在进行写命令、写数据和读数据三种操作之前,必须先查询忙标志,当忙状态BF为0时,才能进行这三种操作。(3)LCM上电时,都必须按照一定时序对LCM进行初始化操作,主要分以下四步:①设置LCM工作方式②设置显示状态③清屏:将光标设置为第1行第1列④设置输入方式:设置光标移动方向并确定整体显示是否移动(4)当写一个显示字符后,如果没有再给光标重新定位,则DDRAM地址会自动加1或减1。(5)对LCM的读写操作必须符合读写操作时序,并要有一定的延时。①读操作时,先设置RS和R/W状态,再设置E信号为高,这时从数据口读取数据,然后将E信号置低。②写操作时,先设置RS和R/W状态,再设置数据,然后产生E的脉冲案例英文字符的液晶显示控制利用基于HD44780控制芯片的1602液晶显示两行字符“Welcomeyou!”和“GuangZhou,2010”

。源程序(lcd.c)//液晶控制与显示程序#include<reg51.h>unsignedcharcount;sbitrs=P2^0;sbitrw=P2^1;sbiten=P2^2;voiddelay(unsignedintdely){unsignedchardely1;for(;dely>0;dely--)for(dely1=10;dely1>0;dely1--);}//液晶显示器判忙函数unsignedcharbusy(){unsignedcharlcd_status;rs=0;//寄存器选择

rw=1;//读状态寄存器

en=1;//开始读

delay(100);lcd_status=P0;en=0;returnlcd_status;}源程序(lcd.c)//向液晶显示器写命令函数voidWR_Com(unsignedchartemp){//忙等待

while((busy()&0x80)==0x80);

rs=0;//选择命令寄存器rw=0;//写

P0=temp;en=1;en=0;}//向液晶显示器写数据函数voidWR_Data(unsignedchardat){while((busy()&0x80)==0x80);

//向液晶显示器写数据

rs=1;rw=0;P0=dat;en=1;en=0;}源程序(lcd.c)//向液晶显示器写入显示数据函数//入口条件:液晶显示器行首地址(指示第一行还是第二行)和待显示数组的首地址voiddisp_lcd(unsignedcharaddr,unsignedchar*pstr){unsignedchari;WR_Com(addr);delay(100);for(i=0;i<16;i++){WR_Data(pstr[i]);delay(100);}}源程序(lcd.c)//液晶显示器初始化函数voidlcd_init(){WR_Com(0x38);//设置数据长度为8位、双行显示、5×7点阵字符

delay(100);WR_Com(0x01);//清屏

delay(100);WR_Com(0x06);//字符进入模式:屏幕不动,字符后移

delay(100);WR_Com(0x0c);//显示开,光标关

delay(100);}源程序(主程序main.c)//main.c主程序unsignedcharwelcome[16]="Welcomeyou!";unsignedcharaddr[16]="GuangZhou,2010";voidlcd_init();//函数原型说明voiddisp_lcd(unsignedchar,unsignedchar*);//函数原型说明voidmain(){inti=0;lcd_init();disp_lcd(0x82,welcome);while(1){}}disp_lcd(0xc0,addr+i);i++;if(i>strlen(addr))i=0;delay(10000);案例空调预置温度的显示控制两个LED数码管用于显示人工设置的希望环境温度值(简称预置温度),当实际环境温度高于该预置温度,则启动压缩机。两个LED数码管段选线分别连接到80C51的P1上,即两位预置温度的显示是通过将预置温度十位、个位数字BCD码分别由P1

温馨提示

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

评论

0/150

提交评论