您的当前位置:首页盐城工学院单片机实验指导书.doc

盐城工学院单片机实验指导书.doc

2020-12-02 来源:小侦探旅游网


单片机原理及接口技术

实验指导书

周云龙 编写

盐城工学院电气工程学院

二○一五年四月

实验一 KEIL集成开发环境应用实验

一、实验目的

1.掌握C51开发环境keil软件项目创建方法 2、汇编程序编写 2.C51程序编写

3、主函数、自定义函数和中断函数编写 二、实验备件

PC和单片机IDE集成开发软件 三、实验要求

1、建立一个汇编程序工程 2、汇编工程调试

3、建立一个C语言程序工程 4、C语言工程调试

实验二 Proteus单片机系统仿真实验

一、实验目的

1.掌握Proteus 界面功能 2、原理图绘制方法 2.住址仿真调试 3、Proteus与Keil联调 二、实验备件

PC、单片机IDE集成开发软件和Proteus仿真软件 三、实验步骤

1、学习Proteus软件

2、绘制教材中第150页上图5-7 3、Keil与Proteus联调

实验三 单片机最小系统的熟悉

一、实验目的

在进行其他硬件实验之前,先熟悉实验装置的核心模块——单片机最小系统模块。掌握该实验模块的电路原理和接口的使用方法。

1.掌握单片机振荡器时钟电路及CPU工作时序;掌握复位状态及复位电路设计;掌握单片机各引脚功能及通用I/O口的使用;掌握单片机基本指令的使用。 2.掌握uVision3 IDE集成开发环境,Proteus仿真软件和STC单片机下载软件ISP的使用。

3.将仿真现象和实验结果进行对比,体会仿真软件的用处。 二、实验设备

1.51仿真器或者串口线 2.单片机系统板 三、实验要求

1.连接实验电路,编写简易单片机汇编程序达到下述工作要求: P3.3口做输入口,外接一脉冲,每输入一个脉冲,P1口按十六进制加一输出,编写程序使P1口接的8个发光二极管L0—L7按16进制加一的方式点亮发光二极管。 2.将编写的程序经过编译后在uVision3 IDE软件中生成*.hex机器语言,通过ISP将*.hex下载到单片机芯片中,观察实验现象。

3. 用Proteus仿真软件画出实验电路图,将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象,比较该现象和在实验台上的现象是否相同。 四、实验原理图和程序框图

实验原理图和程序框图如图2-1-1和图2-1-2所示。 说明

1、P1口是准双向口,它作为输出口时与一般的双向口使用方法相同,由准双向口结构可知:当P1口作为输入口时,必须先对它置高电平,使内部MOS管截止,因内部上拉电阻是20KΩ~40KΩ,故不会对外部输入产生影响。若不先对它置高,且原来是低电平,则MOS管导通,读入的数据不正确。

2、延时子程序的延时计算。 void time(void) { unsigned int i; for (i=0;i<0xFFF;i++);} 五、实验步骤

}

图2-1-1 单片机I/O口应用一 图2-1-2 实验程序框图

