文档库 最新最全的文档下载
当前位置:文档库 › LCD1602的电路图和程序

LCD1602的电路图和程序

LCD1602的电路图和程序
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 口。

本次设计中主要用到PORTA,PORTB端口:

PORTA:PORTA 为通用 I/O 口, 共 8 个,作为通用数字 I/O 口使用,未集成特殊功

能.主要配置寄存器有:数据寄存器 PORTA、数据方向寄存 DDRA、上拉电阻控制寄存器

PUCR 和驱动控制寄存器 RDR。

a.数据寄存器 PORTA

通过写 1/0 使单片机对应引脚输出高低电平,或通过读取数据寄存器获得对应引脚的高低电平值。例:PORTA_PB0=1

b.数据方向寄存器 DDRA

DDRA 寄存器配置引脚为输出口还是输入口,“0”,输入口;“1”,输出口。MCU 复位后,DDRA 值为 0x00, 引脚默认为输入口。例:DDRA=0xFF //配置PORTA 口为输出

PORTB:PORTB 为通用数字 I/O 口, 共 8 个。其使用与 PORTA 基本一样。主要配置寄存器有:数据寄存器 PORTB、数据方向寄存 DDRB。上拉电阻控制寄存器PUCR 和驱动控制寄存器 RDR 与 PORTA 、PORTB、PORTE、PORTK 共用。

a.数据寄存器 PORTB

b.数据方向寄存器 DDRB

四、原理图:

器件说明:LCD1602 (16管脚),2个排阻,4个10k电阻,一个1K电阻,飞思卡尔芯片(64管脚)

管脚连接:

VSS GND DB6 PB6

VCC VCC DB7 PB7

VEE GND A VCC

RS PA0 K GND

RW PA1 K1 PA4

E PA2 K2 PA5

DB0 PB0 K4 PA6

DB1 PB1 K4 PA7

DB2 PB2

unsigned char d=0;

void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)

{ //锁相环时钟=2*16*(2+1)/(1+1)=48MHz

REFDV=1; //总线时钟=48/2=24MHz

SYNR=2;

while(!(CRGFLG&0x08));

CLKSEL=0x80; //选定锁相环时钟

}

# define LCD_DB PORTB

# define LCD_RS PORTA_PA0

# define LCD_RW PORTA_PA1

# define LCD_E PORTA_PA2

void LCD_init(void);//初始化函数

void LCD_write_command(uchar command);//写指令函数

void LCD_write_data(uchar dat);//写数据函数

void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X (0-16),y(1-2)

//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。

void delay_n25us(uint n);//延时函数

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

//*******初始化函数***************

void LCD_init(void)

{

LCD_write_command(0x38);//设置8位格式,2行,5x7

LCD_write_command(0x0c);//整体显示,关光标,不闪烁

LCD_write_command(0x06);//设定输入方式,增量不移位

LCD_write_command(0x01);//清除屏幕显示

delay_n25us(10);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。//LCD_write_command(0x06);

//LCD_write_command(0x0c);

}

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

//********写指令函数************

void LCD_write_command(uchar dat)

{

LCD_DB=dat;delay_n25us(1);

LCD_RS=0;delay_n25us(1);//指令

LCD_RW=0;delay_n25us(1);//写入

LCD_E=1;delay_n25us(1);//允许

LCD_E=0;

delay_n25us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。

}

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

//********写数据函数*************

void LCD_write_data(uchar dat)

{

LCD_DB=dat;delay_n25us(1);

LCD_RS=1;delay_n25us(1);//数据

LCD_RW=0;delay_n25us(1);//写入

LCD_E=1;delay_n25us(1);//允许

LCD_E=0;delay_n25us(1);

delay_n25us(1);

}

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

//*******显示一个字符函数*********

void LCD_disp_char(uchar x,uchar y,uchar dat)

{

uchar address;

if(y==1)

address=0x80+x;

else

address=0xc0+x;

LCD_write_command(address);

LCD_write_data(dat);

}

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

