单片机控制技术项目式课程(下篇共上中下3篇)_第1页
单片机控制技术项目式课程(下篇共上中下3篇)_第2页
单片机控制技术项目式课程(下篇共上中下3篇)_第3页
单片机控制技术项目式课程(下篇共上中下3篇)_第4页
单片机控制技术项目式课程(下篇共上中下3篇)_第5页
已阅读5页,还剩297页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

项目5

定时器与脉冲计数器的设计了解单片机定时/计数器的组成。掌握单片机定时/计数器的工作原理和功能运用方法。掌握单片机定时/计数器的初始化方法。掌握定时器的设计方法。掌握脉冲计数器的设计方法。能独立分析和解决硬件设计和软件设计中的问题。能利用团队的力量完成任务,培养团队合作精神。学习目标叙述单片机定时/计数器4种工作方式的工作原理;叙述单片机定时/计数器的初始化方法;设计定时器的工作程序;设计脉冲计数器的电路和工作程序。工作任务任务5.1定时器的设计项目5

定时器与脉冲计数器的设计任务5.2脉冲计数器的设计项目拓展STC89C52实验板分频器的设计项目小结

单片机定时/计数器的结构

实质是加1计数器(高8位、低8位);5.1.1MCS-51单片机内部定时/计数器的原理工作方式控制寄存器TMOD,工作方式设置;定时器控制寄存器TCON,启动、停止及设置溢出标志。任务5.1定时器的设计TMOD中,各有一个控制位(C/T),分别用于控制定时/计数器T0和T1工作在定时器方式还是计数器方式。

定时/计数器工作原理计数功能----计数脉冲来自相应的外部输入引脚,T0为P3.4,T1为P3.5。定时功能----计数输入信号是内部时钟脉冲,每个机器周期使寄存器的值加1。所以,计数频率是振荡频率的1/12。

定时模式,对内部机器周期计数定时时间T=计数值NxT机计数模式,对外部事件脉冲计数计数脉冲周期要大于2T机计数值:溢出时计数器值-计数初值。

计数器全1时,再输入1个脉冲就回零,并发生

溢出(TCON中TF0或TF1置1)。

计数器脉冲来源:

振荡器脉冲经过12分频T0或T1引脚的外部脉冲1.工作方式控制寄存器TMOD

T1控制T0控制M0M1C/TGATEM0M1C/TGATED0D1D2D3D4D5D6D7GATE—门控位C/T—计数/定时选择M1M0—工作方式选择定时/计数器的初始化注意:不能进行位寻址

定时/计数器的工作方式

M1M0工作方式功能说明00方式013位计数器01方式116位计数器10方式2自动重装初值的8位计数器11方式3方式3只针对T0,T0分成两个独立的8位定时/计数器;T1无方式32.定时器控制寄存器TCOND7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0TF0、TF1:溢出标志位中断请求标志触发方式选择启动定时/计数器0低电平1下降沿0停止1启动注意:可以进行位寻址

3.定时/计数器的初始化②计算计数器的计数初值:

编程时将计数初值送TH0、TL0或TH1、TL1;可编程器件在使用前需要进行初始化:①确定TMOD控制字:编程时将控制字送TMOD;③

TR0或TR1位置位控制定时器的启动和停止。【例】若单片机晶振为12MHz,要求产生5ms的定时,试计算X的初值。解:(1)采用定时器0的方式0:

5000*10-6=(213-X)*12*1/fosc

x=3192=0C78H=0110001100011000

63H

18H

即TH0=63H,TL0=18H

TMOD=GATEC/TM1M0GATEC/TM1M0

00000000

00H

(2)采用定时器1方式1:

5000*10-6=(216-X)*12*1/fosc

x=60536=EC78H

即TH1=ECH,TL1=78H

TMOD=GATEC/TM1M0GATEC/TM1M0

00010000

10Hmain()函数中:

TMOD=0x00;//设置定时器0为工作方式0 TH0=0x31;//定时器0高8位给初值

TL0=0x1C;//定时器0低8位给初值

TR0=1;//启动定时器0初始化程序编写计数脉冲输入方式0—13位方式。由TL0的低5位和TH0的8位组成。TH0溢出时,置位TF0标志,向CPU发出中断请求。TF0T0TR0GATEINT01≥1&C/T=1C/T=0振荡器1/12TH0TL0低5位高8位13位计数器定时器计数器5.1.2用单片机定时/计数器设计定时器(查询方式)用定时/计数器的工作方式0设计定时器定时=(213-X)×时钟周期×12

=(213–X)*12*1/fosc计数初值:X=213-T/(时钟周期×12)定时/计数器工作方式0定时方式:例:8*10-3=(213-X)*12*1/(12*106)

X=213–8000 =192=0xC0计数方式:计数次数值N=213-X计数初值:X=213-计数次数值N注意:X的低5位送TL0(TL1),TL0(TL1)的高3位数为任意值,常取0,高8位送TH0(TH1)。最大计数值M=213=81921.任务要求本任务要求用AT89C51的定时器1,方式0设计一只1秒的定时器,用定时器的查询方式,使AT89C51控制的一只发光二极管定时1秒闪烁。任务操作

2.任务分析①确定TMOD控制字:采用AT89C51的定时器1方式0定时,TMOD=0x00