{

1、系统板上P3.3用插针连至SP1脉冲, P1.0~P1.7(JU2)用8芯线连至 JL(L0~L7)。要求SP1脉冲每按一次,L0~L7发光二极管按16进制方式加一

点亮。

说明:SP1脉冲每按一次按钮,输出一个负脉冲,而L0~L7为带驱动的8路LED发光管,高电平亮,低电平灭。L0~L7为引出插孔,JL为引出插座。 2、实验示例程序:

void main()

sbit k1 = P3^3;

void delay(uint x)

程序实例如下:

#include

uint i,j;

for(i=x;i>0;i--)

#define uint unsigned int

#define uchar unsigned char

for(j=110;j>0;j--);

{ }

3、在uVision3 IDE集成开发环境中编写单片机程序,进行程序编译,排除所有的错误,直到编译完全成功。

4、经过编译后通过ISP将*.hex下载到STC单片机芯片中,观察实验现象。 5、将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象,实验仿真电路如图2-1-3所示。

选取的元器件: (1)单片机:AT89C51 (2)电阻:RES (3)开关:BUTTON (4)瓷片电容:CAP (5)电解电容:CAP-ELEC

(6)黄色发光二极管:LED-YELLOW (7)晶振:CRYSTAL 六、实验报告

1. 说明单片机的各个引脚的功能及作用,比较P0,P3脚的异同?

2. 时钟周期、机器周期的关系是什么?在单片机外部晶振为12M时,机器周期为多少?当晶振为6M时呢? 3. 画出实验原理图。

4. 给出单片机程序流程图和程序清单。

5. 进行完该项实验后,你对单片机的开发工具和开发过程了解了吗?请画出单片机开发过程流程图。

while(1) { }

if(k1==0) { }

delay(10); //去抖延时 if(k1==0) P2=P2+1; while(k1==0);

D1C130pfaLED-YELLOWR1200U1X119XTAL1CRYSTAL18XTAL2P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617abcdefghbD2LED-YELLOWR2200C230pfD3cLED-YELLOWR910kR32009RSTC31uF293031PSENALEEAD4dLED-YELLOWR4200D5eLED-YELLOWR520012345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51D6fLED-YELLOWR6200D7gLED-YELLOWR7200D8hLED-YELLOWR8200 图2-1-3 硬件仿真图和仿真结果

实验四 数码管动态扫描显示实验

一、实验目的

1.学习和理解数码管动态扫描的工作原理。

2.学习和掌握数码管动态扫描的电路接口设计及程序编写。 二、实验设备

1.USB线

2.单片机最小系统教学实验模块 3.动态数码管显示模块 三、实验要求

1. 使8位数码管动态显示“0 1 2 3 4 5 6 7”字样

2. 使8位数码管动态显示时间2014年10月20日,即“2 0 1 4 10 2 0”字样 3. 用Proteus仿真软件画出实验电路图,将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象。

4. 选择相应的实验模块,搭建电路,完成用数码管显示“2 0 1 4 10 2 0”。 四、实验原理

1. 8段数码管显示原理

数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。对于“共阳极”的数码管,内部每个发光二极管的阳极被接在一起,成为该各段的公共选通线;发光二极管的阴极则成为段选线。对于“共阴极”数码管,则正好相反,内部发光二极管的阴极接在一起,阳极成为段选线。这两种数码管的驱动方式是不同的。当需要点亮“共阳极”数码管的一段时,公共段需接高电平(即写逻辑1)、该段的段选线接低电平(即写逻辑0),从而该段被点亮。当需要点亮“共阴极”数码管的一段时,公共段需接低电平(即写逻辑0)、该段的段选线接高电平(即写逻辑1),该段被点亮。

数码管的段位顺序如右图所示:

一般来说在一个字节中按照dpgfedcba的顺序放置字型码,比如在一个“共阴极”数码管上要显示“1”,则b、c段需被点亮,因此在段选线中写入06H。例如使用P0口接段选线,则使用下面的语句即可点亮数码管: P0=0x06; 对应规则: dp----->D7 g----->D6 f----->D5

e----->D4 d----->D3 c----->D2 b----->D1 a--->D0 2. 多位数码管的显示

在多位8段数码管显示时,为了简化硬件电路,通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O口控制,形成段选线的多路复用。而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”。在这种方式中,虽然每一时刻只选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多位数码管同时被点亮了。 8位8段LED动态显示器电原理图如图2-2-1所示。

图2-2-1 8位8段LED动态显示器电原理图 表2-1所示为一个8位8段LED动态显示器电路原理图。其中段选线占用一个8位I/O口,位选线占用一个8位I/O口,由于各位的段选线并联,段线码的输出对各位来说都是相同的。因此,同一时刻,如果各位位选线都处于选通状态的话,8位LED将显示相同的字符。若要各位LED能够显示出与本位相应的显示字符,就必须采用扫描显示方式,即在某一位的位选线处于选通状态时,其它各位的位选线处于关闭状态,这样,8位LED中只有选通的那一位显示出字符,而其它位则是熄灭的。同样,在下一时刻,只让下一位的位选线处于选通状态,而其他的位选线处于关闭状态。如此循环下去,就可以使各位“同时”显示出将要显示的字符。由于人眼有视觉暂留现象,只要每位显示间隔足够短,则可造成多位同时亮的假象,达到显示的目的。 五、实验步骤

8位共阴极数码管动态扫描显示的单片机电路连线如图2-2-2所示,图中的三角形符号是加在位选线上的驱动,即74LS244,这一举措使得数码管能够得到合适的亮度。数码管的位选是由P2口控制,第一个数码管的位选由P2.0控制,数

码管的段选由P0口控制,P0.7~P0.0分别连接数码管的dp~a。

1、按照图2-2-2的电路原理,用导线正确连接动态扫描方式实验模块和单片机最小系统模块。

图2-2-2 扫描8位LED动态显示器

2、实验要求1的示例程序如下: #include #include #define uchar unsigned char #define uint unsigned int uchar code table[]=

{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9的字符编码

void delay(uchar z) { }

void main() {

uchar i,m=0xfe;

P0=0x00;//关闭数码管的段选 P2=0xff;//关闭数码管的位选 uchar i,j; for(i=z;i>0;i--) for(j=110;j>0;j--);

while(1) { }

for(i=0;i<8;i++) { }

P2=m; //选通某个数码管的位选 P0=table[i]; //将段码送给上面数码管的段 delay(2);

m=_crol_(m,1);

} 将程序进行调试,直至达到实验要求。 3.仿真电路图

将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象,实验仿真电路如图2-2-3所示。

选取的元器件: (1)单片机:AT89C51 (2)电阻:RES (3)排阻:RX8 (4)瓷片电容:CAP (5)电解电容:CAP-ELEC

(6)8位共阴极数码管:7SEG-MPX8-CC-BLUE (7)晶振:CRYSTAL 六、实验报告

1. 画出实验电路原理图,并简要分析电路的执行过程。

2. 画出单片机程序的流程图,给出程序清单,并给予适当注释。

3. 如果将数码管换成共阳极,电路中要做那些修改?程序中要做哪些修改,给出共阳极数码管动态扫描显示的电路和程序清单。 4.实验过程中遇到哪些问题,是如何解决的?

87654321RN1RX8910111213141516U219XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617abcdefgh18XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51abcdefgh 图2-2-3硬件仿真图和仿真结果

实验五 中断优先级控制及中断保护实验

一、实验目的

1、掌握单片机中断机制 2、熟悉中断的应用和编程 二、实验设备 USB线 单片机最小系统 发光二极管阵列显示模块 2路手动±单脉冲 三、实验要求

1. 连接单片机最小系统和发光二极管阵列的电路并编写程序,学习单片机中断机制及中断优先级和中断保护的方法。

2. 选择相应的实验模块,画出电路图,实现下列功能:使用手动单脉冲SP1连接INT0(P3.2), 手动单脉冲SP2连接INT1(P3.3),单片机P2口连接8个发光二极管,将单片机的电源+5V与地线连接上。

要求:在平时状态下,发光二极管行以200ms的时间间隔,依次点亮。 在INT1中断时亮一半,暗一半;在INT0中断时全灭,INT0中断为高优先级,INT1中断为低优先级。

3. 选择相应的实验模块,画出电路图,实现下列功能:使用手动单脉冲SP1连接INT0(P3.2), 手动单脉冲SP2连接INT1(P3.3),单片机P2口连接8个发光二极管,将单片机的电源+5V与地线连接上。

要求:在平时状态下,发光二极管行以200ms的时间间隔,依次点亮。单脉冲SP1按下时INT0中断处理程序点亮P2.0对应的发光管2秒钟,其他发光管熄灭;单脉冲SP2按下时P2.1对应发光管点亮2秒,其他发光管熄灭,INT0中断为低优先级,INT1中断为高优先级。

4. 用Proteus仿真软件画出实验电路图,将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象。 四、实验原理

通常一个微处理器读取外围设备(如键盘等)的输入信息的方法有轮询(Polling)及中断(Interrupt)两种。轮询的方法是CPU依照某种既定法则,依序询问每一外围设备I/O是否需要服务,此种方法CPU需花费一些时间来做询问服务,当I/O设备增加时,询问服务时间也相对增加,因此势必浪费许多CPU时间,降低整体运行的效率。使用中断是一个较好的解决方法。使用中断使系统对外部设备的请求响应更加灵敏,并且不需要占用CPU的时间进行轮询。但是,当使用中断,特别是有多个中断嵌套时要特别注意内存单元内容的保护。 1. 80C51中断结构

当中断发生后,程序将跳至对应中断入口地址去执行中断子程序,或称中断服务例程(Interrupt Service Routine),这些特殊的地址称为中断向量,例如当80C51外部中断INTl发生时,会暂停主程序的执行,跳至地址0013H去执行中断服务例程,直到RETI指令后,才返回主程序继续执行。MCS-51系列的程序内存中有7个矢量地址,叙述如下: (1)00H复位

当第9脚RESET为高电平,CPU会跳至地址00H处开始执行程序,亦即程序一定要从地址00H开始写起。 (2)03H(外部中断0)

当INT0引脚由高电位变至低电位时,CPU会接受外部中断0,并跳至地址03H处去执行中断子程序。 (3)0BH(计时/计数器0中断)

当CPU接受计时/计数器0中断置位而产生中断要求时,会跳至地址0BH处去执行中断子程序。 (4)13H(外部中断1)

当INTl引脚由高电位变至低电位时,CPU会接受外部中断1,并跳至地址13H处去执行中断子程序。 (5)1BH(计时/计数器1中断)

当CPU接受计时/计数器1中断置位而产生中断要求时,会跳至地址1BH刻去执行中断子程序。 (6)23H(串行中断1)

当串行端口传送数据或接收数据完毕时,CPU会接受串行中断,并跳至地址23H处去执行中断子程序。 (7)2BH(计时/计数器2中断)

当CPU接受计时/计数器2产生中断要求时,会跳至地址2BH处去执行中断子程序。此中断仅8052系列才有。 2.中断使能位

8051针对中断提供两层使能,第一层为EA全局使能控制,第二层为分别控制EX0,ET0、EXl、ETl、ES、ET2。当8051在初始状态时,寄存器的各个中断使能位都预设为“0”,即所有中断都禁止,故欲允许中断时,应先使能相对应的中断。当中断产生后,此中断状态会记录于定时器/计数器控制寄存器(Timer/CounterControlRigister,TCON)的中断请求标志(InterruptRequest flag)中,当标志被设立,表示中断已发生。由图2-3-1可知,当外部中断或定时器0、定时器1中断发生时,CPU都可以判别是哪种中断。因此当这四个中断发生时,中断服务例程被执行后,CPU会主动清除中断请求标志,对于其他的中断,由于CPU

无法判别,因此中断请求标志需由程序指令来清除。另外,在TCON中尚有两个位称为中断型式控制位(Wype control bit),经由这两个位的设定,可以边择外部中断为负边缘触发或低电平触发。

欲设定中断使能与否,必须规划位于特殊功能寄存器中的中断使能寄存器IE(Interrupt Enable Register),其位于地址A8H,是一个可位寻址的寄存器。 3.中断保护

由于各个中断执行的起始地址间仅有8个Bytes,因此欲在此空间内完成中断服务例程是有困难的。通常中断服务例程是置于主程序后面,而在中断向量地址只书写跳跃指令,跳至相对应中断服务例程去执行。当执行新的中断服务例程时,注意不可以破坏旧有的数据和状态,因此在编写时还要保存各个寄存器的数据。通常会被更改的数据(如ACC、PSW等),可以利用堆栈在执行中断服务例程之前就将其PUSH起来,待执行结束后再将相关寄存器POP即可。另外,因为8051可任意选择四个寄存器库中的一组寄存器,所以利用选择不同寄存器库的方式亦可达到数据保存的目的。 4.中断优先级

8051对于各种中断优先权采用双层结构,首先对于优先权可由中断优先权寄存器(Interrupt Priority IP)设定该中断为高优先权或低优先权,高优先权可以中断低优先权,但是当优先权相同时(都为高优先权或低优先权),则由内部的轮询顺序决定哪一个中断被接受,轮询次序如图2-3-1所示。

EX0 IE0 ET0 EX1 IE1 ET1 ES + + ET2 EA 高优先级 PX0 PT0 PX1 PT1 PS PT2 低优先级 高 低 -INT0 TE0 -INT1 TF1 R1 T1 TF2 EXF2 IT0选择低准位或负沿触发 IT1选择低准位或负沿触发 图2-3-1 MCU内部中断机制 IP寄存器:

PS PT1 PX1 PT0 PX0 PX0,PX1:外部中断0,1的中断优先级控制;1->高优先级,0->低优先级。 PT0,PT1:定时器/计数器0,1的中断优先级控制; PS:串行口中断优先级控制。

IP中对应位全为零时,CPU按照片内硬件优先级来顺序响应中断: 中断源

外部中断0 高 定时器/计数器0 外部中断1 定时器/计数器1

串行口中断 低 五、实验步骤

本实验将练习使用INT0,INT1的中断,利用按键来触发外部中断的发生。并通过两个中断先后到达的方法,来学习中断优先级的意义与控制。 1、电路说明

在图2-3-2中,主程序执行时,单片机端口P2所接的LED由P2.7至P2.0一次一颗循环点亮。当外部中断0产生后,执行该中断子程序,此时P2.0对应的二极管亮,其他二极管熄灭。2秒钟后,返回主程序继续中断前的工作。INT1中断子程序则为点亮P2.1对应的二极管,其他二极管熄灭。注意,由于每次在按键按下或放开可能会有抖动现象,因而必须进行必要的保护,以免产生二次以上的相同中断信号。

在程序主循环进行时,当SP1按下,相应发光管点亮后,立即再按下SP2,看反应如何;在程序主循环进行时,按下SP2,相应发光管点亮后,立即按下SP1,观察反应。

电路连线如图2-3-2:

图2-3-2 实验电路参考

2.程序设计

先按SP1执行INT0中断子程序,在此中断子程序未结束前再按SP2,或是先按SP2执行INT1中断子程序,在此中断子程序未结束前再按SP1,或两者同时按,观察lED亮暗的情形即可观察中断优先权执行的情形。

编写并运行程序,观察是否符合理论分析的结果。 3.仿真电路图

将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象,实验仿真电路如图2-3-3所示。

选取的元器件: (1)单片机:AT89C51 (2)电阻:RES (3)开关:BUTTON (4)瓷片电容:CAP (5)电解电容:CAP-ELEC

(6)黄色发光二极管:LED-YELLOW (7)晶振:CRYSTAL

图2-3-3 硬件仿真图和仿真结果

六、实验报告

画出电路原理图,并简要分析工作原理; 提供程序清单,适当给出注释;

分析51单片机的中断运行的机制,它具有那些中断,对应的中断矢量地址是什么?中断使能位是什么?

各中断源的硬件优先级的顺序是怎样的?哪个寄存器能够控制单片机中断源的优先级?怎样控制? 七、参考程序清单

实验要求2:使用单脉冲SP1连接INT0(P3.2),单脉冲SP2连接INT1(P3.3),单片机P2口连接8个发光二极管,将单片机的电源+5V与地线连接上。

要求:在平时状态下,发光二极管行以200ms的时间间隔,依次点亮。 在INT1中断时亮一半,暗一半;在INT0中断时全灭。 #include #include #define uchar unsigned char #define uint unsigned int uchar i,j,aa; void delay(uint z) { } void init() { }

void main() { }

void int0() interrupt 0 {

init(); aa=0x01; while(1) {

P2=aa; delay(200);

aa=_crol_(aa,1);//aa循环左移一位

}

IT0=1; //INT0边沿触发 IT1=1; //INTl边沿触发 EA=1; //开总中断 EX0=1; //使能INT0 EX1=1; //使能INTl PX0=1; //中断0优先 uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

for(i=8;i>0;i--)

{ }

P2=0x00; //P2口送出00H使灯熄灭,循环8次 delay(500);

void int1() interrupt 2 { }

实验要求3:使用单脉冲SP1连接INT0(P3.2),单脉冲SP2连接INT1(P3.3),单片机P2口连接八个发光二极管,将单片机的电源+5V与地线连接上。

要求:在平时状态下,发光二极管行以200ms的时间间隔,依次点亮。单脉冲SP1按下时INT0中断处理程序点亮P2.0对应的发光管2秒钟,其他发光管熄灭;单脉冲SP2按下时P2.1对应发光管点亮2秒,其他发光管熄灭。 #include #include #define uchar unsigned char #define uint unsigned int uchar aa,i,i; void delay(uint z) { } void init()

uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); for(j=8;j>0;j--)

{ }

P2=0x0f; //低4位亮,高四位暗 delay(500);

P2=0xf0; //低4位暗,高四位亮 delay(500);

{ }

void main() { }

void int0() interrupt 0 {

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

P2=0x01; //点亮P2.0

} }

void int1() interrupt 2 {

for(j=0;j<4;j++) {

P2=0x02; //点亮P2.1 delay(500); init(); aa=0x01; while(1) {

P2=aa; delay(200);

aa=_crol_(aa,1);//aa循环左移一位

}

IT0=1; //INT0边沿触发 IT1=1; //INTl边沿触发 EA=1; //开总中断 EX0=1; //使能INT0 EX1=1; //使能INTl PX1=1; //中断1优先

} }