/*******检查忙函数*************

void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以{ //至于不能正常使用LCD。因此我没有再用检查忙函数。而使

do //用了延时的方法,延时还是非常好用的。我试了一下,用

{ LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令

LCD_RS=0; //要用200次循环便能完成。

LCD_RW=1;

LCD_DB=0xff;

LCD_E=1;

}while(LCD_DB^7==1);

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

//********延时函数***************

void delay_n25us(uint n)

{ uint i=0;

uchar j=0;

for(i=n;i>0;i--)

for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,

} //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。

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

void check_key(void) //判断按键是否可以控制单片机(如果键入正常,则单片机上的LED会亮

{

if(!PORTAB_PA4){

PORTE_PE5 = 0;

a=1;

}

else if(!PORTAB_PA5){

PORTE_PE5 = 0;

a=2;

}

else if(!PORTAB_PA6){

PORTE_PE5 = 0;

a=3;

}

else if(!PORTAB_PA7){

PORTE_PE5 = 0;

a=4;

}

else

PORTE_PE5 = 1;

}

//*********主函数*****************

void port_init() {

DDRB=0XFF;

DDRA=0XFF;

PORTB=0XFF;}

void main(void) {

//PLL_Init();

port_init();

LCD_init();

DDRE_DDRE5 = 1;

PORTE_PE5 = 1; //不亮

/*DDRA_DDRA0 = 1;

DDRA_DDRA1 = 1;

DDRA_DDRA2 = 1;

DDRA_DDRA3 = 1;*/

DDRA_DDRA4 = 0; //SET PORTA I/O INPUT

DDRA_DDRA5 = 0;

DDRA_DDRA6 = 0;

DDRA_DDRA7 = 0;

PORTAB_PA4 = 1;

PORTAB_PA5 = 1;

PORTAB_PA6 = 1;

PORTAB_PA7 = 1;

//LCD_disp_char(4,2,'1');