②计算计数器的计数初值:因为方式0采用13位计数器,其最大定时时间为:8192×1ms=8.192ms,可选择定时时间为5ms,再循环200次就可以定时为1s了。X=213-T/(时钟周期×12)

=0110001100011000B=0x6318所以TH1赋值0x63,TL1赋值0x18。注意:定时/计数器的方式0为13位计数器,其不用的是低8位中的高三位,一般补三个0。3.任务设计

(1)硬件原理图设计

(2)软件程序设计

#include<AT89X51.h>

voidsTime()//定时1s子程序

{unsignedinti;TMOD=0x00;//设定时器1为方式0TH1=0x63;//置定时器初值

TL1=0x18;TR1=1;//启动T1

for(i=0;i<=200;){if(TF1==1)//查询计数溢出

{i++;TF1=0;TH1=0x63;//重新置定时器初值

TL1=0x18;}}return;

}

//发光二极管定时1s闪烁主程序

voidmain()

{for(;;){P1_0=!P1_0;//取反P1.0使发光二极管闪烁

sTime();//调用1s定时

}

}

方式1—16位方式

16位计数,由TL0作为低8位、TH0作为高8位。16位计数,由TL1作为低8位、TH1作为高8位。TF0T0TR0GATEINT01≥1&C/T=1C/T=0振荡器1/12TH0TL0低8位高8位16位计数器定时器计数器

用定时/计数器的工作方式1设计定时器定时=(216-X)×时钟周期×12

=(216–X)*12*1/fosc计数初值:X=216-T/(时钟周期×12)定时/计数器工作方式1X的低8位送TL0(TL1),高8位送TH0(TH1)。

定时方式:计数方式:计数次数值N=216-X计数初值:X=216-计数次数值N最大计数值M=216=655361.任务要求本任务要求用AT89C51的定时器0方式1设计一只1秒的定时器,使AT89C51的P0和P2端口控制的2组16只LED流水灯定时1秒滚动点亮。

2.任务分析①

确定TMOD控制字:

采用AT89C51的定时器0方式1定时,

TMOD=0x01。

②计算计数器的计数初值:

因为方式1采用16位计数器,其最大定时时间为:

65536×1ms=65.536ms,可选择定时时间为50ms,再循环20次就可以定时为1s了。X=

216-T/(时钟周期×12)=65536-50000=15536=0x3CB0所以TH0赋值0x3C

,TL0赋值0xB0。TH0=(65536-50000)/256;

TL0=(65536-50000)%256;3.任务设计

(1)硬件原理图设计(2)软件程序设计

#include<AT89X51.h>

#include<intrins.h>

#defineucharunsignedchar

//流水灯定时1s滚动主程序

voidmain()

{ucharT_Count=0;//累加计数溢出发生的次数

P0=0xFE;//点亮D1灯

P2=0xFE;//点亮D16灯

TMOD=0x01;//定时器0工作于方式1

TH0=(65536-50000)/256;//50ms定时初值

TL0=(65536-50000)%256;

TR0=1;//启动定时器

while(1)

{if(TF0==1)//定时溢出标志位为1时表示计时溢出

{TF0=0;//软件清零

TH0=(65536-50000)/256;//重置50ms定时

TL0=(65536-50000)%256;

if(++T_Count==20)//50*20=1000ms后LED滚动一次

{P0=_crol_(P0,1);

P2=_crol_(P2,1);

T_Count=0;

}

}

}

}

方式2—8位自动装入时间常数方式

TF0振荡器1/121≥1&T0TR0GATEINT0C/T=0C/T=1TL0TH0自动重装初值的8位计数方式

,适合于用作较精确的脉冲信号发生器。TH0(TH1)中保留初值

用定时/计数器的工作方式2设计定时器定时=(28-X)×时钟周期×12

=(28–X)*12*1/fosc计数初值:X=28-T/(时钟周期×12)定时/计数器工作方式2初值X分别送给TL0(TL1)和TH0(TH1)。定时方式:计数方式:计数次数值N=28-X计数初值:X=28-计数次数值N最大计数值M=28=2561.任务要求本任务要求用AT89C51的定时器1方式2设计一只1秒的定时器,用定时器的查询方式,使AT89C51控制的一只发光二极管定时1秒闪烁。

2.任务分析①

确定TMOD控制字:

采用AT89C51的定时器1方式2定时,

TMOD=0x20。

②计算计数器的计数初值:

方式2采用8位计数器,其最大定时时间为:

256×1ms=256

s,可选择定时时间为250

s

,再循环4000

次就可以定时为1s。X=

28-计数值=256-250=6=0x06所以TH1赋值0x06,TL1也赋值0x06。3.任务设计

(1)硬件原理图设计

(2)软件程序设计

#include<AT89X51.h>

voidsTime(){unsignedinti; TMOD=0x20;//设定时器1为方式2 TH1=0x06;//置定时器初值

TL1=0x06; TR1=1;//启动T0 for(i=0;i<=4000;){if(TF1==1)//查询计数溢出

{i++;TF1=0;}}return;}

//发光二极管定时1s闪烁主程序voidmain(){while(1){P1_0=!P1_0;//取反P1.0使发光二极管闪烁

sTime();//调用1s定时

}}