delay(500);

实验六 低频脉冲计数器实验

一、实验目的

1、掌握定时器的工作原理

2、学习单片机定时器的应用设计和调试 二、实验设备 1、USB线 2、单片机最小系统

3、波形信号发生器或时钟源模块 4、数码管动态显示 三、实验要求

1. 连接电路并编写程序,使单片机定时器/计数器T0工作于定时器模式,T1工作于计数模式,即作为一个低频脉冲计数器,将实验箱信号源的值分别设为10Hz,100Hz,1000Hz,10000Hz,通过单片机在1s内对脉冲计数,要求在数码管上分别显示对应的频率值。

2. 用Proteus仿真软件画出实验电路图,将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象。 四、实验原理

805l单片机内部有两个16位可编程定时/计数器,记为T0和Tl。8052单片机内除了T0和T1之外,还有第三个16位的定时器/计数器,记为T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部事件计数器用。 定时器T0由特殊功能寄存器TL0和TH0组成,定时器Tl由特殊功能寄存器TLl和TH1组成。定时器的工作方式由特殊功能寄存器TMOD编程决定,定时器的运行由特殊功能寄存器TCON编程控制。

T0、T1在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU转向中断处理程序,从而完成某种定时控制功能。T0、T1用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由P3口的P3.4(或P3.5)即T0(或T1)引脚输入。 方式控制寄存器TMOD的控制字格式如下: 7 6 5 4 3 2 GATE 1 M1 0 M0 C/T M1 M0 GATE C/T \\_____________T1_________________/ \\_______________T0_________________/

