基于单片机的1602液晶显示电路设计
51单片机驱动LCD1602程序设计(C语言)
字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的,因此 HD44780 写 的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型 LCD 通常有 14 条引脚线或 16 条引脚线的 LCD,多出来的 2 条线是背光电源线 VCC(15 脚)和地线 GND(16 脚),其控制原理 与 14 脚的 LCD 完全一样,定义如下表所示:
for(i=0;i<count;i++) {
if (0 == y) x |= 0x80; //当要显示第一行时地址码+0x80; else x |= 0xC0; //在第二行显示是地址码+0xC0; Write_com(x); //发送地址码 Write_dat(*p); //发送要显示的字符编码 x++; p++; }
01110
○■■■○
10001
■○○○■
10001
■○○○■
10001
■○○○■
11111
■■■■■
10001
■○○○■
10001
■○○○■
上图左边的数据就是字模数据,右边就是将左边数据用“○”代表 0,用“■”代表 1。看出是个“A”
字了吗?在文本文件中“A”字的代码是 41H,PC 收到 41H 的代码后就去字模文件中将代表 A 字的
字符型 LCD 的引脚定义
HD44780 内置了 DDRAM、CGROM 和 CGRAM。DDRAM 就是显示数据 RAM,用来寄存 待显示的字符代码。共 80 个字节,其地址和屏幕的对应关系如下表:
也就是说想要在 LCD1602 屏幕的第一行第一列显示一个"A"字,就要向 DDRAM 的 00H 地址写 入“A”字的代码就行了。但具体的写入是要按 LCD 模块的指令格式来进行的。在 1602 中我们用前 16 个就行了。第二行也一样用前 16 个地址。对应如下:
51单片机实现电子时钟功能-1602液晶显示
第一章设计要求及系统组成一、基本操作时序:读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:无读数据:输入:RS=H,RW=H,E= 高脉冲输出:D0~D7数据写数据:输入:RS=H,RW=L。
D0~D7=数据,E=高脉冲输出:无二、、、状态字说明:STA7 D7\ STA6 D6\ STA5 D5 \ STA4 D4 \STA3 D3 \ STA2 D2\\ STA1 D1STA0-6:当前数据地址指针的数值STA7:读写操作使能 1表示禁止,0表示允许对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0;但是我们可以进行延时进行实现。
RAM地址映射: LCD 16字*2行00 01 02 03 04 05 06 07 08 08 09 0A 0B 0C 0D 0E 0F (27)40 41 42 4F 50 (67)指令说明:1.初始化设置 1.显示模式设置指令码:00111000(0x38)功能:设置16*2显示,5*7点阵,8位数据接口必须开显示 2.显示开、关及光标设置指令码:00001DCB,功能:D=1 开显示;D=0 关显示;C=1显示光标;B=1 光标闪烁;B=0 光标不显示 000001NS:功能:N=1当读或写一个字符后地址指针加1,且光标加1;N=0相应的减1;S=1当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果。
S=0 当写一个字符,正屏显示不移动。
数据控制:控制器内部设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM4.2.1 数据指针设置:指令码:80H+地址码(0-27H,第二行开始:40H-67H) 4..2.2 读数据,写数据其它设置:01H:显示清屏:1.数据指令清零 2 所有显示清零 02H:显示回车:1.数据清零如何进行连接:实际操作中,液晶接到,第一管脚是D,第二管脚是VCC,15和16是背光,D0-D7是数据口,接到单片机的P0口,P0口接了两个锁存器,液晶,D/A,具有高阻状态的都可以随便接,没有影响,,第六管脚是LCDEN相当于 E,使能信号,它接P3^4,R/W接地,表示低电平,因为我们只进行写操作,RS接2实验板上的P3^5;只需这两端口便足以控制液晶,2和3是偏压信号,一端接地,接口信号说明:编号:1 VSS(符号表示)电源地(引脚说明)2VDD 电源正极3VL液晶显示偏压信号4RS数据/命令选择端(H/L)5R/W 读写选择端(H/L)6E使能信号7D0 Data 1/0 8D1 Data 1/0 9 D2 Data 1/0 10 D3 Data 1/0 11D4 Data 1/0 12D5 Data 1/0 13D6 Data 1/0 14D7 Data 1/0 15BLK背光源正极16 BLK背光源负极实际操作:::先写光标程序;写两个子程序,一个写数据,一个写指令:先进性两个宏定义,再位申明LCDEN与RS;为了电量充足。
单片机+1602液晶计跑表程序设计
record[order][2]=swsec;
record[order][3]=swmsec;
order1=order;
writerom(0x40|0x80);
recordscan1();
case 2:
if(swsurface==0) {swsec=0;swhour=0;swmin=0;swmsec=0;}
else
{
if(order1>0)
{
order1--;
recordscan();
}
}
}
}
}
}
void recordscan1()
{
write(tab[record[order1][0]/10]);
write(tab[record[order1][0]%10]);
write(':');
write(tab[record[order1][1]/10]);
}
break;
case 3:
if(swsurface==1)
{
swsurface=0;
if(order!=0)
order1=order-1;
writerom(0x40|0x80);
recordscan1();
case 1:
if(swsurface==0)TR0=!TR0;
else
{
if((order1+2)<or3;;
recordscan();
}
}
break;
if(swsec==60)
基于msp430G2533的LCD1602液晶字符串循环显示课程设计谋画
学号:课程设计题目LCD1602液晶字符串循环显示学院专业班级姓名指导教师2013年1月15 日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目要求:利用LaunchPad上的板上资源,外接1602液晶,编写程序使字符串在液晶上循环移动。
时刻安排:2021年元月1日~2021年元月17日下午17:30 指导教师签名:年月日系主任(或责任教师)签名:年月日目录引言 (1)1 课程设计要求 (2)2 硬件电路 (3)2.1 MSP430G2553单片机 (3)2.1.1 MSP430G2553单片机特点 (3)2.1.2 MSP430G2553单片机结构 (3)2.1.3 MSP430G2553的时钟系统 (4)2.1.4 I/O寄放器 (5)2.2 LCD1602液晶屏 (5)3 方案设计 (7)3.1 设计方案 (7)3.2 方案选择 (7)4 程序设计 (8)4.1 程序结构 (8)4.2 主程序源程序 (8)4.3 子程序源程序 (8)4.4 子程序头文件 (12)5 调试 (13)5.1 CCSv5编译软件 (13)5.2 调试进程 (13)6 终止语 (15)附录1:代码 (16)附录2:实物图 (22)参考文献 (23)本科生课程设计成绩评定表 (24)引言本次课程设计旨在设计一个基于MSP430 系列微处置器的LCD1602液晶字符串循环移动。
单片机是一种集成电路芯片,是采纳超大规模集成电路技术把具有数据处置能力的中央处置器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、按时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上组成的一个小而完善的微型运算机系统,在工业操纵领域普遍应用。
现今时期是一个新技术层出不穷的时期,在电子领域尤其是自动化智能操纵领域,传统的分立元件或数字逻辑电路组成的操纵系统,正在以前所未见的速度被单片机智能操纵系统所代替。
单片机代码1602液晶屏显示
lcd-busy为0时,闲,可写指令与数据。
**********************************************************/
void lcd_busy()
{
bit busy;
busy = 1;
while (busy)
{
LCD_RS = 0;
{
delayms(15);
lcd_wcmd(0x38, 0); //16*2显示,5*7点阵,8位数据
delayms(5);
lcd_wcmd(0x38, 0); //不进行忙检测,强制执行三次。
delayms(5);
lcd_wcmd(0x38, 0);
delayms(5);
lcd_wcmd(0x38, 1); //进行忙检测
delayms(5);
lcd_wcmd(0x0c, 1); //显示开,关光标
delayms(5);
lcd_wcmd(0x06, 1); //移动光标
delayms(5);
lcd_wcmd(0x01, 1); //清除LCD的显示内容
delayms(5);
}
/**********************************************************
单片机代码:
1602液晶屏显示
#include <reg52.h>
#include <intrins.h>
//#define uchar unsigned char
//#define uint unsigned int
#define DATA_PORT P0
51单片机控制LCD1602液晶屏
51单片机控制LCD1602液晶屏本讲任务:了解液晶1602的相关知识,通过一个例程了解液晶1602的使用。
LCD1602简介:1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。
它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。
例程:/****************LCD驱动基本代码 ******************单片机型号:STC89C52RC*开发环境:KEIL*名称:1602驱动基本代码*************************************************/#include<reg52.h>#include<intrins.h>#define LCD_Data P0#define Busy 0x80sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E=P2^5;unsigned char code welcome[]={"YOU ARE WELCOME"};unsigned char code mcu[]={"SL-51A"};void Delay5Ms(void);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); void Info_display(void);void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}void WriteCommandLCD(unsigned char WCLCD,BuysC) {if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}unsigned char ReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;return(LCD_Data);}unsigned char ReadStatusLCD(void) {LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=1;while (LCD_Data & Busy);return(LCD_Data);}void LCDInit(void){LCD_Data=0;Delay5Ms();Delay5Ms();Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0C,1);}void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData){Y&=0x1;X&=0xF;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X,0);WriteDataLCD(DData);}void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}}void main(void){LCDInit();DisplayListChar(5,0,mcu);DisplayListChar(0,1,welcome);while(1){;}}。
单片机驱动1602液晶电路图及c51程序
单片机驱动1602液晶电路图及c51程序原理图:1602液晶电路图51单片机驱动程序:#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char//这三个引脚参考资料sbit E=P2^7; //1602使能引脚sbit RW=P2^6; //1602读写引脚sbit RS=P2^5; //1602数据/命令选择引脚void init(){TMOD=0X00;TH0=0X03;TL0=0X32;IE=0X82;TR0=1;}/********************************************************************* 名称: Delay_1ms()* 功能: 延时子程序,延时时间为1ms * x* 输入: x (延时一毫秒的个数)* 输出: 无***********************************************************************/ void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay(){_nop_();_nop_();_nop_();_nop_();_nop_();}bit Busy(void){bit busy_flag = 0;RS = 0;RW = 1;E = 1;delay();busy_flag = (bit)(P0 & 0x80);E = 0;return busy_flag;}void wcmd(uchar del){while(Busy());RS = 0;RW = 0;E = 0;delay();P0 = del;delay();E = 1;delay();E = 0;}void wdata(uchar del){while(Busy());RS = 1;RW = 0;E = 0;delay();P0 = del;delay();E = 1;delay();E = 0;}void L1602_init(void){wcmd(0x38);Delay_1ms(5);wcmd(0x38);Delay_1ms(5);wcmd(0x38);Delay_1ms(5);wcmd(0x38);wcmd(0x08);wcmd(0x0c);wcmd(0x06);wcmd(0x01);}void L1602_char(uchar hang,uchar lie,char sign) {uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;wcmd(a);wdata(sign);}void L1602_string(uchar hang,uchar lie,uchar *p) {uchar a,b=0;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;while(1){wcmd(a++);if((*p == '\0')||(b==16)) break;b++;wdata(*p);p++;}}uchar Keyscan(void){uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j=0; j<4; j++){P1 = Buffer[j];temp = 0x10;for(i=0; i<4; i++){if(!(P1 & temp)){return (i+j*4);}temp <<= 1;}}}void Main(void){uchar Key_Value; //读出的键值L1602_init();init();L1602_string(1,16," 4*4 KeyBoard ");L1602_string(2,16,"You Press The ");for(Key_Value=15;Key_Value>0;Key_Value--){wcmd(0x18);Delay_1ms(250);Delay_1ms(250);}while(1){P1 = 0xf0;if(P1 != 0xf0){Delay_1ms(20); //按键消抖if(P1 != 0xf0){Delay_1ms(20); //按键消抖if(P1 != 0xf0){Key_Value = Keyscan();}}}L1602_char(2,30,Key_Value / 10 + 48);L1602_char(2,31,Key_Value % 10 + 48);}}void timer0() interrupt 1{}。
功能完整的1602LCD时钟实验
功能完整的1602LCD时钟实验摘要本设计基于单⽚机技术原理,以单⽚机芯⽚STC89C52作为核⼼控制器,通过硬件电路的制作以及软件程序的编制,设计制作出⼀个多功能数字时钟系统。
单⽚机扩展的LCD显⽰器⽤来显⽰年、⽉、⽇、时、分、秒计数单元中的值。
整个设计包括两⼤部分: 硬件部分和软件部分,以单⽚机为核⼼, 配以⼀定的外围电路和软件。
硬件是整个系统的基础, 软件部分则要合理、充分地⽀持和使⽤系统的硬件, 从⽽完成系统所要完成的任务。
本设计采⽤LCD液晶显⽰,电路简单使⽤⼴泛。
该时钟系统主要由时钟模块、闹钟模块、液晶显⽰模块、键盘控制模块以及信号提⽰模块组成。
能够准确显⽰时间(显⽰格式为年:⽉:⽇:时时:分分:秒秒,24⼩时制),可随时进⾏时间调整,具有闹钟时间设置、闹钟开/关、⽌闹功能。
设计以硬件软件化为指导思想,充分发挥单⽚机功能,⼤部分功能通过软件编程来实现,电路简单明了,系统稳定性⾼。
单⽚机在这种情况下诞⽣了基于单⽚机电⼦时钟。
关键词:单⽚机 LCD1602 数字钟This design based on the single chip microcomputer principle, taking single-chip chip STC89C52 as core controller, through the hardware circuit and software production procedure formulation, designed and produced a multi-function digital clock system. SCM extended LCD display used to display date and time, minutes and seconds counting unit of values. The whole design includes two parts, hardware and software of, based on singlechip, match with certain peripheral circuit and software. Hardware is based in the whole system, the software part then be reasonable and fully support and use the system hardware, thus completing system to complete the task. This design USES the LCD, simple circuit is widely used. This clock system mainly by the clock module, alarm module, LCD module, keyboard control module and signal hint module. To accurately display the time (display format for years: month: day: always: component: seconds seconds, 24-hour system), available for time to adjust, with alarm time setting, alarm clock on/off, stop joking function. Design with hardware and software into guiding ideology, give full play to the SCM functions, most functions through software programming realize, circuit straightforward, stability of the system is high. SCM in this case was born based on single-chip electronic clock. Keywords: SCM LCD1602 digital clock前⾔数字钟是采⽤数字电路实现对时,分,秒数字显⽰的计时装置,⼴泛⽤于个⼈家庭,车站, 码头办公室等公共场所,成为⼈们⽇常⽣活中不可少的必需品,由于数字集成电路的发展和⽯英晶体振荡器的⼴泛应⽤,使得数字钟的精度,远远超过⽼式钟表, 钟表的数字化给⼈们⽣产⽣活带来了极⼤的⽅便,⽽且⼤⼤地扩展了钟表原先的报时功能。
基于51单片机的打地鼠游戏机1602和led显示模拟(源码齐全)
目录一、摘要 (3)二、流程图 (4)三、电路原理 (5)四、操作说明 (7)五、演示图片 (8)六、程序代码 (11)一、摘要本作品采用STC89C52单片机作为主控芯片,选取LCD1602液晶作为显示屏,选用24C02芯片作为外部EEPROM存储得分等数据。
游戏程序应用C语言编译,主要使用函数为显示主界面函数,选择模式函数,随机函数,键盘扫描函数和众多界面函数。
系统配有开机音乐和led短暂特效;以及关闭游戏音乐效果。
目前配有三个难度等级,可以随时添加。
游戏中可以实时显示得分、时间等数据。
能够通过led显示和LCD1602同时显示地鼠的出现。
题目要求中所有内容均已完成,且加入了很多额外显示环节。
二、流程图三、电路原理1、主控芯片2、地鼠led和3*3键盘3、蜂鸣器和buzzer4、1602环节5、24C02芯片四、操作说明1.插上电源后,打开作品左下角的自锁开关启动。
2.系统启动后,会次显示“welcome”字样,以及本队伍的名称,并伴随着短暂的旋律,led闪烁效果。
紧接着便进入游戏选择界面,分别是:1.start 2.s core 3.exit分别对应着开始游戏,进入历史分数菜单,以及结束的功能。
通过button1 和button2键可以进行功能选择的切换和选取,button1用于切换,button2用于确认。
3.选择start选项之后会有5秒钟的准备时间,之后即可进入游戏,游戏分为3个关卡,难度依次上升,具体表现为地鼠产生的时间间隔依次减少,第一次为3秒间隔,往后依次递减。
以9个灯泡作为地鼠,每次随机亮一个灯泡,游戏者需要在另一个3*3的矩阵上在灯泡亮的时间内按下相应的按钮即代表击打相应位置,从而实现打地鼠的模拟功能。
4.游戏界面的上方有左右两行,分别对应显示剩余时间(每次游戏的时间为30秒),以及所获得的分数。
下方也有左右两行,分别对应当前所示洞的序数,5.若击中地鼠:正常情况下分数加1,播放提示音1;6.每关有(30/地鼠实现时间) 个地鼠(或地雷),击打完成后若分数大于等于level*10则进入下一关。
用51单片机和1602液晶做的数字钟
用51单片机和1602液晶做的数字钟数字钟是人们日常生活中常见的时间显示设备,它能够精确显示当前的时间,并且兼具简约和实用性。
本文将介绍使用51单片机和1602液晶屏幕制作自己的数字钟的方法。
所需材料在开始制作之前,我们需要准备以下材料: - 51单片机开发板 - 1602液晶屏幕 - 数字时钟芯片RTC(Real-Time Clock) - 面包板和导线 - 电阻和电容 - 编程器和烧录器硬件连接首先,我们需要将51单片机、1602液晶屏幕和RTC芯片连接起来。
根据硬件接口的定义和引脚功能的规定,我们可以进行以下连接: - 将51单片机的VCC 引脚连接到1602液晶屏幕的VCC引脚,用于提供电源。
- 将51单片机的GND引脚连接到1602液晶屏幕的GND引脚,用于地线连接。
- 将51单片机的P0口连接到1602液晶屏幕的数据线D0-D7,用于数据传输。
- 将51单片机的P2口连接到1602液晶屏幕的RS引脚,用于选择数据和命令传输。
- 将51单片机的P3口连接到1602液晶屏幕的EN引脚,用于启用LCD。
此外,还需要将RTC芯片连接到51单片机上,以实现时间的准确显示。
具体的连接方式可以参考RTC芯片的规格说明书。
软件编程完成硬件连接后,我们需要进行软件编程,以便控制51单片机、1602液晶屏幕和RTC芯片的功能。
初始化首先,我们需要对51单片机和1602液晶屏幕进行初始化设置。
这包括设置引脚的功能模式、初始化1602液晶屏幕的显示模式和清空显示区域。
读取时间接下来,我们需要通过RTC芯片来读取当前的时间。
这通常包括读取RTC芯片存储的年、月、日、时、分和秒的数据。
显示时间读取时间后,我们可以将其显示在1602液晶屏幕上。
这可以通过更新特定的LCD显示区域来实现。
我们可以在指定的位置、特定的行和列上显示时间。
更新时间为了实现实时的时间显示,我们需要定期更新显示的时间。
可以使用定时器中断来定期更新时间,并根据需要刷新液晶屏幕上的显示。
51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】
{
switch(be)
{//uint i;
/*用于整点响铃*/case 0:{
buzz=~buzz;
//delay1();
}break;
/*用于闹铃报时*/case 1:{
buzz=~buzz;
//delay(10);
}break;
}
}
void write_com(uchar com)//命令写入函数
{
rs=0;
delay(3);
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void write_date(uchar date)//数据写入函数
{
rs=1;
delay(3);
P0=date;
delay(3);
write_date(0x30+ge);
}
void write_ymd(uchar add,uchar date)//年月日写入子程序
{
uchar sh,ge;
sh=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+sh);
write_date(0x30+ge);
sbit buzz=P1^5; //蜂鸣器控制端
uchar code week0[]="Sun";
uchar code week1[]="Mon";
uchar code week2[]="Tue";
单片机的LCM1602液晶显示温度与万年历显控制
毕业设计报告(论文)报告(论文)题目:基于单片机的LCM1602液晶控制——温度与万年历显示设计作者所在系部:电子工程系作者所在专业:作者所在班级:作者姓名:作者学号:指导教师姓名:完成时间: 2011年 6 月 9 日院教务处制电子工程系毕业设计(论文)任务书指导教师:教研室主任:系主任:摘要论文的研究工作是以液晶屏显示技术为背景展开的,并且详细介绍了通过MCS-51单片机控制LCM1602液晶的显示情况,以软件形式对系统进行控制,使得系统控制更具灵活与方便。
本文在深入分析LCD显示技术的基础上,重点解析了LCM显示的单片机控制技术,以及LCD显示在各种电子显示中的优势,同时阐述了其在日常显示系统中的应用;并且以Proteus与Keil uVision4软件为基础,编写了MCS-51单片机对LCM1602显示控制的软件,绘制其原理图,并使用Proteus软件与Keil uVision4软件建立联合仿真。
论文主要论述了原理图各个模块的作用,控制软件的各个模块的编程。
关键词液晶显示技术LCM1602 MCS-51单片机Proteus Keil uVision4目录第1章绪论 (1)1.1课题背景及主要技术国内外研究概况 (1)1.2LCM1602显示控制系统简介 (2)1.3课题的建立以及本文完成的主要工作 (3)第2章开发工具软件简介 (4)2.1K EIL U V ISION4软件简介 (4)2.2P ROTEUS软件简介 (4)2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (5)2.4小结 (5)第3章 LCD显示控制技术 (6)3.1LCD显示技术的发展 (6)3.2LCM1602显示控制技术及其体系结构 (7)3.2.1 LCM1602模块简介 (8)3.2.2 LCM1602模块内部结构 (9)3.2.3 LCM1602控制指令 (10)3.3小结 (12)第4章系统硬件概况 (13)4.1系统概况 (13)4.2功能模块 (13)4.2.1 MCS-51单片机最小系统模块 (14)4.2.2 温度采集模块 (14)4.2.3 蜂鸣器报警模块 (15)4.2.4 万年历调节设置模块 (16)4.2.5 LCM1602显示模块 (16)4.2.6 电源模块 (17)3.3小结 (17)第5章软件控制系统概况 (18)5.1程序流程概况 (18)5.2万年历显示控制模块 (18)5.2.1 流程图 (18)5.2.2 源程序代码 (19)5.3温度显示控制模块 (19)5.3.1 程序流程 (19)5.3.2 源程序代码 (19)5.3.3 主程序 (19)5.4小结 (20)第6章课题特点 (21)6.1LCM模块的应用 (21)6.2程序结构化与模块化设计 (21)6.3抗干扰技术 (21)第7章结论 (23)7.1调试联合仿真 (23)7.2仿真结果 (23)7.3小结 (23)致谢 (24)参考文献 (25)附录 (26)基于单片机的LCM1602液晶控制——温度与万年历显示设计第1章绪论1.1 课题背景及主要技术国内外研究概况自20世纪80年代起,显示设备经历着传统工艺的改良、新工艺的发展、成熟的优胜劣汰。
基于51单片机1602液晶显示简易计算器设计
#include<reg52.h>#include<math.h>#define uint unsigned int#define uchar unsigned char#define PI 3.141592sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;sbit led=P2^4;sbit speek=P3^7;uchar table0[]={"Welcome to use"};uchar table1[]={"made by Ms. Li"};uchar table2[]={"error"};uchar count;void main(void){uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//错误标志、第一次清屏标志、小数点标志以及小数点个数负号标志、负号个数uchar Sin,Cos,Tan,ln;uchar Key_num,last_key_num; //键号uchar flag=0,equal_flag; //运算符、等于符double num1=0,num2=0,num=0,result=0,save_result; //第一个数、第二个数、计算结果uchar first_num=0,Ans=0,second_num=0;InitLcd();EA=1;ET0=1;TMOD=0X01;TH0=(65536-500)/256;TL0=(65536-500)%256;write_com(0x80+0x40+15);write_Dat('0');write_com(0x80);while(1){while(key_scan()==0xff);TR0=1;if(first==0){first=1;write_com(0x01);}Key_num=key_scan();switch(key_scan()){case 1:if(last_key_num!=Key_num){write_Dat('l');write_Dat('n');ln=1;}break;case 2:if(last_key_num!=Key_num){write_Dat('s');write_Dat('i');write_Dat('n');Sin=1;}break;case 3:if(last_key_num!=Key_num){write_Dat('c');write_Dat('o');write_Dat('s');Cos=1;}break;case 4:if(last_key_num!=Key_num){write_Dat('t');write_Dat('a');write_Dat('n');Tan=1;}break;case 5:if(last_key_num!=Key_num){write_Dat('^');flag=5;}break;case 6:write_Dat('7');num=7;break;case 7:write_Dat('8');num=8;break;case 8:write_Dat('9');num=9;break;case 9:if(last_key_num!=Key_num){write_Dat('+');flag=1;}break;case 10:if(last_key_num!=Key_num){write_Dat('T');flag=6;}break;case 11:write_Dat('4');num=4;break;case 12:write_Dat('5');num=5;break;case 13:write_Dat('6');num=6;break;case 14:if(last_key_num!=Key_num){write_Dat('-');flag=2;}break;case 15:if(last_key_num!=Key_num){if(equal_flag==1){write_com(0x01);write_com(0x80);write_Dat('A');write_Dat('n');write_Dat('s');write_Dat('=');save_result=result;}else{if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=22&&Key_num!=23 &&Key_num!=25){write_Dat('A');write_Dat('n');write_Dat('s');if(flag==0){num1=save_result;first_num=1;}else{num2=save_result;second_num=1;}}}}break;case 16:write_Dat('1');num=1;break;case 17:write_Dat('2');num=2;break;case 18:write_Dat('3');num=3;break;case 19:if(last_key_num!=Key_num){write_Dat('*');flag=3;}break;case 21:write_Dat('0');num=0;break;case 22:if(last_key_num!=Key_num){if(flag==0){minus1++;if(minus1==1){write_Dat('-');}}else{minus2++;if(minus2==1){write_Dat('-');}}} break;case 23:if(last_key_num!=Key_num){if(flag==0){dot1++;if(dot1==1){write_Dat('.');}}else{dot2++;if(dot2==1){write_Dat('.');}}} break;case 24:if(last_key_num!=Key_num){write_Dat('/');flag=4;}break;case 25:if(last_key_num!=Key_num){write_Dat('=');equal_flag=1;}break;}if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=15&&Key_num!=22 &&Key_num!=23&&Key_num!=25) //第一个数{if(flag==0){num1=num1*10+num;num=0;if(dot1!=0){dot1_num++;}first_num=1;}if(flag!=0){num2=num2*10+num;num=0;if(dot2!=0){dot2_num++;}second_num=1;}}if(equal_flag==1&&first_num==1){if(dot1!=0){num1=num1/pow(10,dot1_num);dot1=0;}if(dot2!=0){num2=num2/pow(10,dot2_num);dot2=0;}if(minus1!=0){num1=num1*(-1);}if(minus2!=0){num2=num2*(-1);}if(second_num!=0){switch(flag){case 1:result=num1+num2;break;case 2:result=num1-num2;break;case 3:result=num1*num2;break;case 4:if(num2!=0){result=num1/num2;}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;} break;case 5: result=pow(num1,num2);break;case 6: result=pow(num1,1/num2);break;}}else if(second_num==0&&Sin==0&&Cos==0&&Tan==0&&ln==0) result=num1;else if(second_num==0&&(Sin==1||Cos==1||Tan==1||ln==1)) {if(Sin==1)result=sin(num1/180*PI)+0.005;if(Cos==1)result=cos(num1/180*PI)+0.005;if(Tan==1)result=tan(num1/180*PI)+0.005;if(ln==1){if(num1>0)result=log(num1)+0.005;else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;}}}if(error!=1)display(result);}if(Key_num==20) //清零{num1=num2=result=0;flag=equal_flag=0;error=0;first=0;dot1_num=dot2_num=0;minus1=0;minus2=0;first_num=0,second_num=0;Sin=Cos=Tan=ln=0;write_com(0x01);write_com(0x80+0x40+15);write_Dat('0');}last_key_num=Key_num;while(key_scan()!=0xff);}}void time0() interrupt 1{TH0=(65536-600)/256;TL0=(65536-600)%256;count++;speek=!speek;if(count>50){TR0=0;count=0;}}void delay(uint x){uchar y;while(x--)for(y=0;y<120;y++);}void write_com(unsigned char c){RS=0;RW=0;EN=1;delay(5);P0=c;EN=0;}void write_Dat(unsigned char c){RS=1;RW=0;EN=1;delay(5);P0=c;EN=0;}void InitLcd(){write_com(0x38); //display modewrite_com(0x06); //显示光标移动位置write_com(0x0c); //显示开及光标设置write_com(0x01); //显示清屏}uchar key_scan(){uchar key_num=0xff;uint temp;P3=0x03;P1=0xe0;temp=(P3<<8)|P1;if((temp&0x03e0)!=0x03e0){delay(10);if((temp&0x03e0)!=0x03e0){P3=0x03; //第一行P1=0xfe;temp=(P3<<8)|P1;switch(temp){case 0x03de:key_num=1; break;case 0x03be:key_num=2; break;case 0x037e:key_num=3; break;case 0x02fe:key_num=4; break;case 0x01fe:key_num=5; break;}P3=0x03; //第二行P1=0xfd;temp=(P3<<8)|P1;switch(temp){case 0x03dd:key_num=6; break;case 0x03bd:key_num=7; break;case 0x037d:key_num=8; break;case 0x02fd:key_num=9; break;case 0x01fd:key_num=10; break;}P3=0x03; //第三行P1=0xfb;temp=(P3<<8)|P1;switch(temp){case 0x03db:key_num=11; break;case 0x03bb:key_num=12; break;case 0x037b:key_num=13; break;case 0x02fb:key_num=14; break;case 0x01fb:key_num=15; break;}P3=0x03; //第四行P1=0xf7;temp=(P3<<8)|P1;switch(temp){case 0x03d7:key_num=16; break;case 0x03b7:key_num=17; break;case 0x0377:key_num=18; break;case 0x02f7:key_num=19; break;case 0x01f7:key_num=20; break;}P3=0x03; //第五行P1=0xef;temp=(P3<<8)|P1;switch(temp){case 0x03cf:key_num=21; break;case 0x03af:key_num=22; break;case 0x036f:key_num=23; break;case 0x02ef:key_num=24; break;case 0x01ef:key_num=25; break;}}}return key_num;}void display(double Data){uchar xs=0,fs=0,i;if(Data<0){fs=1;Data=Data*(-1);}if(Data>(long)Data){xs=1;}if(Data<10) //0~9{if(xs==1){Data=Data*100;write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+14);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data+'0');}}else if(Data<100) //10~99{if(xs==1){Data=Data*100;write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+13);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000) //100~999{if(xs==1){Data=Data*100;write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+12);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<10000) //1000~9999{if(xs==1){Data=Data*100;write_com(0x80+0x40+8);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<100000) //10000~99999{if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000000+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000000) //100000~999999{if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/+'0');write_Dat((long)Data/1000000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');}else if(xs==0){write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}}}。
【单片机基础教程】液晶1602的使用 作者:张彦欣
【基础教程】液晶1602的使用本文章来自(张彦欣单片机),更多内容,敬请登录。
液晶屏幕1602是电子上常用的液晶显示器。
这种显示器的优点是带有英文字符字库;价格低廉;接口方便。
这种液晶显示器如此广泛的使用,我们很有必要来学习使用。
你也看到了上面的图片,LCD1602的引脚常规情况下有15个插针引脚。
从左往右分别是GND(液晶)VCC(液晶)VO(对比度调整端)RS RW EN D0 D1 D2 D3 D4 D5 D6 D7 VCC(背光)GND(背光)。
引脚引脚功能GND 液晶GND。
这是给液晶工作供电的,不正常会不能正常的显示。
VCC 液晶VCC。
这是给液晶工作供电的,不正常会不能正常的显示。
VO 液晶对比度调整端。
需要输入一个电压信号控制液晶的灰度。
不连接或是连接不正常会不显示。
RS 寄存器选择位。
1--数据寄存器;0--指令寄存器。
RW 读写信号位。
1--读信号;0--写信号。
EN 液晶使能位。
1--使能液晶;0--禁止液晶操作。
D0 数据传输位0。
D1 数据传输位1。
D2 数据传输位2。
D3 数据传输位3。
D4 数据传输位4。
D5 数据传输位5。
D6 数据传输位6。
D7 数据传输位7。
VCC 背光VCC。
如果连接不正常会导致液晶背光不亮,但是不影响液晶显示。
可以不连接。
GND 背光GND。
如果连接不正常会导致液晶背光不亮,但是不影响液晶显示。
可以不连接。
液晶1602的使用非常的方便,数据线8条,控制线3条,其实总共需要11根IO口线(8线制使用使这样的,4线制可以节省IO口,这里先不讨论)。
液晶显示模块的VCC和GND(第一和第二个引脚)是需要接的,但是背光的VCC和GND可以不连接。
液晶1602的使用需要注意的一点就是VO这个端口。
这个VO端口接高电平时候,液晶的对比度最小;接低电平时,液晶的对比度最高(会出现“鬼影”)。
最好采用一个电位器,可以调节这个端口的电压。
正如上图这样,一个电位器,方便调节LCD的对比度。
1602液晶显示工作原理及其在单片机中的应用(基于Proteus仿真)
1602液晶显示原理及其在单片机中的应用基于Proteus仿真前言:本文详细介绍了1602液晶显示器的工作原理,并在后面举例说明了其在单片机中的应用,所举例子包含Proteus仿真电路图,源程序,程序注释详细清楚。
这有助于更好地理解与掌握1602液晶显示器。
1、1602 LCD基本参数:1602 LCD内置HD44780(目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的)专用液晶显示控制器,分为带背光和不带背光两种,带背光的比不带背光的厚,是否带背光在应用中并无差别。
显示容量为16×2个字符,即可以显示2行,每行16个字符。
芯片工作电压:4.5—5.5V;最佳工作电压为5.0V;工作电流:2.0mA(5.0V电压下);(补充说明:在电子工业中,背光是一种照明的形式,常被用于LCD显示上。
背光式和前光式不同之处在于背光是从侧边或是背后照射,而前光顾名思义则从前方照射。
他们被用来增加在低光源环境中的照明度和电脑显示器、液晶荧幕上的亮度,以和CRT显示类似的方式产生出光。
)2、1602 LCD引脚功能:1602芯片(在proteus中名字为LM016L) 采用标准的14脚(无背光)或16脚(带背光)接口,如右图所示,各引脚功能如下:VSS:电源地VDD:电源正极VEE:液晶显示偏压,为对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
(补充说明:整体回路中的某个点,测量它相对某个基准点的电压(是整体回路电压的1/n)就称之为该点的偏压,各段电路的偏压之和就是整体回路电压,相应位置的电流就是偏压电流。
)RS:数据/命令选择信号,高电平时选择数据寄存器、低电平时选择指令寄存器。
RW(read/write,读/写):读/写控制信号,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
基于MCS-51单片机的液晶1602显示设计
S
J J _ 一 十 卜
) c
wr i t e
_
a d d ( d ) ;
j }
v o i d LCD 1 6 0 2
_
垃 ; P 1 7
P o 6
71 4 .
I N Tl
1 I o . 2
1 6 0 2 , 实 现 显 示 字符 的效 果 。 }
wh i l e ( x 一 一 )
e =O :
vo i d L CD
—
d i r v e ( b i t x , u c h a r d ]
{
i f ( x = = 1 )
2 、 硬件组成 液晶1 6 0 2 显示系统实际是由5 1 单片机最 小系统 、 液 晶1 6 0 2 构成 , 如下 图
P 0 1 3 p !
l
{
. P , P l
. .. . . .
6
7 8 l
!
P1 5 Pt 6 R硒 T D 订
;8 0 5 1螂 P 0 2 = = i 鐾 } j …
P o 4 P 0 5 P0 7 P 2 O P 2 1
1 所示 。
r
{
wr i t e
_
d a t a ( d ) ;
}
p 1 0
P1 2
l
1
V C C j 盐 ) ” 睫晶l 鳓 L l
l 4 0
潜
4
e l s e
- . . . ‘ 一 P I 1
; 4
P o o { 噩p o } _ _
_
{
e = 0 : L CD1 6 0 2
3.4 单片机控制液晶显示模块1602 LCD的显示
80H+40H=C0H,其中80H为命令代码, 40H是要写入字符处的地址。
5.5.1 LCD 1602液晶显示模块简介
3.字符显Байду номын сангаас位置的确定
图5-17 LCD内部显示RAM的地址映射图
5.5.1 LCD 1602液晶显示模块简介
4.LCD1602的复位
例如,显示字符“A”,单片机只需将字符“A” 的ASCII码41H写入DDRAM,控制电路就会将对 应的字符库ROM(CGROM)中的字符“A”的点 阵数据找出来显示在LCD上。
模块内有80字节数据显示RAM (DDRAM), 除显示192个字符(5×7点阵)的字符库 ROM(CGROM)外,还有64字节的自定义字符 RAM(CGRAM),用户可自行定义8个5×7点阵字符。
5.5.1 LCD 1602液晶显示模块简介
2.LCD1602字符的显示及命令字
5.5.1 LCD 1602液晶显示模块简介
2.LCD1602字符的显示及命令字 表5-3中11个命令功能说明如下:
命令1:清屏,光标返回地址00H位置(显示屏的左上 方)。 命令2:光标返回到地址00H位置(显示屏的左上方)。 命令3:光标和显示模式设置。
而当写入10H~27H或50H~67H地址处时,字符不会 显示出来,该区域也称为隐藏区域。如果要显示写入到隐藏 区域的字符,需要通过字符移位命令(命令5)将它们移入 到可显示区域方可正常显示。
5.5.1 LCD 1602液晶显示模块简介
3.字符显示位置的确定
需说明的是,在向DDRAM写入字符时, 首先要设置DDRAM定位数据指针,此操作可 通过命令8完成。
基于Proteus的单片机1602液晶显示电路的设计
基于Proteus的单片机1602液晶显示电路的设计史洁【摘要】硬件电路由AT89C51单片机控制器、1602液晶显示组成.通过C语言对单片机进行控制操作.完成了实物电路并在Proteus软件的基础上对结果进行仿真,得到1602液晶显示效果图.实验结果表明,在单片机显示领域的设计开发中Proteus软件具有重要的实用价值,可以大幅缩短开发周期,节约开发成本.【期刊名称】《农机使用与维修》【年(卷),期】2017(000)012【总页数】3页(P15-17)【关键词】液晶显示;单片机;Proteus【作者】史洁【作者单位】黑龙江农业经济职业学院,黑龙江牡丹江157041【正文语种】中文【中图分类】TP368.12Proteus 软件是英国 Labcenter 公司开发的一个电路分析与实物仿真软件,它具有模拟电路和数字电路仿真功能,支持主流单片机及其外围电路组成系统的仿真,提供软件调试功能。
在实际工程中,通常用 Keil 进行软件仿真,Proteus 进行硬件仿真,并进行系统联调;通过此方式,可以验证系统设计方案的正确性,降低设计成本,提高产品开发效率。
LCD1602液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点, 在仪器仪表中被广泛的使用。
目前,字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。
LCD1602液晶显示模块,它可以显示两行,每行16个字符,采用单+5 V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
(1)主要技术参数如表1。
(2)接口信号说明如表2。
(3)基本写操作时序写指令如图1所示。
写数据如图2所示。
(4)RAM地址映射图控制器内部带有80×8位(80字节)的RAM缓冲区,对应关系如图3所示。
(5)指令说明①显示模式设置:指令码为38H,功能为设置16×2显示,5×7点阵,8位数据接口。
②显示开关及光标设置如表3。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本科毕业论文(设计)题目:基于单片机的1602液晶显示电路设计学生姓名:学号:系别:理工部专业:电气工程及其自动化入学时间:2012年09月导师姓名:职称/学位:基于单片机的1602液晶显示电路设计摘要本文是一篇介绍利用AT89S52单片机和LCD1602液晶显示屏设计一种液晶显示电路并编程实现信息的显示功能。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
1602LCD是指显示的内容为16*2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
从AT89S52单片机与LCD1602液晶显示器性能特点出发,实现两者接口的衔接设计。
经过多次的调试, 使得该设计取得了比较满意的结果, 且系统软硬件设计简单方便、稳定可靠, 可广泛应用于智能化仪器仪表及各种宣传场所, 为嵌入式控制系统提供高灵活、高性价比的解决方案。
关键词:AT89S52单片机;LCD1602液晶显示器;复位电路;时钟电路目录第一章前言 (2)1.1 研究现状 (2)1.2 研究意义 (2)第二章系统硬件电路设计 (3)2.1 AT89S52单片机最小系统 (3)2.1.1 主要性能 (3)2.1.2 功能 (3)2.1.3 引脚说明及实物图 (4)2.2 LCD1602液晶显示器 (7)2.2.1功能 (7)2.2.2 特点 (7)2.2.3 引脚 (7)2.3 复位电路 (9)2.4 时钟电路 (9)第三章软件设计 (10)3.1 软件设计思路 (10)3.1.1 Altium Designer (11)3.1.2 keil (11)3.1.3 AVR_fighter (11)3.2 程序设计 (12)第四章仿真及硬件电路 (15)第五章总结与展望 (17)主要参考文献 (18)致谢 (19)第一章前言本文是一篇研究基于AT89S52单片机的1602液晶显示电路设计,本次设计要求通过对单片机和1602液晶显示模块的学习,设计出完整的电路并焊出电路板,再对单片机写入程序,从而实现在液晶屏上显示出字符。
1.1 研究现状随着科技的发展,单片机的发展越来越迅猛。
诞生于20世纪70年代末的单片机,发展至今,几乎渗透到我们生活的各个领域,小到日常生活的手机、计算器,大到国家的国防军事,航空航天等随处可看到单片机的身影。
单片机的应用不仅给人们带来了便利,也为国家的安全提供了保障。
它的出现使得许多原本花费很高的复杂电路以及繁多的电气元器件都被取缔,取而代之的是一块小小的芯片。
AT89S52单片机是Atmel公司新近推出的高档、增强型产品。
它是一个低功耗、高性能CMOS8位微控制器,片内含通用8位中央处理器和ISPFLASH存储单元,8kb ISP的可反复擦写1000次的FLASH只读程序存储器,片上FLASH允许程序存储器在系统可编程,亦适于常规编程器。
器件采用Atmel公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,在单芯片上,拥有灵巧的8位CPU和在系统可编程FLASH,使得AT89S52为众多嵌入式控制应用系统提供高灵活、高性价比的解决方案。
单片机液晶显示主要是指单片机以及由单片机驱动的点阵式液晶显示屏所组成的一个显示系统。
作为信息传递的一种方式,液晶显示在我们日常生活中也随处可见,电子仪表,计算器上面都有显示器的身影。
LCD是典型的发光器件,它一材料科学为基础,综合利用了精密机械,光电及计算机技术,并正在微机械,微光学,纤维光学等前沿领域研究基础上,向高集成化,智能化方向发展。
本文主要研究以AT89S52单片机驱动LCD1602液晶显示器,使LCD1602液晶显示屏上显示出作者的学号与姓名。
1.2 研究意义当下社会,由于单片机的快速发展,单片机在以后的应用中将会更加广泛,对于单片机的应用也将更加普遍。
本次的研究使读者了解AT89S52单片机和LCD1602液晶显示器的基本工作原理与特点,并且懂得两者接口的应用等。
为以后对单片机和液晶显示器的深入研究打下坚实的基础!第二章系统硬件电路设计本研究的硬件电路主要包括AT89S52单片机最小系统,LCD1602液晶显示电路,复位电路和晶振电路。
具体内容如下:2.1 AT89S52单片机最小系统AT89S52单片机是ATMEL公司新近推出的高档型AT89S系列单片机中的增强型产品,是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
2.1.1 主要性能1、与MCS-51单片机产品兼容;2、8K字节在系统可编程Flash存储器;3、1000次擦写周期;4、全静态操作:0Hz-33MHz;5、三级加密程序存储器;6、32个可编程I/O口线;7、三个16位定时器/计数器;8、8个中断源;9、全双工UART串行通道;10、低功耗空闲和掉电模式;11、掉电后中断可唤醒;12、看门狗定时器;13、双数据指针;14、掉电标识符。
2.1.2 功能8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.1.3 引脚说明及实物图AT89S52单片机共有40个引脚,如图2-1:图2-1 AT89S52单片机引脚图VCC:电源电压P0:P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL 逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下, P0不具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个 TTL 逻辑电平。
此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2 的触发输入(P1.1/T2EX)。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能:P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5 MOSI(在系统编程用)P1.6 MISO(在系统编程用)P1.7 SCK(在系统编程用)P2:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。
对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2 口送出高八位地址。
在这种应用中,P2 口使用很强的内部上拉发送1。
在使用 8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash 编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4 个 TTL 逻辑电平。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
端口引脚第二功能:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断0)P3.3 INT1(外中断1)P3.4 TO(定时/计数器0)P3.5 T1(定时/计数器1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。
PST:复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。
需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。
FLASH 存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V 编程电压Vpp。
XTAL1:振荡器反相放大器以及内部时钟电路的输入端。
XTAL2:振荡器反相放大器的输出端。
GND:地AT89S52单片机实物图如图2-2,2-3:图2-2AT89S52背面图2-3AT89S52正面AT89S52单片机最小系统尺寸:长85mm*宽55mm*高18mm2.2 LCD1602液晶显示器LCD1602,工业字符型液晶,指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。