当前位置:文档之家› 基于89C51的等精度频率计LCD1602显示

基于89C51的等精度频率计LCD1602显示

基于89C51的等精度频率计LCD1602显示
基于89C51的等精度频率计LCD1602显示

《简易频率计制作》

学院:信电学院

班级:08—16班

学生姓名:陈杨04081843

王忠超04081843

齐俊斌04081843

时间:从2010年5月10日到2010年 5 月15 日

等精度频率计的设计

一摘要:

本设计是基于AT89C52单片机频率计入信号为峰峰值5v的正弦信号,频率测量范围10HZ~100MHZ ,频率测量精度为0.1%。采用1602液晶显示器显示测量结果。信号源由PROTEUS 的虚拟信号发生器产生。

二关键词:频率计等精度单片机分频

三设计原理与总体方案:

测量一个信号的频率有两种方法:第一种是计数法,用基准信号去测量被测信号的高电平持续的时间,然后转换成被测信号的频率。第二种是计时法,计算在基准信号高电平期间通过的被测信号个数。

根据设计要求测量10HZ~100MHZ的正弦信号,首先要将正弦信号通过过零比较转换成方波信号,然后变成测量方波信号。如果用第一种方法,当信号频率超过1KHZ的时候测量精度将超出测量极度要求,所以当被测信号的频率高于1KHZ的时候需要将被测信号进行分频处理。如果被测信号频率很高需要将被测信号进行多次分频直到达到设计的精度要求。

根据设计要求用单片机的内部T0产生基准信号,由INTO输入被测信号,通过定时方式计算被测信号的高电平持续时间。通过单片机计算得出结果,最后有1062液晶显示器显示测量结果。等精度频率计的系统设计框架如下图1所示。

图1 等精度频率计系统设计框图

四硬件设计:

硬件电路主要分为信号转换电路、分频电路、数据选择电路、单片机系统和显示电路五部分。其总体电路图如图2所示。

图2 总体电路图

4.1 电平转换电路:

要将正弦信号转换成方波信号可以用过零比较电路实现。正弦信号通过LM833N与零电平比较,电压大于零的时候输出LM833N的正电源+5V,电压小于零的时候输出负电源0V。具体电路如图3所示。

图3信号转换电路

4.2 分频电路:

分频电路采用十进制的计数器74HC4017来分频,当被测信号脉冲个数达到10个时74HC4017产生溢出,C0端输出频率为输入频率的1/10,达到十分频的

作用。如果当频率很高是需要多次分频只需将多片74HC4017级联就可以了。74HC4017时序图如图4所示,系统分频电路如图5所示。

图474HC4017时序图

图5分频电路

4.3数据选择电路:

根据设计要求要根据计数脉冲个数来选择分频次数,可以用74151来选择分频次数,74151的选择控制信号有单片机的I/O口来控制。数据选择电路如图6所示。

图6数据选择电路

4.4单片机系统:

单片机采用AT89C51,采用12MHZ的晶振频率。单片机的P3.2口接被处理后的被测信号,P0口接液晶显示器的数据输入端,ALE,RD,WR,P0.0,P0.1通过外接控制电路接液晶显示器的控制端。单片机系统的电路如图7所示。

图7单片机系统

4.5显示电路:

显示电路由1602组成,其电路如图8所示。

图8显示电路

五软件设计:

等精度频率计的软件设计主要由主程序、分频选择程序、液晶显示程序组成。

5.1 等精度频率计的算法设计:

根据设计要求频率范围是10HZ~100MHZ,当频率为10HZ时,T=100000us,高电平为50000us,0.1%的误差为100us,由单片机产生的基准频率为1MHZ,T0=1us,最大误差为1us,计数个数为50000(方式1),满足设计要求。当频率增加到1KHZ时,产生的误差刚刚能达到设计要求,这时计数个数为500。当频率大于1KHZ时(即计数个数小于500)就需要将被测频率分频后再测量,如当

频率为10KHZ 时,先计算计得的脉冲数等于50,小于了500,所以将10KHZ 的信号10分频得到1KHZ ,这时就满足要求了。

最后得到的频率 f=i n

102106

其中n 为计得的脉冲个数,i 为分频的次数。 5.2 主程序:

主程序首先对系统环境初始化,设置分频选通信号P2=0x00,选通0通道。设置T0工作方式,采用硬件启动方式,GATE=1,当INT0和TR0同时为1时启动计时,计数方式为方式1(16位),TH0和TL0都置零。当外部中断INT0=1时等待,当外部中断为0时启动T0即TR0=1,当INT0一直为0时就等待,一旦INT0=1就启动计数同时等待,当INT0为0时跳出并关闭T0即TR0=0。这样就计得高电平期间基准脉冲个数,当脉冲个数小于500时就选择10分频信号,即P2自加1,同时记录分频一次;如果分频后脉冲个数还小于500则再次分频,知道计数个数大于500。其示意图如图9所示,主程序流程图如图10所示。

图9 计数工作示意图

图10 主程序流程图5.3程序清单:

5.3.1主程序:

#include

#include

#include

#include

sbit p32=P3^2;

main()

{ unsigned int period,k,j,i=0;

float f,m;

char buff[30];

init_LCD();

P2=0x00;

while(1)

{

TMOD=0X09;

TH0=0;

TL0=0;

while(p32==1);

TR0=1;

while(p32==0);

while(p32==1);

TR0=0;

period=TH0*256+TL0;

while(period<=500) /*判断是否分频及计算分频次数*/

{ P2++;

i++;

period=period*10;

if(i==6)

{P2=0x00;

break;

}

}

k=pow(10,i); /* 10的i次方*/

f=(1000000.0/(2*period))*k;

if(f<1000)

sprintf(buff,"f=%5.2fHZ",f);

else

{m=f/1000.0;

sprintf(buff,"f=%5.2fKHZ",m);

}

lcdprintf(0,0,buff);

}

}

5.3.2显示子程序:

#include

char code CGRAM_TABLE[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,// ;年

0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //;月

0x0F,0x09,0x09,0x0F,0x0,0x09,0x0F,0x00}; // ;日void delay()

{

unsigned char i;

for(i=0;i<250;i++);

}

void init_LCD()

{

unsigned char i;

WR_COM=0x38; //设置为8位数据总线,16*2,5*7点阵

for(i=0;i<100;i++)

delay();

WR_COM=0x01; //清屏幕

for(i=0;i<50;i++)

delay();

WR_COM=0x06; //光标移动,显示区不移动,读写操作后AC加1

for(i=0;i<50;i++)

delay();

WR_COM=0x0c;

for(i=0;i<50;i++)

delay();

}