低4位为T0的控制字,高4位为T1的控制字。GATE为门控位,对定时器/计数器的启动起辅助控制作用。GATE=l时,定时器/计数器的计数受外部引脚输入电平的控制。此时只有P3口的P3.2(或P3.3)引脚INT0(或INT1)为1

才能启动计数;GATE=0时。定时器/计数器的运行不受外部输入引脚的控制。

C/T为方式选择位。C/T=0为定时器方式,采用单片机内部振荡脉冲的12分频信号作为时钟计时脉冲,若采用12MHz的振荡器,则定时器的计数频率为1MHZ,从定时器的计数值便可求得定时的时间。

C/T为计数器方式。采用外部引脚(T0为P3.4,Tl为P3.5)的输入脉冲作为计数脉冲,当T0(或T1)输入信号发生从高到低的负跳变时,计数器加1。最高计数频率为单片机时钟频率的1/24。

M1、M0二位的状态确定了定时器的工作方式,详见表4-1。

表4-1定时器工作模式表:

Ml 0 0 l 1 M0 0 1 0 1 功能说明 方式0,为13位定时器/计数器 方式1,为16位的定时器/计数器 方式2,为常数自动重新装入的8位定时器/计数器 方式3,仅适用于T0,分为二个8位计数器 方式0与方式1的差别是计数器的位数,前者13位,后者16位。定时器内部结构逻辑图如图2-4-1所示。

