{ }
TMOD=0X61;//T1计数器,方式2,T0定时器,方式1 timer0H=0;//T0定时器初值 timer0L=0;
TH1=TL1=56;//T1计数器初值 256-200=56 EA=1;//开总中断
ET0=1;//开定时器0中断 TR0=1;//启动定时器0 ET1=1;//开启T1中断 TR1=1;//开启T1 while(1);
5、电路图
6、仿真结果
频率计显示的与脉冲发生器的频率基本一致。
实验六 串口通信实验 自我完成实验 1、实验要求
本实验利用 74LS165 实现串口转并行输入端口,用来采集 DSW1 的开关数据。采集来的数据通过 74LS164 实现的串口转并行输出端口送给两个 7 段 LED 数码管 7SEG1 7SEG2。RN1和 RN2 是两个排阻用于限流。图 3.22 中的 R2,R3,C1 和 KEY1 用于产低电平脉冲,其中的 R2,R3 和 C1 用于去除按键抖动。该电平脉冲一方面连接至 P1.1 用于 CPU 探测该脉冲的产生时间,另一方面经过 U6A 的 74LS04 之后连接至 74LS165 的 1 号(SH/LD),该信号在按键 KEY1 未被按下时为低电平,74LS165 的输入一直被加载至器件内部的所存器,当 KEY1被按下时该信号为高电平,74LS165 加载的数据将在 2 号引脚 CLK 的同步下被串行移出并进入单片机的 RXD 端口。
由于 74LS165 的 9 号引脚需要连接到单片机的 RXD 端口,而 RXD 又需要连接至 164 的1、2 号管脚。同时,单片机的 TXD 引脚不论在读 74LS165 的数据还是向 74LS164 输出数据时都提供时钟。为了防止 74LS165 的 9 号引脚输出影响 RXD 至 164 的 1、2 号引脚的输出,而且防止 74LS165 的输出被相同的时钟直接移位进入 164(走近路),单片机的 TXD 和 RXD需要分时接入 74LS165 和 74LS164。分时控制的方法就是利用 U5(74LS125)这一三态选通缓冲器来实现。TXD 接入 U5A 和 U5D 的输入端,RXD 接入 U5C 的输入和 U5B 的输出。U5A 的输出接 74LS165 的 CLK,U5B 的输入接 74LS165 的 9 号引脚,当 P1.0=0 时这两个三态缓冲器是接通的,即 RXD 接至 74LS165 的 9 号引脚,TXD 接至 74LS165 的 CLK,可以实现单片机对74LS165 的串行读取。反之,当 P1.0=1 时,经过反相器使得 U5C 和 U5D 接通,使得 TXD 接至 74LS164 的 CLK,RXD 接至 74LS164 的 1,2 号引脚,可以实现单片机对 164 的串行输出。
最终要求实现的功能是:当按键按下时,DSW1 的开关数据能够被单片机通过 74LS165串行读取,并通过 74LS164 串行输出至两个 7 段数码管 7SEG1 和 7SEG2 显示,要求显示的据和 DSW1 的开关数据一致,没有错误数据被读入或显示。
2、编程思路
串行口工作在定时器模式方式 0 模式(即:SM1=0,SM0=0)。串行口的数据收发利用查 询模式实现。只有当查询到 P1.1 有低电平出现时才启动数据收发过程。启动的方法就是先 使 P1.0=0 打开接收通道,再使接收控制(REN=1)使能,这时 TXD 就会自动输出时钟,由于这时 74LS165 正处于移位模式(SH/LD 引脚为高电平),数据会自动串行移入单片机的 RXD端口。查询接收完成标志 RI,当 RI=1 时 1 个字节接收完成,清掉 RI(即使 RI=0)。然后,使 P1.0=1,打开输出 74LS164 通道,把刚才接收的那个数据分低半字节和高半字节,分别查询出它们共阳七段数码管的显示码,再将显示码(16 位)移位送出至 74LS164。两个 74LS164是按级联方式连接的,先送出的会到达 U3 输出端,后送出的会到达 U2 输出端。送时通过TI 标志位查询发送一个字节是否完成。
3、实验步骤
① 根据上述实验内容,参考 1.2.2,在 Proteus 环境下建立图 3.22 所示原理图,并其 保存为 uart_self.DSN 文件。
② 根据(2)和(3)画出流程图,并编写源程序,将其保存为 uart_self.c。
③ 运行 Keil uVision2 开发环境,按照 1.1.3 节介绍的方法建立工程 uart_self.uV2, CPU 为 AT89C51,包含启动文件 STARTUP.A51。
④ 按照 1.2.2 第(6)节介绍的方法将 C 语言源程序 uart_self.c 加入工程uart_self.uV2, 并设置工程 uart_self.uV2 属性,将其晶振频率设置为 12MHz,选择输出可执行文件, 仿真方式为选择硬仿真,并选择其中的“PROTEUS VSM MONITOR 51 DRIVER”仿真器。 ⑤ 构造(Build)工程 uart_self.uV2。如果输入有误进行修改,直至构造正确,生成可 执行程序 uart_self.hex 为止。
⑥ 为 AT89C51 设置可执行程序 uart_self.hex。
⑦ 运行程序,点击 KEY1 观察数码管的显示是否与 DSW1 的设置一致。
⑧ 改变 DSW1 的设置,再次点击 KEY1 观察数码管的显示是否与 DSW1 的设置一致。重复本条多次观察程序运行效果。
4、源程序
#include\
#define uchar unsigned char #define uint unsigned int
uchar code led_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit P11=P1^1; sbit P10=P1^0;
uchar tmp,tmp1,tmp2,tmp3;
void main() { SCON=0X00;//设定定时器为移位寄存器模式 // SM1=0;
// SM0=0;//方式0模式
}
while(1) {
if(P11==0) {
P10=0; REN=1; while(!RI); tmp=SBUF; REN=0; RI=0;
P10=1;
tmp1=tmp&0x0f;//低半字节 tmp>>=4;
tmp2=tmp&0x0f;//高半字节
} }
SBUF=led_table[tmp1];
while(!TI); //等待发送是否完毕 TI=0; //置发送标志为零 SBUF=led_table[tmp2]; while(!TI);//等待发送是否完毕 TI=0;//置发送标志为零
while(!P11);
5、电路图
6、实验结果
当按键按下时,DSW1 的开关数据能够被单片机通过 74LS165串行读取,并通过 74LS164 串行输出至两个 7 段数码管 7SEG1 和 7SEG2 显示,显示的据和 DSW1 的开关数据一致。
实验七 LCD1602显示实验 自我完成实验
1、实验要求
要求点击按键 KEY1 可以在 LCD1602(LM016L)第一行上显示“Hello Everyone”,在第二行上显示“Welcome to SDU”,并闪烁 3 次。点击按键 KEY2 可以将 LCD1602 清屏。