/****************************************************************************** ******************** /

void init_cgram()

{

unsigned char i;

//;设置自定义字符

WR_COM=0x40;

for(i=0;i<24;i++)

{

WR_DAT=CGRAM_TABLE[i];

}

for(i=0;i<40;i++)

delay();

}

/****************************************************************************** ******************** /

void PutChar(char t)

{

WR_DAT=t;

delay();

delay();

}

void clr_lcd()

{

WR_COM=0x01;

delay();

delay();

}

void lcdprintf(char x,char y,char *s)

{

//clr_lcd();

if(y>1)y=1;

WR_COM=(y*0x40+x)|0x80;

delay();

delay();

while(*s!=0)

{

WR_DAT=*s;

s++;

delay();

delay();

}

}

六调试:

等精度频率计的调试比较简单,在电平转换前的输入端输入标准的正弦信号,把编译好的程序指定到Proteus中的单片机中。运行Proteus即可在显示器中观测到显示结果。

当然我们在调试过程中也遇到了不少的困难。首先我们用4017来作为十分频器,但是没有注意到4017是CMOS型的,而我们系统所用的是TTL电平,所以最后改用了74HC4017;在刚开始的时候当输入某个频率时输出显示为零,或者为负数,最后发现是输出的数据类型定义错了,因为最大要测量10MHZ的频率,所以要定义输出数据类型为long int型,否则输出将产生溢出显示负数。

七结束语:

本设计所设计的频率计有有较高的精度,频率范围较高,有较强的实用价值。当然本设计只是基于各种理想的实验条件下得出的结论,设计当中不可避免的存在一些问题。例如在信号转换的电路中只是粗略的将正弦信号转换成方波信号,而没有对输出信号进行进一步的处理;在信号经过分频后也没有对信号进行处理,这将降低测量的精度。如果在以上两个地方加入相关的处理电路,系统的精度将得到进一步的提高。

八参考文献:

【1】李群芳肖看编著. 单片机原理、接口及应用-嵌入式系统技术基础. 北京. 清华大学出版社.2005

【2】康华光主编. 电子技术基础-数字部分(第四版).北京. 高等教育出版社. 2000 【3】康华光主编. 电子技术基础-模拟部分(第五版).北京. 高等教育出版社. 2006

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

LCD1602液晶显示器

实验11:1602液晶显示屏显示(字符型液晶显示器) 字符型液晶显示器用于数字、字母、符号并可显示少量自定义符号。这类液晶显示器通常 有16根接口线,下表是这16根线的定义。 字符型液晶接口说明 编号符号引脚说明编号符号引脚说明 1 Vss 电源地 9 D 2 数据线2 2 Vdd 电源正 10 D 3 数据线3 3 VL 液晶显示偏压信号 11 D 4 数据线4 4 RS 数据/命令选择端 12 D 5 数据线5 5 R/W 读/ 写选择端 13 D 6 数据线6 6 E 使能信号 14 D 7 数据线7 7 D0 数据线0 15 BLA 背光源正极 8 D1 数据线1 16 BLK 背光源负极(本学习板配的 内部已经接地) 下图是字符型液晶显示器与单片机的接线图。这用了P0口的8根线作为液晶显示器的数据 线,用P20、P21、P22做为3根控制线。

字符型液晶显示器与单片机的接线图 字符型液晶显示器的使用,字符型液晶显示器一般采用HD44780芯片做为控制器的。 1.字符型液晶显示器的驱动程序 这个驱动程序适用于1602型字符液晶显示器, 1) 初始化液晶显示器命令(RSTLCD) 设置控制器的工作模式,在程序开始时调用。 参数:无。 2) 清屏命令(CLRLCD) 清除屏幕显示的所有内容 参数:无 3) 光标控制命令(SETCUR) 用来控制光标是否显示及是否闪烁 参数:1个,用于设定显示器的开关、光标的开关及是否闪烁。 4) 写字符命令(WRITECHAR) 在指定位置(行和列)显示指定的字符。

参数:共有3个,即行值、列值及待显示字符,分别存放在XPOS、YPOS和A中。其中行值与列值均从0开始计数,A中可直接写入字符的符号,编译程序自动转化为该字符的ASCII 值。 5) 字符串命令(WRITESTRING) 在指定位置显示指定的一串字符。 参数:共有3个,即行值、列值和R0指向待显示字符串的内存首地址,字符串须以0结尾。如果字符串的长度超过了从该列开始可显示的最多字符数,则其后字符被截断,并不在下 行显示出来。 以下是驱动源程序 ;************************************************** ;连线图: ; DB0---DPROT.0 DB4---DPROT.4 RS-------------P2.0 ; DB1---DPROT.1 DB5---DPROT.5 RW-------------P2.1 ; DB2---DPROT.2 DB6---DPROT.6 E--------------P2.2 ; DB3---DPROT.3 DB7---DPROT.7 VLCD接1K电阻到GND* ;系统晶振为11.0592 ;************************************************** RS BIT P2.0 RW BIT P2.1 E BIT P2.2 DPORT EQU P0 XPOS EQU R1 ;列方向地址指针 YPOS EQU R2 ;行方向地址指针 CUR EQU R3 ;设定光标参数 NoDisp EQU 0 ;无显示 NoCur EQU 1 ;有显示无光标 CurNoFlash EQU 2 ;有光标但不闪烁 CurFlash EQU 3 ;有光标且闪烁

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

lcd1602显示程序

lcd1602显示程序 液晶显示简介①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示 点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显

单片机+LCD1602液晶显示字符串

1602液晶显示字符串(附带程序)(注意说明:使用的实验板是郭天祥老师的52单片机板)

基本操作电路 状态字说明 RAM地址映射图

初始化相关指令的意思 读时序图

写时序图

要想通过1602液晶来显示你想要显示字符串,其实是很简单的,程序虽然有点长,但是都是按照步骤来的。 1602的五大步骤 第一个步骤: 检查LCD忙状态 lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。第二个步骤: 写指令数据到LCD RS=L,RW=L,E=高脉冲,D0-D7=指令码。 第三个步骤: 写显示数据到LCD RS=H,RW=L,E=高脉冲,D0-D7=数据。 第四个步骤: 设定显示位置 第五个步骤: LCD初始化设定 只要这五步你弄懂了,什么样的字符串都可以按照你的方式显示。至于这其中的步骤的具体的方式,我们就要参照1602的资料和时序图!不过你大可不必,这份文档就足够了! #include #include #define uchar unsigned char #define uint unsigned int

sbit dula=P2^6; sbit wela=P2^7; sbit LCD_RS = P3^5; sbit LCD_RW = P3^6; sbit LCD_EN = P3^4; uchar code dis1[] = {" WLCOME TO "}; uchar code dis2[] = {" JIANG GAN HUA "}; uchar code dis3[] = {" NAN CHANG "}; uchar code dis4[] = {" HANG KONG DX"}; void delay(int ms) { int i; while(ms--) { for(i = 0; i< 110; i++) { _nop_(); } } } bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0&0x80); LCD_EN = 0; return result; } void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd;

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 MAIN: MOV SP,#60H MOV 40H,#01H MOV 41H,#02H MOV 42H,#03H MOV 43H,#04H MOV 44H,#05H MOV 45H,#06H MOV 46H,#07H ACALL DD1 ;DD1是LCD初始化

MOV DPTR,#TABLE1 ACALL DD2;DD2是LCD第一行显示TABLE1 ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据 SJMP $ DD1: MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE RET DD2: MOV p0,#80H;第一行的开始位置 cALL ENABLE CALL WRITE1;到TABLE1取码? RET DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 RET ENABLE: CLR RS ;送命令 CLR RW CLR E CALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET

1602液晶字符显示

1602液晶字符显示

1.基本简介 LCD1602工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方

便地应用于市面上大部分的字符型液晶。 2.管脚功能 1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。 第7~14脚:D0~D7为8位双向数据端。 第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 ⑶特性 3.3V或5V工作电压,对比度可调

LCD1602液晶显示器设计

LCD1602液晶显示课程设计 第一章绪论 1.1课题背景 当今时候是一个信息化的时代,信息的重要性不言而喻的,获取手段显得尤其重要。人们所接受的信息有70%来自于人的视觉,无论用何种方式获取的信息最终需要有某种显示方式来表示。在当代显示技术中,主流的有LED显示屏和LCD液晶显示,而在这些显示技术中,尤其以液晶显示器LCD(Liquid crystal display)为代表的平板显示器发展最快,应用最广。LCD是典型的发光器件,它一材料科学为基础,综合利用了精密机械,光电及计算机技术,并正在微机械,微光学,纤维光学等前沿领域研究基础上,向高集成化,智能化方向发展。 液晶显示技术发展迅猛,市场预测表明,液晶显示平均年销售呈增长10%~13%,不久的将来有可能取代CRT,成为电子信息产品的主要显示器件,另外,液晶显示器对空间电磁辐射的干扰不敏感,且在紧凑的仪器空间不需要专门的屏蔽保护,因而课大大简化仪器的结构和制造成本,在各种便携式仪器,仪表将会越来越广泛的应用。特别是在电池供电的单片机产品中,液晶显示更是必选的显示器件。 1.2课题设计目标 本设计是基于AT89C51芯片单片机为主控芯片,结合1602液晶显示模板等外围电路,通过软件程序,来实现液晶显示英文字母。本次设计的目的在于利用单片机和IIC技术来显示英文字母。 1.3课程设计的主要工作 (1)对系统的各个模块的各个功能进行深入分析和研究,在对课题所采用的方案进行可行详细的研究后设计具体功能电路。 (2)熟悉所选芯片的功能并完成具体电路设计。

(3)对系统的最终指标进行测试,针对系统的不足,进行分析并提出一些改正方法。 1.4 设计要求 (1)运行IIC总线技术。 (2)循环显示字母。 第二章硬件设计 2.1 LCD1602简介 2.1.1 LCD1602引脚功能 LCD1602引脚如图2.1所示 图2.1 LCD1602引脚图 引脚图的功能如表2—1所示

lcd1602液晶封装函数

//端口定义 #define DBPort P0 //LCD数据端口 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sbit Lcdbf = P0^7; //LCD忙标志Busy Flag void delay(unsigned int t) //延时 { while(t--); } void LCD_Wait(void) //读忙状态 { LcdRs=0; LcdRw=1; LcdEn=1;delay(10);LcdEn=0; //下降沿 while(Lcdbf) { LcdEn=0;LcdEn=1; //仿真才需要此语句,实际硬件中不需要} } void LCD_Write(bit style, unsigned char input) //写数据1/命令0 { LcdRs=style; LcdRw=0; DBPort=input; LcdEn=1;delay(10);LcdEn=0; LCD_Wait(); } void LCD_Initial(void) //初始化LCD { LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵 delay(300); LCD_Write(0,0x0c); //显示模式 LCD_Write(0,0x01); //清屏 LCD_Write(0,0x06); //输入模式 } void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置{ if(y==0) LCD_Write(0,0x80|x);

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ bit Lcd_BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void Lcd_WriteCom (unsigned char dictate) { while(Lcd_BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

LCD1602显示屏地驱动设置及例程

LCD1602显示屏的驱动设置及例程 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科 技公司的产品,它有16条引脚。如图1所示: 图1 再来一张它的背面的,如图2所示: 引脚号符号引脚说明引脚号符号引脚说明 1 VSS 电源地9 D 2 数据端口 2 VDD 电源正极10 D 3 数据端口 3 VO 偏压信号11 D 4 数据端口 4 RS 命令/数据12 D 5 数据端口 5 RW 读/写13 D 6 数据端口 6 E 使能14 D 7 数据端口 7 D0 数据端口15 A 背光正极

图3

图4 二.基本操作 LCD1602的基本操作分为四种: 1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。 2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。 3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。 4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。 读操作时序图(如图5): 图5 写操作时序图(如图6):

图6 时序时间参数(如图7): 图7 三.DDRAM、CGROM和CGRAM DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下(如图8): 图8 DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。同样LCD1602共有80个字节的显存,即DDRAM。但L CD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不

LM1602液晶显示程序

#include #define uchar unsigned char #define uint unsigned int unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; uchar second = 30; uchar minite = 11; uchar hour = 15; sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++); } void Write_Command(uchar command) { P0 = command; RS = 0; RW = 0; E = 1; delay(); E = 0; } void Write_Data(uchar Data) { P0 = Data; RS = 1; RW = 0; E = 1; delay(); E = 0; } void LCD_Init(void)//初始化 { Write_Command(0x01); Write_Command(0x38);

Write_Command(0x0c); Write_Command(0x06); } void LCD_Printfc(uchar hang,uchar lie,uchar sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie; Write_Command(a); Write_Data(sign); } void LCD_Display(uchar *tab1) { uchar i; Write_Command(0x80); for(i=0; i<16; i++) { Write_Data(tab1[i]); delay(); } /* Write_Command(0xc0); for(i=0; i<16; i++) { Write_Data(tab2[i]); delay(); }*/ } void time_view(void) { if(second == 60) { minite ++; second = 0; } if(minite == 60) { hour++; minite = 0; } if(hour == 24)

LCD1602-51单片机汇编程序

1602汇编程序,51单片机汇编程序,仅需修改引脚定义即可。晶振大小12M,程序测试完全正确。内部包含写数据、写命令(包括读忙和不读忙)、初始化等子函数。调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。 ;端口引脚定义区 LCD_RS BIT P2.4 ;1602数据命令选择端口 LCD_RW BIT P2.5 ;1602读写选择端口 LCD_EN BIT P2.6 ;1602使能端口 LCD_DATA EQU P0 ;1602数据端口 ;变量声明区 ALL_FLAG EQU 20H ;标志位 LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ;延时字 /***************************************** 1602读命令函数,高位存至LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP MOV LCD_DATA,LCD_DAT

单片机LCD1602 C语言程序

#include unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; unsigned char second = 0,minite=0,hour=0; /*设置管脚*/ sbit RS = P1^0; //sbit RS = P3^5 ; sbit RW = P1^1; sbit E = P1^2; sbit Beep = P3^4; /*LCD1602控制指令*/ // #define a b ==> a=b #define LCD_Set 0x38 // 0011 1000 显示初始化,16*2显示,5*7点阵,8位数据接口; #define LCD_Clear 0x01 // 0000 0001 清屏LCD ; #define LCD_Display1 0x0f // 0000 1111 显示功能设置:开显示,显示光标,光标闪烁; #define LCD_Display2 0x0c // 0000 1100 显示功能设置:开显示,不显示光标,光标不闪烁; #define LCD_Mode 0x06 // 0000 0110 设置光标状态默认0x06,为读一个字符光标加1 ; #define LCD_1_Left 0x80 //设置初始化数据指针,指向左半屏第一行首位; #define LCD_2_Left (0x80+0x40) //设置初始化数据指针,指向左半屏第二行首位; /*液晶1602 毫秒延时*/ void delay_ms(unsigned int ms) { unsigned int i,j; for(i=0;i

LCD1602字符测试显示程序与仿真

#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int uchar code table1 []={" WELCOME "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 //************管脚定义************************ sbit lcd_rs = P3^0; //液晶数据命令选择端 sbit lcd_en = P3^1; //液晶使能 //************参数定义************************ uint tvalue;//温度值 uchar tflag;//温度正负标志 uchar data disdata[5]; //************子函数定义************************ void delay(uchar z); //delay延时子程序 void init_lcd(); //LCD1602初始化函数 void write_com(uchar com); //LCD1602写指令函数 void write_data(uchar date); //LCD1602写数据函数 void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数 void welcome_1(); //LCD1602显示欢迎函数1 //************主函数************************ void main() { welcome_1(); delay(200); while(1); } //************delay延时子程序************************ void delay(uchar z)

LCD1602液晶显示实验实验报告及程序

实验三 LCD1602液晶显示实验 姓名专业学号成绩 实验目的 掌握Keil C51软件与proteus软件联合仿真调试的方法; 掌握LCD1602液晶模块显示西文的原理及使用方法; 掌握用8位数据模式驱动LCM1602液晶的C语言编程方法; 掌握用LCM1602液晶模块显示数字的C语言编程方法。 实验仪器与设备 1.微机一台C51集成开发环境仿真软件 实验内容 用Proteus设计一LCD1602液晶显示接口电路。要求利用P0口接LCD1602液晶的数据端,~做LCD1602液晶的控制信号输入端。~口扩展3个功能键K1~K3。参考电路见后面。 编写程序,实现字符的静态和动态显示。显示字符为 第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。 编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。显示字符为: “1.姓名全拼 2.专业全拼+学号EXP8 DISPLAY ” 主程序静态显示“My information!” 实验原理 液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。 LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:

编号符号引脚说明编号符号引脚说明 1VSS电源地9D2数据 2VDD电源正极10D3数据 3VL液晶显示偏压11D4数据 4RS数据/命令选择12D5数据 5R/W读/写选择13D6数据 6E使能信号14D7数据 7D0数据15BLA背光源正极 8D1数据16BLK背光源负极1602液晶模块内部的控制器共有11条控制指令,如表所示: 芯片时序表: 4.1602LCD的一般初始化(复位)过程

LCD1602的电路图和程序

MS 基于1602字符型液晶显示器的显示系统 姓名:杨越 班级:电子11-1 学号:110400104

一、实习目的 (1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。 (2)了解LCD1602的基本原理及用法。 (3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载 程序。 (4)能够熟练焊接电路板。 二、实验设备与器件 CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器, 三、实验内容 内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统 要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。 (1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号); 以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。 以下具体阐述这三个管脚: RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。 R/W为读写选择,高电平进行读操作,低电平进行写操作。 E端为使能端,后面和时序联系在一起。 除此外,D0~D7分别为8位双向数据线。 操作时序:

注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0. 读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作; 所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序) 指令集: LCD_1602 初始化指令小结: 0x38 设置16*2显示,5*7点阵,8位数据接口 0x01 清屏 0x0F 开显示,显示光标,光标闪烁 0x08 只开显示 0x0e 开显示,显示光标,光标不闪烁 0x0c 开显示,不显示光标 0x06 地址加1,当写入数据的时候光标右移 0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变 0x18 光标和显示一起向左移动 (2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据Flash(D-lash)组成片内存储器。主要功能模块包括:内部存储器,内部 PLL 锁相环模块,2 个异步串口通讯 SCI ,1个串行外设接口 SPI MSCAN 模块,1 个8 通道输入/输出比较定时器模块 TIM ,周期中断定时器模块 PIT ,16 通道 A/D 转换模块 ADC ,1 个 8 通道脉冲宽度调制模块 PWM ,输入/输出数字 I/O 口。

【51单片机】温度传感器DS18B20程序-LCD1602显示

仿真截图: //仿真文件网盘地址: //程序: #include #include #define uchar unsigned char #define uint unsigned int sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit P03 = P0^3; sbit P04 = P0^4; sbit P05 = P0^5; sbit P06 = P0^6; sbit P07 = P0^7; sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4;

sbit P15 = P1^5; sbit P16 = P1^6; sbit P17 = P1^7; sbit P20 = P2^0; sbit P21 = P2^1; sbit P22 = P2^2; sbit P23 = P2^3; sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6; sbit P27 = P2^7; sbit P30 = P3^0; sbit P31 = P3^1; sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5; sbit P36 = P3^6; sbit P37 = P3^7; //****** DS18B20 ****** #define DQ P17 /*************精确延时函数*****************/ void delay10us(void) //误差0us { unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--); } void delay20us(void) //误差0us { unsigned char a,b; for(b=1;b>0;b--) for(a=7;a>0;a--); } void delay30us() //误差0us { unsigned char a,b; for(b=3;b>0;b--) for(a=3;a>0;a--); }

相关主题
文本预览
相关文档 最新文档