单片机 单片机与液晶实验 实验六
实验六 单片机与液晶实验
-
实验目的
1、掌握液晶LCD1602和单片机通信的原理。
2、掌握液晶LCD1602和单片机通信程序的设计方法及其过程。
3、掌握液晶和LCD1602和单片机通信的电路应用。
-
实验任务
设计一个两位秒表,显示于LCD1602,计时结束后,LED灯亮。
-
实验原理
本实验需要用到液晶屏的工作原理和定时器的工作原理,定时器的工作原理在实验4中已经有详细的介绍,在这里将不再介绍。
液晶屏LCD1602一共有16个引脚,各个引脚的功能为:
第1脚:VSS,电源地。
第2脚:VDD,+5V电源。
第3脚:VEE,液晶显示对比度调整输入端
第4脚:RS,数据/命令选择端
第5脚:R/W,读/写选择端 ,
第6脚:E,使能端,读操作上升沿有效, 写操作下降沿有效
第7~14脚:D0~D7,为8位双向数据线
第15脚:BLA,背光源正极。
第16脚:BLK,背光源负极。
LCD1602 在读写数据时需要通过一定的时序来完成。
1602时序解析
LCD1602初始化过程:
- 清屏。清除屏幕,将显示缓冲区DDRAM的内容全部写入空格(ASCII20H)。
(2) 功能设置。设置数据位数,设置显示行数 。设置字形大小 .
(3) 开/关显示设置。控制光标显示、字符是否闪烁等。
(4)输入方式设置。设定光标的移动方向以及后面的内容是否移动。
LCD1602和单片机电路连接图如图6-1所示:
图 6-1 液晶屏和LCD1602电路连接图
-
程序流程图
图6-2定义声明延时函数
如图6-2所示,该程序主要内容,定义液晶显示,特殊功能位RS、RW、LED声明,初始化倒计时秒数,延时函数。
图6-3忙、写命令、写数据、初始化函数
图6-4定时器中断、显示、时钟控制函数
如图6-4所示,设置定时器模式为模式1,设置定时器的初值。使用写命令、写数据函数,写入需要显示的数据。时钟控制倒计时的时间,当倒计时结束则需要执行LED灯亮起的命令。
图6-5主函数、定时器0中断函数
如图6-5所示,主函数中调用其他函数进行显示,定时器0中断处理函数重新设置定时器0的初值,使得定时器能够继续计数,并在计时结束时控制LED灯亮起。
-
实验结果及分析总结
图6-6仿真成功电路图
将程序下载至仿真电路图中,仿真成功实现倒计时计数(内容是从10-0)如图6-6所示,当倒计时至0之后LED灯会亮起(如图6-7所示)。
图6-7倒计时至0是LED灯亮起
本次实验在完成设计一个两位秒表计时显示的过程中掌握了液晶LCD1602和单片机通信的原理和电路应用,通信程序的设计方法及其过程。
实验中,对于定时器的使用还是存在调用的不准确的情况,在实验过后又复习了一遍定时器的原理,在实验的最后,遗留下来的问题是在仿真图中没有更改LED灯所连接电阻的阻值。导致一直无法仿真成功。
-
程序附录
#include <reg51.h> #define LCD_DATA P2 unsigned char num[10] = {'0','1','2','3','4','5','6','7','8','9'}; //定义液晶端口 sbit RS = P3^5; sbit RW = P3^6; sbit E = P3^7; sbit LED = P1^7; unsigned char second = 9; // 初始倒计时秒数 void delay(unsigned int a) //延时函数 { while(a--); } void lcd_busy() //检查LCD忙函数 { LCD_DATA = 0xff; RS = 0; RW = 1; E = 0; E = 1; while(LCD_DATA & 0X80) { E = 0; E = 1; } //忙等待 } void write_com(unsigned char command) //写命令函数 { lcd_busy(); E = 0; RS = 0; RW = 0; E = 1; LCD_DATA = command; E = 0; } void write_data(unsigned char lcd_data) //写数据函数 { lcd_busy(); E = 0; RS = 1; RW = 0; E = 1; LCD_DATA = lcd_data; E = 0; } void init_lcd() //初始化LCD函数 { write_com(0x01); //清屏 write_com(0x38); //5*7点阵 write_com(0x0c); //显示器开,光标关闭,字符不闪烁 write_com(0x06); //字符不开,光标自动向右移1格 } void init_interrupt() { TMOD = 0x01; TH0 = 0x3c; TL0 = 0xb0; ET0 = 1; TR0 = 1; EA = 1; } void display() { write_com(0x80); //第一行第1个地址 write_data('C'); write_data('l'); write_data('o'); write_data('c'); write_data('k'); write_data(':'); write_com(0xc4); write_data(num[second]); delay(50000); } void clock() { if(second > 0) { second--; } } void main() { init_interrupt(); init_lcd(); while(1) { display(); clock(); } } void Timer0() interrupt 1 { TH0 = 0x3c; TL0 = 0xb0; if(second == 0) { LED = 0; // 计时结束后,LED灯亮 } }