for(;;) {

_FEED_COP(); /* feeds the dog */

check_key(); //检查按键

while(1)

{

/*if (a==1)

{delay(10);*/ //延时去抖

if(a==1){

LCD_disp_char(0,2,'1'); //在LCD第二行第一位输出1 } /*else if (a==2)

{delay(10);*/ //延时去抖

else if(a==2) {

LCD_disp_char(1,2,'2'); //在LCD第二行第二位输出2

} /*else if (a==3)

{delay(10);*/ //延时去抖

else if(a==3) {

LCD_disp_char(2,2,'3'); //在LCD第二行第3位输出3

}

/*else if (a==4)//延时去抖

{delay(10);*/

else if(a==4) {

LCD_disp_char(3,2,'4'); //在LCD第二行第4位输出4

}

// else { LCD_disp_char(12,1,'0');

// }

// LCD_disp_char(2,1,'2');

} /* loop forever */

/* please make sure that you never leave main */

}

七、调试过程

(1)使用Altium画出电路图:在电路图设计过程中,注明所用器件名称,规格,注意管脚的连接,尽可能让电路原理图规范,正确,方便看图焊接的工作。(2)测量电路焊接是否正常:焊接好电路板后,首先用万用表测试是否

连通,将表笔两端分别置于连接的两管脚,将万用表开关置于分贝档,若有响声,则电路已经联通,分别测试该设计所用的所有管脚。

(3)检验输入I0:用万用表分别检测4个按键,看按键是否起到输入作用。

将万用表开关置于电压档,分别测试按键按下前后的单片机电压。若按键前电压为5v,按键后为0,则说明按键起到了输入的作用。

(4)输出IO端口:输出口主要检验lcd1602的显示情况,首先用万用表

测试,检查LCD1602管脚链接是否有问题。注:LCD1602的VEE串联一个电位器后接地,通过调节电位器,调节显示对比度,否则即使初始化程序正确,字符也可能显示不出来。

(5)程序:程序中主要注意Lcd1602显示部分,因为LCD1602相对于单片机速度比较慢,所以在编写程序时应注意加延时。

八、遇到的问题及解决办法

(1)初次焊接LCD1602后,屏幕不亮

首先检查了电路板的焊接,及查阅了LCD1602的数据手册,因

为使用的1602为16个管脚,需要将BLK接电源。

(2)BDM仿真器下载不上程序

重新安装BDM仿真器,确认文件已拷入相应的路径。

(3)重复下载程序后lLCD1602不显示

在检查硬件电路没有问题后,检查程序,并单步执行,发现初

始化1602时循环次数设置过高。

(4)LCD1602初始化成功后不能正常显示字符

根据LCD1602连接电路图,发现D0-D7应接10K左右的排阻,

然后与核心板引脚相连。

(5)LCD1602显示比较模糊

根据1602的使用手册,V0与GND相连的中间应接入10K左右

电阻,并且电阻值越小对比度越大。

(6)按键不起作用

检查电路连接,发现上拉电阻接法错误,并改正。

(7)按键输入的数字显示并不稳定

在检查硬件电路没问题后,检查程序,查阅资料当得知,LCD1602需要初始化且速度较慢,所以应在初始化LCD1602时加入延时。

九、附:图片截屏

图1.使用FreescaleCodeWarrior软件编写程序

图2.使用BDM仿真器下载程序

图3.硬件电路板设计:

九、实验总结与体会

通过本次实习,使我对LCD1602及飞思卡尔单片机的应用都有了很深的理解,这是第一次独立的把软件及硬件相结合,包括改写程序及焊接电路板,整个过程中也有不成功的时候,例如在硬件的电路设计时,忽略了上拉电阻,导致LCD根本不能显示,在软件编程方面,因为缺少延时,LCD显示不正常,但经过不断修改检验,最终完成了本次的实习项目,使我对电子信息工程这个专业也有了深入的了解。

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

ISD4004按自己所需地址录放音或者按顺序录放音(包含ISD4004资料——绝对好用)

#include #define unchar unsigned char #define uint unsigned int sbit SS =P1^0; //片选 sbit MOSI=P1^1; //数据输入 sbit MISO=P1^2; //数据输出 sbit SCLK=P1^3; //ISD4004时钟 sbit INT =P1^4; //中断 sbit LED =P0^1; //指示灯 sbit LED1=P0^0; //指示灯:亮是录音/不亮是放音 sbit PR =P1^7; //录音和放音选择开关 sbit STOP=P1^5; //复位 sbit AN =P1^6; //执行 unchar code voice[ ]={ 0x0000,0x000f,0x001e,0x002f,0x003c,0x004b,0x005a,0x0069, 0x0078,0x0087,0x0096,0x00a5,0x00b4, 0x00c3,0x00d2 }; //一共录音15段,1-10段内容为数字0—9,11-15段内容音为:拾、点、分、秒、现在北京时间 void delay(unsigned int time) //延迟n微秒 { while(time!=0) { time--; } } void delayms(unsigned int time) //延迟n毫秒 { TMOD=0x01; for(time;time>0;time--) { TH0=0xfc; TL0=0x18; TR0=1; while(TF0!=1) {;} TF0=0; TR0=0; }

ISD4004系列芯片

ISD4004系列单片语音录放电路 一、 简述 ●单片8至16分钟语音录放 ●内置微控制器串行通信接口 ●3V 单电源工作 ●多段信息处理 ●工作电流25-30mA,维持电流1μA ●不耗电信息保存100年(典型值) ●高质量、自然的语音还原技术 ●10万次录音周期(典型值) ●自动静噪功能 ●片内免调整时钟,可选用外部时钟 PDIP/SOIC NC NC Vcca ANAIN+ ANAIN-NC AMCAP NC AUDOUT NC Vssa Vssa NC NC 28-PIN TSOP ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动电话及其他便携式电子产品中。芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列。芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI 或Microwire)送入。芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。采样频率可为 4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存100年(典型值),反复录音10万次。 二、引脚描述 电源:(VCCA,VCCD) 为使噪声最小,芯片的模拟和数字电路使用不同的电源总线,并且分别引到外封装的不同管脚上,模拟和数字电源端最好分别走线,尽可能在靠近供电端处相连,而去耦电容应尽量靠近器件。 地线:(VSSA,VSSD) 芯片内部的模拟和数字电路也使用不同的地线。

lcd1602程序流程图

LCD1602程序代码及显示流程图LCD1602显示程序代码DB P0//--P0=DB0~DB7位LCD_RS=P2;//--P2.0=RS位LCD UrW=P2;//--P2.1=RW位LCD_Ue=P2;//-P2.2=E//--/--/----定义函数? define uchar unsigned char? define uint unsigned int///—定义子例程函数void LCD_Uiinit(void);//-初始化LCD1602函数void LCD_2;write_uchar命令(uchar命令);//-写入命令功能无效LCD到LCD1602_Char数据(uchar DAT);//-将无效的LCD数据写入LCD1602_Uxset_XY(uchar x,uchar y);//设置LCD1602 void LCD_uchar(uchar x,uchar y,uchar DAT)的显示位置x(0-16),y(1-2);//-在LCD1602中,显示包含无效字符的LCD;uchar x,uchar y,uchar*s);在LCD1602上显示一个字符串//void LCD_ucheck_uBusy(void);//检查Busy函数。我没有使用这个功能,因为通过率很低。LCD_u2;delay_10us(uint n);//-10微秒延迟子程序void LCD_udelay_50uS(uint n);/-延迟子程序50微秒初始化(无效){LCD_udelay_10us(20);LCD_uwrite_10us(0x38);//-设置8位格式,2行,5x7 LCD_2;delay_10us(5);LCD_uwrite_u命令(0x0c);//-整体显示,关闭光标,不闪烁LCD 不闪烁LCD_延时延时10us(5);LCD_写写写命令(0x06);///-设置输入模式,增量增

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液晶显示实验要点

实验报告 实验名称: [LCD1602液晶显示实验]姓名: 学号: 指导教师: 实验时间: [2013年6月15日] 信息与通信工程学院

LCD1602液晶显示实验 1.实验原理 1.1 基本原理 1.1.1 1602字符型LCD简介 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。 1.1.2 1602LCD的基本参数及引脚功能 1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图1-2所示: 图1-2 1602LCD尺寸图 1.1602LCD主要技术参数: 显示容量: 16×2个字符 芯片工作电压: 4.5~5.5V 工作电流: 2.0mA(5.0V) 模块最佳工作电压: 5.0V 字符尺寸: 2.95×4.35(W×H)mm 2.引脚功能说明: 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表: 表1-3引脚接口说明表 编 符号引脚说明编号符号引脚说明 号 1 VSS 电源地9 D 2 数据 2 VDD 电源正极10 D 3 数据 3 VL 液晶显示偏压11 D 4 数据 4 RS 数据/命令选择12 D 5 数据 5 R/W 读/写选择13 D 6 数据 6 E 使能信号14 D 7 数据 7 D0 数据15 BLA 背光源正极 8 D1 数据16 BLK 背光源负极

1.1.3 1602LCD的指令说明及时序 1602液晶模块内部的控制器共有11条控制指令,如表1-4所示: 表1-4 控制命令表 序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示0 0 0 0 0 0 0 0 0 1 2 光标返回0 0 0 0 0 0 0 0 1 * 3 置输入模式0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制0 0 0 0 0 0 1 D C B 5 光标或字符移位0 0 0 0 0 1 S/C R/L * * 6 置功能0 0 0 0 1 DL N F * * 7 置字符发生存贮器 地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到CGRAM或 DDRAM) 1 0 要写的数据内容 11 从CGRAM或 DDRAM读数 1 1 读出的数据内容 1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)读写操作时序如图1-5和1-6所示: 图1-5 读操作时序