用定时/计数器的工作方式3设计定时器方式3—2个8位方式

T0工作方式3结构图T0工作方式3时T1的结构图

仅T0可以工作在方式3,T1处于方式3时停止计数。此时T0分成2个独立的计数器—TL0和TH0,前者用原来T0的控制信号(TR0、TF0),后者用原来T1的控制信号(TR1、TF1)。(1)TH0由TR1启动/停止,TF1标志溢出(2)TL0由TR0启动/停止,TF0标志溢出(3)TH0只能定时,TL0可以定时/计数,且都是8位定时T=(28-X)*12/foscTL0计数初值X=28-N1.任务要求

本任务要求用AT89C51的定时器0方式3设计一只1秒的定时器,用定时器的查询方式,使AT89C51控制的一只发光二极管定时1秒闪烁。

2.任务分析①

确定TMOD控制字:因为采用AT89C51的定时器0方式3定时,这里采用TL0和TH0结合使用的方法,让TL0工作在计数方式,故TMOD=0x07。当TH0计满溢出后,用软件复位的方法使T0(P3.4)引脚产生负跳变,TH0每溢出一次,T0引脚便产生一个负跳变,TL0便计数一次。TL0计满溢出时,延时时间应为50ms,循环20次便可得到1s的延时。

②计算计数器的计数初值:

方式3中定时器0中的TH0只能作为定时器,TH0是8位计数器,其最大定时时间为:256×1us=256us,可选定时时间为250us。这样TH0的初值为X=(256-250)=6=0x06TL0设置为计数器,TL0是8位计数器,其最大计数值为256,可选择计数值为200。这样TL0计数初值为X=M-计数值=256-200=56=0x38所以TL0赋值0x38,TH0赋值0x06。

3.任务设计

(1)硬件原理图设计(2)软件程序设计

#include<AT89X51.h>

//定时1s子程序voidsTime(){unsignedinti;TMOD=0x07 ;//置定时器0为方式3计数

TH0=0x06;//置TH0初值

TL0=0x38;//置TL0初值

TR0=1;//启动TL0TR1=1;//启动TH0

for(i=0;i<=20;){if(TF0==0)//在TL0没有溢出时

{if(TF1==1)//查询TH0计数溢出

{TF1=0;TH0=0x06;//重置TH0初值

P3_4=0;//T0引脚产生负跳变

P3_4=0;//负跳变持续

P3_4=1;//T0引脚恢复高电平

} continue; } TF0=0; i++;TL0=0x38;//重置TL0初值

}return;}

//发光二极管定时1s闪烁主程序voidmain(){while(1){P1_0=!P1_0;//取反P1.0使发光二极管闪烁

sTime();//调用1s定时

}}

任务5.2脉冲计数器的设计1.任务要求要求用AT89C51设计一个计数范围为0~99的脉冲计数器,也就是用AT89C51的定时/计数器采样计数外部按键输送的脉冲信号,并用数码管将计数的数值显示出来。2.任务分析设置T0为计数方式,计数外部的脉冲,工作在方式2,所以TMOD=0x06。①确定TMOD控制字:方式2的最大计数值为256,如果把初值设置为255,当P3.4管脚接收到一个由高到低的下跳变时,计数值加1溢出,查询到TF0=1后,就将显示的计数值加1,实现脉冲计数器计数。这样将TL0的初值设置为X=(256-1)=255=0xFF

将TL0=0xFF,TH0=0xFF,每次溢出后TH0自动将初值装入TL0。②计算计数器的计数初值:3.任务设计

(1)硬件原理图设计(2)软件程序设计

#include<AT89X51.h>

//数码管段码定义unsignedcharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,};unsignedcharcount=0;

voidmain()

{P0=DSY_CODE[0];

P2=DSY_CODE[0];

TMOD=0x06;//置定时器0为方式2计数

TH0=0xFF;//置TH0初值

TL0=0xFF;//置TL0初值

TR0=1;//启动TL0计数

while(1){if(TF0==1)//查询TF0是否为1{TF0=0;//TF0清零

count=(count+1)%100;//计数值控制在100以内

P0=DSY_CODE[count/10];//显示计数值高位

P2=DSY_CODE[count%10];//显示计数值低位

}if(P3_2==0)//查询到P3.2上有低电平

{count=0;//计数值清零

P0=DSY_CODE[0];//显示清零

P2=DSY_CODE[0];//显示清零

}

}

}

项目拓展STC89C52实验板分频器的设计实验板采用的是STC89C52单片机,如附录2中“单片机与扩展插座”电路所示。我们要在P1.0~P1.7端口上产生不同频率的方波,周期分别为1ms、2ms、4ms、8ms、16ms、32ms、64ms、128ms,就相当于实现了不同级别的分频。1.任务要求2.任务分析首先,我们用STC89C52的定时/计数器来设置时间,选用T0的方式1第一个方波周期是1ms,方波周期的一半是500us,单片机外围的晶体采用的是12MHz,其机器周期是1us,所以每轮计数500次就可以达到500us,这样初值为(65536—500),高8位送TH0,低8位送TL0。

确定TMOD控制字和计算计数器的计数初值:十进制数二进制数(8位)1000000012000000103000000114000001005000001016000001107000001118000010009000010011000001010