GATE INT1 T1脚 振荡器 fosc TR1 + 12 TL1 TH1 TF 中断

图2-4-1 定时器内部逻辑图 五、实验步骤 1.电路连接

参考以下电路示意图连接电路:

T1

图2-4-2 计数器参考电路示意图

2.软件编写 示例程序如下: #include #define uchar unsigned char #define uint unsigned int

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9的字符编码

uchar timecount; unsigned long count;

uchar b1,b2,b3,b4,b5,b6,b7,b8;

void display(unsigned long count); //显示子程序 void delay(uint z); //延时子程序 void main(void) {

count=0; //计数脉冲赋初值0//

TMOD=0x15; //给TOMD送方式控制字,使T0为计数方式,T1为定时方式

TH1=(65536-50000)/256; TL1=(65536-50000)%256; TH0=0; TL0=0; ET0=1; ET1=1; EA=1; TR0=1; TR1=1; while(1)

{

if(timecount==20)

{ }

TR0=0;

TR1=0; //1秒时间到,关掉定时/计数器

count=TH0*256+TL0; // 计算脉冲个数

display(count); }

void delay(uint z) { }

void display(unsigned long a) {

b1=a%10; //计算b1位 }

void t1 (void) interrupt 3 using 1 //中断服务函数 {

a=a/10;

b2=a%10; // 计算b2位 a=a/10;

b3=a%10; //计算b3位 b4=a/10; //计算b4位

//送入右边第1位数码管位选信号,显示数字

P0=table[b1]; //送入右边第1位数码管的段选信号 delay(1); P2=0xbf; delay(1); P2=0xdf; delay(1); P2=0xef; delay(1);

//送入右边第4位数码管位选信号,显示数字

P0=table[b4]; //送入右边第4位数码管的段选信号

//送入右边第3位数码管位选信号,显示数字

P0=table[b3]; //送入右边第3位数码管的段选信号

//送入右边第2位数码管位选信号,显示数字

P0=table[b2]; //送入右边第2位数码管的段选信号

uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

P2=0x7f;

TH1=(65536-50000)/256; TL1=(65536-50000)%256; timecount++; }