ISD4004应用电路及程序

ISD4004应用电路及程序 2011年08月05日 09:42 本站整理作者:秩名用户评论(1) 关键字:ISD4004(7) ISD4004应用电路图: ISD4004电压是3.3V,所以本把5V的电压串联了两个二极管,这样得到的电压会是3.6伏左右,已经符合ISD4004的供电电压,这个图已经是很简化的一个图了,录音输入只采用负端单端输入方式,本人已经试过可以用。 信号放大和功率放大电路: 运放采用典型的运放芯片NE5532,对ISD4004信号进行跟随和放大,为后级功放提供了保障。 ISD4004驱动程序如下: 个人亲自测试并应用过,此程序肯定可以用。但v4扦测未通过 #include #include #define uchar unsigned char #define uint unsigned int // ISD4004 Control bit #define SS_1 (PORTB |= BIT(0)) #define SS_0 (PORTB &= ~BIT(0)) #define SCLK_1 (PORTB |= BIT(1)) #define SCLK_0 (PORTB &= ~BIT(1)) #define MOSI_1 (PORTB |= BIT(2)) #define MOSI_0 (PORTB &= ~BIT(2)) #define MISO_1 (PORTB |= BIT(3)) #define MISO_0 (PORTB &= ~BIT(3)) uchar temp,flag; void delay_ms(uint i) { uint a,k; for(a=0;a void Send_Data(uint ISD4004Data) { uchar i; for(i=0;i> i; temp= temp & 0x01;