十进制与二进制的对应表分频器源程序如下:

#include<reg52.h>

//T0定时500us子程序

voidTimer0()

{TMOD=0x01; //使用模式1,16位定时器,

TH0=(65536-500)/256;//赋初值,12MHz晶振,//机器周期1us,//500x2=1ms方波

TL0=(65536-500)%256;

TR0=1;//定时器开关打开

while(1)

{if(TF0==1)

{TF0=0;

return;

}

}}

//主程序

main()

{staticunsignedchari;//i的范围0~255

while(1)

{i++;

P1=i;//P1口8路输出不同频率,相当于一个分频器,

//用示波器测量;P1.0输出1ms方波,

//P1.1输出2ms,P1.2输出4ms,以此类推

Timer0();

}

}

项目小结51单片机的定时/计数器的组成和工作原理。定时/计数器由T0、T1、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。定时/计数器有4种工作方式。

项目小结

单片机要使用定时/计数器时首先要对其进行初始化,初始化的步骤为:

(1)确定工作方式——对TMOD赋值。(2)预置定时或计数的初值——直接将初值写入TH0、TL0或TH1、TL1。

(3)根据需要开启定时/计数器中断——直接对IE寄存器赋值。(4)启动定时/计数器工作——将TR0或TR1置1。

项目6

交通信号灯的设计了解7段LED数码管的内部结构和工作原理。了解行业标准中电子元器件的规范。了解LED数码管的静态显示和动态显示原理。掌握LED数码管静态显示和动态显示的硬件电路和软件程序的设计方法。掌握MCS-51系列单片机中断系统的结构、工作原理和初始化方法。掌握交通信号灯控制系统的设计方法。能独立分析和解决硬件设计和软件设计中的问题。掌握完成工作项目的完整步骤和具体实施方法。能利用团队的力量完成任务,培养团队合作精神。

学习目标叙述LED数码管静态和动态显示原理;叙述51单片机外部中断的工作原理;设计LED数码管静态显示的工作电路和控制软件;设计LED数码管动态显示的工作电路和控制软件;设计交通信号灯控制系统的硬件电路和控制软件。

工作任务

任务6.1LED数码管显示数字的设计项目6交通信号灯的设计任务6.2中断控制流水灯的设计任务6.3交通信号灯的设计项目拓展STC89C52实验板LCD液晶显示的设计项目小结LED数码管结构与显示原理任务6.1LED数码管显示数字的设计

6.1.1单只LED数码管静态显示数字LED数码管由8个发光二极管组成,其中7个发光二极管(a~g)作为7段笔画组成“8”字结构(故也称7段LED数码管),剩下的1个发光二极管(h或dp)组成小数点,所有发光二极管已在内部完成连接,根据接法不同分为共阴LED数码管和共阳LED数码管两类。

(b)共阴极(c)共阳极

(a)引脚图若按规定使某些笔段上的发光二极管点亮,就能够显示出不同的字符。例如:要显示“0”,就是让a段亮、b段亮、c段亮、d段亮、e段亮、f段亮、g段不亮及DP段不亮(不显示小数点)。对于共阴极LED数码管,公共端要接地,a、b、c、d、e、f端接高电平,g脚及DP脚接低电平。而共阳极LED数码管,公共端要接电源,a、b、c、d、e、f端接低电平,g脚及DP脚接高电平。也就是说显示同一个字符,两种接法的LED数码管的七段显示控制信息是不同的,互为反码。注意:使LED数码管某段点亮必须具备2个条件:①共阴极管的公共端接低电平或接地,共阳极管的公共端接高电平或电源;②共阴极管的笔段电极端接高电平或电源,共阳极管的笔段电极端低电平或接地。LED数码管显示方式1.段码和位码

段码是数码管显示的一个基本概念,也叫字形码或段选码,它指数码管为了显示一个数字或符号,在各笔段电极上所加电平按照一定顺序排列所组成的数字,与数码管类型和排列顺序有关。

位码也叫位选码,通过数码管的公共端选中某一位数码管。通常我们把数码管公共端叫做“位选线”,笔段端叫做“段选线”。LED数码管段码表显示字符字形码显示字符字形码共阳极共阴极共阳极共阴极0COH3FHA88H77H1F9H06Hb83H7CH2A4H5BHCC6H39H3BOH4FHdA1H5EH499H66HE86H79H592H6DHF8EH71H682H7DH—BFH40H7F8H07HP8CH73H88OH7FHP.0CHF3H99OH6FH熄灭FFH00H显然:共阳极和共阴极的字段码互为反码。

假设某一单片机应用系统外接了8个共阳极数码管,所有数码管的8个笔段“a,b,c,d,e,f,g,dp”的同名端已连在一起,单片机I/O口与数码管的引脚的对应控制关系如下表所示。