3.仿真电路图

将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象,实验仿真电路如图2-4-3所示。

选取的元器件: (1)单片机:AT89C51 (2)电阻:RES (3)排阻:RX8 (4)瓷片电容:CAP (5)电解电容:CAP-ELEC

(6)8位共阴极数码管:7SEG-MPX8-CC-BLUE (7)晶振:CRYSTAL 虚拟检测仪器: (1)单击工具栏按钮

,然后在对象选择器中选择COUNTER TIMER(计

数/定时器),如图2-4-3所示,打开其属性编辑框,单击运行模式下的下拉菜单,如图2-4-4所示,可选择计时、频率、计数模式,当前设置为频率计工作方式。

CLKCERST

图2-4-3计数/定时器 图2-4-4计数/定时器 (2)数字时钟 单击按钮

,在对象选择器中选择DCLOCK(数字时钟)。在需要添加信号

的或终端单击即可完成添加DCLOCK输入信号。当前设置频率值为1000Hz,如

图2-4-5所示。

图2-4-5 数字时钟的选择和设置

8位共阴极数码管87654321RN1220C122pFU1X112M1819XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617abcdefghC222pFXTAL2R110k9RSTC310uF293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51a9b10c11d12e13f14g15dp16clkCLKCERST 图2-4-3硬件仿真图和仿真结果