已经采用过-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

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);

基于ISD4004的语音录放系统

本科毕业设计 (2012届) 题目语音录放系统的设计 学院 专业 班级 学号 学生姓名 指导教师 完成日期2012年5月

摘要 本论文主要实现语音录放系统的设计。语音录放系统主要包括单片机控制模块、语音采集模块、语音处理模块、信号放大模块,其中单片机控制模块是整个系统设计的关键。在语音的录放过程中,单片机通过SPI通信方式与语音模块进行通讯,来实现语音的录音与播放。由于每段录音都对应着不同的地址,因此在播放录音时,需要发送需要播放的地址即可播放。 语音录放系统的信号处理过程主要包括语音的采集、信号的放大和语音的滤波。语音经过驻极体传感器,即麦克风,把声波信号转换成电信号。传感器采集的电信号进过放大电路,放大一定倍数,经滤波、耦合之后送至语音模块。语音模块对连续变化的语音信号进行采样,抽取其中的语音信号电平,直接存储在语音芯片ISD4004中,因此使得语音自然真实。当语音播放时,需要在语音芯片的输出段加一个带通滤波器,以滤除音频带宽以外的信号,从而减少杂音的干扰。STC89C52单片机的程序,使用keil编译程序进行设计和调试完成,其主要功能是控制语音模块,以及液晶显示模块。 关键词:微控制器;录音放音;ISD4004; ABSTRACT The main aim of this paper is to realize the function of voice recording and playback system. The key to the overall system design of the voice recording system which includes a single-chip control module, voice acquisition module, voice processing module, signal amplification module, is MCU control module. In the voice playback process, the microcontroller communicates through SPI communication voice module,

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

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单片机控制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

ISD4004系列语音芯片中文资料教学内容

I S D4004系列语音芯 片中文资料

ISD4004系列单片语音录放电路 一、简述 ●单片8至16分钟语音录放 ●内置微控制器串行通信接口 ●3V 单电源工作 ●多段信息处理 ●工作电流25-30mA,维持电流1μA ●不耗电信息保存100年(典型值) ●高质量、自然的语音还原技术 ●10万次录音周期(典型值) ●自动静噪功能 ●片内免调整时钟,可选用外部时钟 S S 1 M O S I 2 M I S O 3 V s s d 4 N C 5 N C 6 N C 7 8 N C N C 9 N C 10 V s s a 11 V s s a 12 A N D O U T 13 A M C A P 14 P D I P /S O I C I N T 28-P I N T S O P ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动电话及其他 便携式电子产品中。芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音 频放大器、自动静噪及高密度多电平闪烁存贮陈列。芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI 或Microwire)送入。芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。采样频率可为 4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存100年(典型值),反复录音10万次。 二、引脚描述

lcd1602程序流程图

LCD1602程序代码和显示流程图LCD1602显示程序代码_ DB P0 //---P0 = DB0?DB7位LCD_ RS = P2; //--p2.0 = RS 位LCD_ RW = P2; //--p2.1 = RW 位LCD_ E = P2; //-p2.2 = E / /---/--/--定义函数? 定义uchar unsigned char ? 定义uint unsigned int // //-定义子程序函数void LCD_ Init (void ); //-初始化LCD1602函数void LCD_ write_ Command (uchar command ); //-写指令功能无效LCD 到LCD1602_ write_数据(uchar DAT ); //-将无效的LCD 数据写入LCD1602_ set_ XY (uchar x ,uchar y ); //设置LCD1602的显示位置x (0-16) ,

