第1页共5页实验六定时器、串行口以及人机交互综合编程一、实验目的1、巩固掌握单片机定时器、串行口、键盘以及LCD显示的工作原理以及编程方法;2、掌握单片机定时器、串行口以及人机交互的综合编程。二、实验内容1、复习定时器、串行口、键盘以及LCD显示的工作原理以及编程方法;2、综合利用单片机定时器、串行口、键盘以及LCD显示编写具有一定功能的程序。三、实验设备1、STC单片机开发板;2、PC机以及串口线。四、实验分析及关键代码#includeLCM1602.h#includeintrins.h#includeREG51.h#defineucharunsignedcharsbitKEY1=P2^6;//按下,值为0sbitLEDB=P2^4;sbitLEDG=P2^5;第2页共5页unsignedcharrow=1,col=1;unsignedcharbuf;bitflag=0;voidinit_serial(){TMOD=0x20;//设置定时器1的方式TH1=0xf3;//设置定时器1的初值TL1=0xf3;SCON=0x50;//设置串行口方式1,并允许接收PCON=0x00;//波特率加倍位为0,串口通信的波特率为2400bpsTR1=1;//启动定时器1ES=0;EA=1;}unsignedcharread_key(){unsignedcharans=0;if(!KEY1)//若有按键被按下{delay_nms(10);//消抖if(!KEY1){第3页共5页while(!KEY1);//等待按键松开return(1);//返回键值}}return(0);//没有按键被按下}voidDisplayLCD(void){Write_Position(row,col);Write_Data(buf);col++;if(col16){row++;col=1;if(row2)row=1;}}voidmain()第4页共5页{ucharKeyCode=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.64msWrite_Command(0x0e);//显示功能开,有光标,光标不闪烁delay_nus(100);//至少延迟40usRI=0;flag=0;//清除串口请求标志位和串口接收到数据的标志ES=!ES;//打开串口中断允许第5页共5页}if(flag==1){DisplayLCD();ES=1;//将buf的内容显示到LCD后,打开串口中断flag=0;}}}voidserial()interrupt4using1{if(RI){RI=0;buf=SBUF;ES=0;//为了避免接收到的数据还没显示到LCD,又有串口中断发生,在这里关闭串口中断允许flag=1;}}