输入计数频率为1000Hz,在数码管上显示的是1004(百分误差小于0.005)。 六、实验报告

1. 画出电路原理图。

2. 对51单片机的可编程计数器/定时器的工作原理进行说明。

3. 给出根据实验要求编写程序清单、并给予适当注释。 4. 请说明在本实验中T0计数器是怎样工作的。

实验七 矩阵式键盘输入实验

一、实验目的

1.学习矩阵式键盘工作原理

2.学习矩阵式接口的电路设计和程序设计 二、实验设备

1.USB线

2.单片机最小系统实验教学模块 3.矩阵式键盘实验模块 4.动态扫描数码管显示模块 三、实验要求

1. 在矩阵式键盘中的某个键被按下时,8位LED动态显示器上最低位显示该键对应的字符,以前的字符向高位推进1位(即类似于计算器)。

2. 在矩阵式键盘中的某个键被按下时,8位LED动态显示器上最高位显示该键对应的字符,以前的字符向低位推进1位。

3. 用Proteus仿真软件画出实验电路图,将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象。 四、实验原理

矩阵式由行线和列线组成,按键位于行、列的交叉点上。如图 2-5-1所示,一个4*4的行、列结构可以构成一个由16个按键的键盘。很明显,在按键数量较多的场合,矩阵式键盘与独立式键盘相比,要节省很多的I/0口。

图 2-5-1 矩阵式键盘结构

1 . 矩阵式键盘工作原理

按键设置在行、列交节点上,行、列分别连接到按键开关的两端。行线通过上拉电阻接到VCC上。平时无按键动作时,行线处于高电平状态,而当有按键按下时,列线电平为低,行线电平为低。这一点是识别矩阵式键盘是否被按下的关键所在。因此,各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。

29

2. 按键识别方法

下面以图 2-5-2中5号键被按下为例,来说明此键是如何被识别出来的。 前已述及,键被按下时,与此键相连的行线电平将由与此键相连的列线电平决定,而行线电平在无键按下时处于高电平状态。如果让所有列线处于高电平那么键按下与否不会引起行线电平的状态变化,始终是高电平,所以,让所有列线处于高电平是没法识别出按键的。现在反过来,让所有列线处于低电平,很明显,按下的键所在行电平将也被置为低电平,根据此变化,便能判定该行一定有键被按下。但我们还不能确定是这一行的哪个键被按下。所以,为了进一步判定到底是哪—列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。当第1列为低电平,其余各列为高电平时,因为是键5被按下,所以第1行仍处于高电平状态;当第2列为低电平,其余各列为高电平时,同样我们会发现第1行仍处于高电平状态,直到让第3列为低电平,其余各列为高电平时,因为是5号键被按下,所以第3行出现低电平,据此,我们确信第3行第3列交叉点处的按键即5号键被按下。

根据上面的分析,很容易得出矩阵键盘按键的识别方法,此方法分两步进行。第一步,识别键盘有无健被按下;第二步,如果有键被按下,识别出具体的按键。分述如下:

识别键盘有无键被按下的方法是:让所有列线均为低电平,检查各行线电平是否有低电平,如果有,则说明有键被按下,如果没有,则说明无键被按下(实际编程时应考虑按键抖动的影响,通常总是采用软件延时的方法进行消抖处理)。 识别具体按键的方法是(亦称之为扫描法):逐列置低电平,并检查各行线电平的变化,如果某行电平由高电平变为低电平,则可确定此行此列交叉点处按键被按下。 五、实验步骤

