定时器串行口以及人机交互综合编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六定时器、串行口以及人机交互综合编程
一、实验目的
1、巩固掌握单片机定时器、串行口、键盘以及LCD显示的工作原理以及编程方法;
2、掌握单片机定时器、串行口以及人机交互的综合编程。

二、实验内容
1、复习定时器、串行口、键盘以及LCD显示的工作原理以及编程方法;
2、综合利用单片机定时器、串行口、键盘以及LCD显示编写具有一定功能的程序。

三、实验设备
1、STC单片机开发板;
2、PC机以及串口线。

四、实验分析及关键代码
#include "LCM1602.h"
#include <intrins.h>
#include <REG51.h>
#define uchar unsigned char
sbit KEY1=P2^6; //按下,值为0
sbit LEDB=P2^4;
sbit LEDG=P2^5;
unsigned char row=1,col=1;
unsigned char buf;
bit flag=0;
void init_serial()
{
TMOD=0x20; //设置定时器1的方式
TH1=0xf3; //设置定时器1的初值
TL1=0xf3;
SCON=0x50; //设置串行口方式1,并允许接收
PCON=0x00; //波特率加倍位为0,串口通信的波特率为2400bps
TR1=1; //启动定时器1
ES=0;
EA=1;
}
unsigned char read_key()
{
unsigned char ans=0;
if(!KEY1) //若有按键被按下
{
delay_nms(10);//消抖
if(!KEY1)
{
while(!KEY1); //等待按键松开
return(1); //返回键值
}
}
return(0); //没有按键被按下
}
void DisplayLCD(void)
{
Write_Position(row,col);
Write_Data(buf);
col++;
if (col>16)
{
row++;col=1;
if (row>2) row=1;
}
}
void main()
{
uchar KeyCode=0;
Initializa_LCD();
init_serial();
LEDB=1;LEDG=0;//指示关闭串口
//while(1)
while(1)
{
KeyCode=read_key();
if(KeyCode==1)
{
LEDB=!LEDB;LEDG=!LEDG;
Write_Command(0x01); //清除液晶显示器
row=1,col=1;
delay_nms(10); //至少延迟1.64ms
Write_Command(0x0e); //显示功能开,有光标,光标不闪烁
delay_nus(100); //至少延迟40us
RI=0;flag=0; //清除串口请求标志位和串口接收到数据的标志
ES=!ES; //打开串口中断允许
}
if (flag==1)
{DisplayLCD();
ES=1; //将buf的内容显示到LCD后,打开串口中断
flag=0;
}
}
}
void serial() interrupt 4 using 1
{
if(RI)
{
RI=0;
buf=SBUF;
ES=0; //为了避免接收到的数据还没显示到LCD,又有串口中断发生,在这里关闭串口中断允许
flag=1;
}
}。

相关文档
最新文档