y(1-2)void LCD_ disp_ Char(uchar x,uchar y,uchar DAT); //-在LCD1602_ disp_ String (uchar x,uchar y,uchar * s)上显示字符无效的LCD;//-在LCD1602上显示字符串// void LCD_ check_ Busy(void); //检查忙功能。我没有使用此功能,因为通过率非常低。LCD_ delay_ 10us(uint n); //-一个10微秒的延迟子程序void LCD_ delay_ 50uS(uint n); /-延迟子程序50微秒_ init(无效){LCD_ delay_ 10us(20); LCD_ write_命令(0x38); //-设置8位格式,2行,5x7 LCD_ delay_ 10us(5);LCD_ write_命令(0x0c); //-整体显示,关闭光标,不闪烁LCD_ delay_ 10us(5);LCD_ write_命令(0x06); //-设置输入模式,增量不移位LCD_ delay_ 10us(5);LCD_ write_命令(0x01); // /-清除屏幕上的LCD_ delay_ 50uS(40);} //将无效的LCD指令写入LCD1602_ write_命令(uchar dat){LCD_ delay_ 10us (5);LCD_ Rs = 0; //命令LCD_RW = 0;//写入LCD_ DB = dat; LCD_ delay_ 10us(5); LCD_ E = 1; //允许LCD_delay_10us(5);LCD_ E = 0;} /-将数据无效LCD写入LCD1602_ write_ data(uchar dat){LCD_ delay_ 10us(5);LCD_ Rs = 1; //数据LCD_RW = 0;//写入LCD_ DB = dat; LCD_ delay_ 10us(5); LCD_ E = 1; //允许LCD_delay_10us(5);LCD_ E = 0;} /-

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

ISD4004语音芯片的工作原理及智能控制

ISD4004语音芯片的工作原理及智能控制系统中的应用 作者:北方工业大学工学院张常年王振红李洋来源:《国外电子元器件》 摘要:ISD4044是一种采用ChipCorder专利技术的语音芯片。此芯片无须A/D转换和压缩就可以直接储存,没有A/D转换误差,在一个记录位(BIT)可存储250级声音信号,相当于通常的A/D记录的8倍。片内集成了晶体振荡器、麦克前置放大器、自动增益控制等,只要很少的外围器件,就可以构成个完整声音录放系统。本文介绍了ISD4004的原理、特点、功能及其在智能控制系统中的应用。 关键词:ISD4004 单片机 89C51 1 概述 ISD4004是美国ISD公司制造的一种新款语音芯片。与ISD其它系列语音产品不同的是,ISD4004是一种微控制器“从”设备,而“主”控制器可以是内置有SPI兼容接口的微控制器,也可以用I/O仿真SPI 通信协议。ISD4004系列工作电压为3V,单片录放时间为8~16分钟,音质好,适用于移动电话及其它便携式电子产品中。该芯片采用CMOS技术,内含振荡器、抗混叠滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列。芯片的所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI或Microwire)送入。ISD4004采用多电平直接模拟量存储技术,每个采样值直接存贮在片内闪烁存贮器中,因此能非常真实、自然地再现语音、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和“金属声”。采样频率可为4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存100年(典型值),反复录音10万次。 2 引脚功能描述 ISD4004的引脚排列如图1所示,各引脚功能如下: 电源(VCCA,VCCD):为使噪声最小,芯片的模 拟和数字电路使用不同的电源总线,并且分别引到外封装 的不同管脚小,模拟和数字电源端最好分别走线。尽可能 在靠近供电端处相连,而去耦电容应尽量靠近器件。 地线(VSSA,VSSD):芯片内部的模拟和数字电路 也使用不同的地线。 同相模拟输入(ANA IN+):录音信号的同相输入 端。输入放大器可用单端或差分驱动。单端输入时,信号 由耦合电容输入,最大幅度为峰峰值32mV,耦合电容和 本端的3k?电阻输入阻抗决定了芯片频带的低端截止频 率。差分驱动时,信号最大幅度为峰峰值16mV,与 ISD33000系列相同。 反相模拟输入(ANA IN-):差分驱动时,为录音信 号的反相输入端。信号通过耦合电容输入,最大幅度为峰 峰值16mV。

相关文档