图 2-5-2 实验硬件连线图

30

1、按照图 2-5-2的电路图,用导线将矩阵式键盘、数码管动态扫描显示模块和单片机的最小系统实验模块连接正确。

2、示例程序如下: #include #include #define uchar unsigned char #define uint unsigned int

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d, 0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

uchar Display_Buffer[]={ 16,16,16,16,16,16,16,16}; void delay(uint z) { }

kscan(void) {

uchar i, temp,num=16; for(i=0;i<4;i++) {

P1=_crol_(0xef,i); //逐列扫描 temp=P3;

temp=temp & 0x0f; if(temp!=0x0f) {

delay(20); temp=P3;

temp=temp & 0x0f; if(temp!=0x0f) {

temp=(P1&0xf0)|( P3&0x0f); switch(temp)

uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--);

31

}

}

}

}

{ } { }

case 0xe7:num=0;break; case 0xeb:num=4;break; case 0xed:num=8;break; case 0xee:num=12;break; case 0xd7:num=1;break; case 0xdb:num=5;break; case 0xdd:num=9;break; case 0xde:num=13;break; case 0xb7:num=2;break; case 0xbb:num=6;break; case 0xbd:num=10;break; case 0xbe:num=14;break; case 0x77:num=3;break; case 0x7b:num=7;break; case 0x7d:num=11;break; case 0x7e:num=15;break; default:break; temp=P3;

while((temp & 0x0f)!=0x0f) // 等待按键释放

return num;

void main() {

32

}

int k,m=0x7f,num;

P0=0x00; //关闭数码管的段选 P2=0xff; //关闭数码管的位选 while(1) { }

num=kscan(); if(num!=16) {

{

Display_Buffer[k-1]=Display_Buffer[k];//显示向前移动一位 }

for(k=1;k<8;k++)

Display_Buffer[7]=num; num=16; }

for(k=0;k<8;k++)

{ }

m=_crol_(m,1); P2=m;

P0=table[Display_Buffer[k]]; delay(2);

3、仿真电路图

将在uVision3 IDE软件中生成*.hex下载到Proteus仿真电路图中的单片机芯片中,观察实验现象,实验仿真电路如图 2-5-3所示。

选取的元器件: (1)单片机:AT89C51 (2)电阻:RES (3)开关:BUTTON (4)瓷片电容:CAP

33

(5)电解电容:CAP-ELEC (6)8位共阴极数码管:7SEG-MPX8-CC-BLUE (7)晶振:CRYSTAL (8)三极管:NPN (9)排阻:RX8 RP14708位共阴极数码管abcdefgh1C122pFU1X112M18XTAL219XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617abcdefghC222pFR110k9RSTC310uF293031PSENALEEAp1.6p1.5p1.7p1.4FEDCp3.0p1.4p1.5p1.6p1.7BA98p3.112345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C517654p3.2p3.3p3.2p3.1p3.03210abcdefgh23456789p3.3 图 2-5-3硬件仿真图和仿真结果 六、实验报告 1、画出接口电路原理图,并简要分析电路的执行过程。 2、给出针对实验要求编写程序流程图、程序清单、并给予适当注释。 3、图 2-5-2的电路示意图共采用了P0、P1、P2三个I/O口,你有没有更节省I/O线的方案?请给出电路示意图。 4、实验过程中遇到哪些问题,是如何解决的? 34 实验八 矩阵式键盘输入实验

一、实验目的:

1.了解51单片机串行口的工作原理 2.掌握51单片机串行口应用及编程

二、基本原理:

1、串行口工作在方式1时,可通过定时计数器T1为波特率发生器,单片机实验模块串口设定为工作方式2、PC与单片机通讯时PC端用调试助手,PC向单片机发1-9数字时,单片机返回a-i的ASIC码,PC接收并显示。 3、波特率选择9600bps

三、仪器设备:

1、微型计算机

2、单片机实验模块

3、连接导线和 USB通讯线

四、实验步骤:

1、编写串口初始化程序 2、编写通讯程序

3、连接硬件进行调试 4、仿真调试

五、实验预习

1. 参阅MCS-51有关串行通讯及其接口部分章节。 2. 参阅MCS-51有关中断部分章节。

3. 参阅MCS-51有关定时器/计数器部分章节。 4. 弄清串行口自发自收的有关原理及过程。

35

因篇幅问题不能全部显示,请点此查看更多更全内容