当P0口的口线输出低电平时,其对应控制数码管的段就点亮,否则,熄灭。当P2口的口线输出高电平时,其对应控制的数码管被选中,否则,被关闭。如果想在第二个显示器显示“6”,单片机输出的段码应为“10000010”,位码应为“00000010”。单片机I/O口P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7数码管的引脚abcdefgDP单片机I/O口P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7数码管的引脚第一个数码管com第二个数码管com第三个数码管com第四个数码管com第五个数码管com第六个数码管com第七个数码管com第八个数码管com应用实例:单片机I/O口与数码管的引脚的对应控制关系如上表所示,试确定数字0~9的段选码并填入表6.3,确定每个数码管的位码并填入表6.4中。如果想在第四个显示器显示“4”,试问单片机输出的段码和位码应该是多少?表6.3数字与段选码对应表注意:段码与位码可由设计者自行设定,不是固定不变的。显示字形0123456789段码表6.4数码管与位选码对应表数码管第一个第二个第三个第四个第五个第六个第七个第八个位码2.LED数码管静态显示方式单片机驱动数码管有很多种方法,按显示方式分静态显示和动态显示。

LED数码管工作在静态显示方式时,各位数码管的公共端连接在一起接地(共阴极)或接电源(共阳极),每位数码管的每一个段都由一个I/O口线单独进行驱动。之所以称为静态显示,单片机将所要显示的数据送出后就不再控制LED,直到下一次再传送一次新的显示数据为止,在单片机的两次传送数据之间,LED数码管显示内容静止不变,不需要动态刷新。

静态显示方式的优点:编程简单,显示亮度高

缺点:占用I/O口线资源较多四位静态显示电路注意:静态显示方式适合驱动电路具有锁存功能和显示位数较少的场合。1.LED数码管的种类

单只LED数码管静态显示数字的设计(1)按发光的颜色分类:LED数码管按发光颜色可分为红色、橙色、黄色和绿色等多种。发光颜色与发光二极管的半导体材料及其所掺杂质有关。(2)按发光强度分类:LED数码管按发光强度可分为普通亮度LED数码管和高亮度LED数码数码管。(3)按显示位数分类:LED数码管按显示位数可分为一位LED数码管、双位LED数码管和多位LED数码管。2.LED数码管驱动问题

发光二极管LED工作电压与发光颜色有关系,普通的发光二极管正偏压降:红色1.6V,黄色1.4V左右,蓝白至少2.5V。工作电流5~20mA左右。而LED数码管的笔段是由发光二极管构成的,每段的工作电流也必然在5~20mA左右。电流过小,显示器亮度就低,电流过大,显示器很容易损坏。注意:LED数码管在使用中一定要串接电阻,以限制流过每段的电流不大于额定值。1.任务要求

采用LED数码管的静态显示方式,实现在一位LED数码管上显示数字。具体要求如下:(1)在数码管上循环显示数字“0-1-2-3-4-5-6-7-8-9”;(2)数字显示间隔时间1秒;(3)利用查表法实现数字到段码的转换。任务操作2.任务分析(1)在单片机的四个并行I/O口中,选用单片机的P1口与LED数码管的段选线相连,其输出的段码控制数码管各段点亮与熄灭,从而显示不同的字形。为了能使各笔段正常发光,电路中串联了限流电阻R1~R8,限流电阻可用下式计算:

(UF:段正向压降,IF:段工作电流)电路中R取330Ω。(2)利用查表法完成显示数字到段码的转换。事先把数字0~9的共阳极段码放在程序存储器中,实现方法如下:

unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};table是用户自行定义的数组名字,关键字code使数组元素存储在程序存储区。要显示某个数字时,只要从存储器中取出其段码,通过P1口送给数码管即可。假如要显示“5”,数组元素table[5]的内容就是“5”的段码,执行C语言语句P1=table[5],就可在数码管上显示“5”。3.任务设计(1)器件的选择用一只AT89C51单片机控制一只共阳极的数码管,器件清单如表所列:器件名称数量(只)AT89C51111.0592MHz晶体122pF瓷片电容222uF电解电容11kΩ电阻1330Ω电阻8LED数码管(红色共阳极)1(2)硬件原理图设计(3)软件程序设计//宏定义#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//定义共阳极数码管的段码表unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时子函数,大约x毫秒延时voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}源程序如下://主函数,循环显示数字“0--9”

voidmain(){ uchari; while(1) {for(i=0;i<=9;i++) {P1=table[i];//从段码表中取段码并通过P1口输出

DelayMS(1000);//调用延时函数,延时1s } }}6.1.28位LED数码管动态显示数字LED数码管动态显示方式

当LED数码管位数较多时,为了简化电路,人们通常会将所有数码管的同名段选线并联在一起,由一个I/O口控制。而各位数码管的位选线(公共极COM)各自独立由I/O线控制。当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对LED数码管COM端的控制,只要输出要选通数码管的对应位码,该位就显示出字形,没有选通的数码管就不会亮。之所以称为动态显示,即便LED数码管显示内容不变,对其的驱动信号也不能静止,需要进行不间断的动态刷新。

动态显示方式的优点是能够节省大量的I/O口,而且功耗较低。缺点是编程比较复杂,显示亮度不如静态。一般适用于显示位数较多的场合。注意:动态显示方式,每秒的刷新次数以25次左右为好。每次刷新,每位数码管的点亮时间为1~2ms左右,具体时间应根据实际情况而定。四位动态显示电路1.任务要求

采用动态显示方式,采用AT89C51单片机控制8位共阳极LED数码管,要求同时显示数字“01234567”。2.任务分析(1)共阳极段码表定义方法如下:

unsignedcharcodetable1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};(2)位码表定义方法如下:

unsignedcharcodetable2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

由于采用共阳极数码管,高电平点亮位,低电平熄灭位,所以位码值如上。在动态扫描过程中,需要分时点亮各位数码管,本设计通过查表的方法,分时从存储器中取出并送出位码,使各位数码管的位选线分时高电平有效,从而实现动态显示。若想在某位数码管显示字符,其他数码管熄灭,只要从存储器中取出这位数码管的位码,送到数码管的位选线上即可。例如:数组元素table2[0]的内容是第一个数码管的位码,执行C语言语句P2=table2[0]之后,结果第一个显示器上显示了相应字符,而其他显示器是熄灭的。3.任务设计(1)器件的选择

根据任务要求,需要选用1只8位共阳极数码管,采用12MHz晶体,数码管的位选都用三极管驱动,电路设计需要的器件清单如表所示。

器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容222uF电解电容11kΩ电阻1220Ω×8排阻1NPN三极管88位共阳极数码管1(2)硬件原理图设计(3)软件程序设计//宏定义#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//定义段码表ucharcodetable1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定义位码表ucharcodetable2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//延时子函数,大约x毫秒延时voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}源程序如下://主函数voidmain(){uchark;P0=0xFF;//关显示

P2=0x00;//关显示

while(1){for(k=0;k<=7;k++){P0=table1[k];//发送段码

P2=table2[k];//发送位码

DelayMS(2);P0=0xFF;//关显示

}}}(4)软硬件联合调试在动态显示电路调试过程中,可能出现的问题:①程序定义的控制端口线与Proteus仿真图中不一致,显示器不显示。②段码和位码送出之后,忘了关闭显示器,结果出现乱码。③段码表有错误,出现乱码。④程序中定义的位码表和Proteus仿真图实际连线不一致,出现显示数据错位等等。注意:数码管在动态显示时每位显示之间一定要关显示,起到消隐的作用,否则多位数码的动态显示不能实现。6.2.1MCS-51单片机的中断系统

中断的概念1.中断的定义中断:就是指单片机在执行程序的过程中,由于某种外部或内部事件的作用(如外部设备请求与单片机传送数据或单片机在执行程序的过程中出现了异常),强迫单片机停止当前正在执行的程序而转去为该事件服务,待事件服务结束后,又能自动返回到被中断了的程序中继续执行,这一过程称为中断。任务6.2中断控制流水灯的设计2.中断响应过程

单片机处理中断的4个步骤:中断请求、中断响应、中断服务和中断返回。(1)中断请求:中断源发出请求信号,单片机在运行主程序的同时,不断地检测是否有中断请求产生,在检测到有中断请求信号后,决定是否响应中断。(2)中断响应:当单片机满足响应中断后,进入中断服务程序。在响应中断后,必须保存主程序断点的地址(即当前PC值)和保护现场。(3)中断服务:执行中断服务程序。(4)中断返回:中断服务程序执行完成后,单片机重新返回到原来的程序中继续工作,并恢复断点、恢复现场。3.中断源

完成中断处理功能的部件称为中断系统,向单片机发出中断请求的来源,或引起中断的原因称为中断源。中断源要求服务的请求称为中断请求。中断源可分为两大类:①内部中断源——来自单片机内部;②外部中断源——来自单片机外部。通常单片机的中断源不止一个,当有多个中断源同时向单片机发出中断请求,要求为它服务时,单片机如何处理呢?通常会根据事件的轻重缓急进行排队,单片机优先处理最紧急事件,即事先规定中断源的中断优先级,单片机总是响应中断优先级最高的中断源的中断申请。4.中断嵌套

当单片机正在处理某一中断请求时,发生了另一个优先级比它高的中断请求。如果单片机暂停对原来中断源的处理程序,转而去处理优先级更高的中断请求源,处理完以后再返回处理原低级中断源,这样的过程称为中断嵌套。

1.分时操作中断可以使快速的CPU与慢速的外设同时工作;中断可使CPU与多个外设同时工作,大大提高了CPU的效率。

2.实时处理在实时控制中,可根据现场的各种参数、信息的变化要求随时向CPU发出中断申请,请求CPU实时处理。

3.故障处理中断系统可针对难以预料的情况或故障向CPU发出中断请求进行相应的故障处理,如掉电、存储出错、运算溢出等。中断的功能:

MCS-51单片机中断系统1.51单片机中断系统结构51单片机中断系统由中断源、中断寄存器和查询硬件等组成。中断系统提供了5个中断源和4个中断寄存器。

中断寄存器有4个:①中断源寄存器TCON(保存中断信息)

②SCON(保存中断信息)③中断允许控制寄存器IE(控制中断的开放和关闭)④中断优先级控制寄存器IP(设定优先级别)2.中断源和中断标志

串行口中断:串行口中断是由内部串行口中断源产生。每当串行口发送或接收一组串行数据时,就产生一个中断请求。

定时器/计数器中断:定时器溢出中断源由内部定时器/计数器产生,属于内部中断。定时计数器计数值到时,引起的中断。

5个中断源有(三类):

外部中断类:外部中断是由外部原因引起的,有外部中断0()和外部中断1(),外部中断请求有两种信号触发方式,即电平触发方式和跳变触发方式,(1)TCON中的中断标志位

D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0

8FH8EH8DH8CH8BH8AH89H88H外部中断INT0中断标志(TCON.1)

IE0=0,无中断请求。

IE0=1,外部中断0有中断请求。当CPU响应该中断,转向中断服务程序时,由硬件清“0”IE0。外部中断INT0触发方式控制位(TCON.0):

IT0=0,电平触发方式

IT0=1,跳变触发方式注意:该寄存器可以位寻址。T0溢出中断标志(TCON.5):T0启动计数后,计满溢出由硬件置位TF0=1,向CPU请求中断,此标志一直保持到CPU响应中断后,才由硬件自动清0。也可用软件查询该标志,并由软件清0。

TF1

TF0

IE1

IT1

IE0

IT0TCON76543210D7D6D5D4D3D2D1D0SM0SM1SM2RENTB0RB0TIRI(2)SCON的中断标志位

9FH9EH9DH9CH9BH9AH99H98H

TI(SCON.1)——串行发送中断标志

RI(SCON.0)——串行接收中断标志注意:该寄存器可以位寻址。中断系统有两种中断:一类为非屏蔽中断,不能用软件的方法加以禁止;另一类为可屏蔽中断,可以通过软件方法来控制是否允许某中断源的中断,允许中断称为中断开放,不允许中断称为中断屏蔽。51单片机的5个中断源都是可屏蔽中断,专用寄存器IE用于控制CPU对各中断源的开放或屏蔽。IE寄存器的字节地址为A8H,各位位地址为A8H~AFH。3.中断控制(1)中断屏蔽中断允许控制——中断允许寄存器IED7D6D5D4D3D2D1D0EA××ESET1EX1ET0EX0AFHAEHADHACHABHAAHA9HA8HIE对中断的开放和关闭为两级控制总的开关中断控制位EA(IE.7位):EA=0,所有中断请求被屏蔽。EA=1,CPU开放中断,但五个中断源的中断请求是否允许,还要由IE中的5个中断请求允许控制位决定。D7D6D5D4D3D2D1D0EA××ESET1EX1ET0EX0AFHAEHADHACHABHAAHA9HA8HIE中各位的功能如下:(1)EA:中断允许总控制位

0:CPU屏蔽所有的中断请求(CPU关中断);

1:CPU开放所有中断(CPU开中断)。(2)ES:串行口中断允许位

0:禁止串行口中断;

1:允许串行口中断。(3)ET1:定时器/计数器T1的溢出中断允许位

0:禁止T1溢出中断;

1:允许T1溢出中断。(4)EX1:外部中断1中断允许位

0:禁止外部中断1中断;

1:允许外部中断1中断。(5)ET0:定时器/计数器T0的溢出中断允许位

0:禁止T0溢出中断;

1:允许T0溢出中断。(6)EX0:外部中断0中断允许位。

0:禁止外部中断0中断;

1:允许外部中断0中断。

D7D6D5D4D3D2D1D0EA××ESET1EX1ET0EX0AFHAEHADHACHABHAAHA9HA8H

MCS-51单片机复位后,IE清0,所有中断请求被禁止。若使某一个中断源被允许中断,除了IE相应的位的被置“1”

,还必须使EA位=1。D7D6D5D4D3D2D1D0×××PSPT1PX1PT0PX0

BFHBEHBDHBCHBBHBAHB9HB8HIP各位的含义:(1)PS——串行口中断优先级控制位

1:高优先级中断;

0:低优先级中断。(2)PT1——定时器T1中断优先级控制位

1:高优先级中断;

0:低优先级中断。(3)PX1——外部中断1中断优先级控制位

1:高优先级中断;

0:低优先级中断。(2)中断优先级中断优先级寄存器IP(4)PT0——定时器T0中断优先级控制位

1:高优先级中断;

0:低优先级中断。(5)PX0——外部中断0中断优先级控制位

1:高优先级中断;

0:低优先级中断。

D7D6D5D4D3D2D1D0×××PSPT1PX1PT0PX0

BFHBEHBDHBCHBBHBAHB9HB8H注意:相应位为1,对应的中断源被设置为高优先级,相应位为0,对应的中断源被设置为低优先级系统复位时,IP寄存器中各位均为0,此时全部设定为低优先级该寄存器可以位寻址

当中断源的优先级设定为同一级别时,它们的优先排队顺序已由硬件电路确定了自然优先级,高低顺序如下:

中断源同级内优先级排列外部中断0中断定时器/计数器0中断外部中断1中断定时器/计数器1中断串行接口中断

最高

最低MCS-51系列单片机中断响应原则:

(1)高级中断请求可以中断正在执行的低级中断。

(2)同级或低级中断请求不能中断正在执行的中断。

(3)多个中断源同时向CPU申请中断,首先响应优先级别最高的中断请求;多个同级中断源同时向CPU申请中断,CPU通过内部硬件查询,按自然优先级确定优先响应哪一个中断请求。注意:CPU响应中断的基本条件:(1)首先要有中断源发出中断申请;

(2)CPU是开放中断的,即中断总允许位EA=1,CPU允许所有中断源申请中断;

(3)申请中断的中断源的中断允许位为1,即此中断源可以向CPU申请中断。

4.中断服务函数和中断编号函数类型函数名(形式参数列表)interruptn[usingm]注意:(1)中断函数不能进行参数传递(2)中断函数没有返回值(3)在任何情况下都不能直接调用中断函数m表示使用的工作寄存器组号,一般情况下采用默认值0即可;n是中断编号,取值范围为0~4。中断函数的格式如下:

最高40023H串口(RI或TI)3001BH定时/计数器1(TF1)20013H外部中断1中断(IE1)1000BH定时/计数器0(TF0)最低00003H外部中断0中断(IE0)自然优先级顺序中断编号中断服务程序入口地址中断源和中断标志

51单片机仅有两个外部中断请求输入端和。在实际应用中,根据要求可扩充外部中断源。

(1)用定时器作外部中断源51单片机有两个定时器,具有两个内中断标志和外计数引脚,它们的中断可作为外部中断请求使用。此时,可将定时器设置成计数方式,计数初值可设为满量程,则当它们的计数输入端T0(P3.4)或T1(P3.5)引脚发生负跳变时,计数器将加1产生溢出中断。因此,可把T0脚或T1脚作为外部中断请求输入线,把计数器的溢出中断作为外部中断请求标志。

5.外部中断源的扩展例:将定时器0扩展为外部中断源。解:将定时器0设定为方式2(自动恢复计数初值),TH0和TL0的初值均设置为0xFF,允许定时器0中断,CPU开放中断。源程序如下:

TMOD=0x06;

TH0=0xFF;

TL0=0xFF;

TR0=1;

ET0=1;

EA=1;当连接在T0(P3.4)引脚上的外部中断请求输入线发生负跳变时,TL0加1溢出,TF0置1,向CPU发出中断申请;同时,TH0的内容自动送至TL0,使TL0恢复初值。这样,T0引脚每输入一个负跳变,TF0都会置1,向CPU请求中断。此时,T0脚相当于边沿触发的外部中断源输入线。(2)中断和查询相结合

两根外部中断输入线(和脚)的每一根都可以通过线或的关系连接多个外部中断源。利用这两根外部中断输入线和并行输入端口线作为多个中断源的识别线,可达到扩展外部中断源的目的,其电路原理图如图所示。6.2.2中断控制LED的点亮与熄灭在AT89C51电路中,用其外部中断控制LED灯的亮与灭。P3.2连接一个轻触按键,由按键来控制LED灯的亮灭,当按键按下时LED灯亮,再次按下按键LED灯灭,如此反复。1.任务要求

2.任务分析

根据任务要求,需要通过按键来触发中断,一旦产生中断就去点亮或熄灭LED灯。我们可以将轻触按键的一端接到P3.2,另一端接地。P3.2在开机初始化为高电平1,这样一旦按键按下使其接地,P3.2脚会由高电平1变为低电平0,产生一个下跳变,触发中断,CPU接收到中断请求信号后去点亮或熄灭LED灯。由于设为下降沿触发,IT0要为1,所以TCON设为0x01。3.任务设计(1)器件的选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110kΩ电阻1220Ω电阻1发光二极管LED1轻触按键1(2)硬件原理图设计

//宏定义#include<reg51.h>//定义端口sbitLED=P0^0;//主程序voidmain(){LED=1;EA=1;//开中断

EX0=1;//允许INT0中断,可用IE=0x81代替上两行

TCON=0x01;//即IT0=1while(1);}//中断子程序voidExternal_Interrupt_0()interrupt0{LED=!LED;}(3)软件程序设计源程序:注意:开启的中断源一定要与中断子程序中的中断编号一致。在主程序中无需调用中断子程序,只要中断被触发,CPU会自动进入中断子程序工作。将编写的程序在KeilC51中编译成*.hex后调入Proteus硬件电路图的AT89C51中运行,第一次按下K1键D1点亮,第二次按下K1键D1熄灭,如此反复。(4)软硬件联合调试用AT89C51的定时/计数器中断法设计一个流水灯控制电路。具体要求如下:(1)系统时钟频率为12MHZ。(2)利用P2口控制8个发光二极管,以1s时间间隔从左到右依次点亮,模拟流水灯效果。1.任务要求

6.2.3中断控制流水灯的设计方法2.任务分析(1)定时1s由于系统时钟频率为12MHZ,则机器周期为1us,定时/计数器T0工作在方式1,最长定时只有65ms左右。为了实现1s的长定时,本任务采用“软件法”,先定时50ms,然后用变量count累计定时中断的次数,当中断的次数达到20次时,即实现了1s定时。(2)初始化程序设计本任务采用定时器中断方式工作。初始化程序包括定时器初始化和中断系统初始化,主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。具体如下:TMOD=0x01;//T0工作在方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;//50000*1us=50msEA=1;//CPU允许中断ET0=1;//允许T0中断TR0=1;//开启T03.任务设计(1)器件的选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110kΩ电阻1220Ω电阻8发光二极管LED8(2)硬件原理图设计(3)软件程序设计源程序://宏定义#include<reg51.h>#include<intrins.h>#defineucharunsignedchar//定义延时倍数ucharcount=0;//主程序voidmain(){TMOD=0x01;//T0工作在方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;//50000*1us=50msEA=1;//CPU允许中断ET0=

温馨提示

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

最新文档

评论

0/150

提交评论