当前位置:文档之家› 基于51单片机控制的ISD4004语音模块引脚电平触发发音程序

基于51单片机控制的ISD4004语音模块引脚电平触发发音程序

基于51单片机控制的ISD4004语音模块引脚电平触发发音程序
基于51单片机控制的ISD4004语音模块引脚电平触发发音程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

//录音和放音键IO口定义:

sbit AN=P2^6;//放音键控制接口

sbit set_key=P2^7;//录音键控制口

// ISD4004控制口定义:

sbit SS =P1^0; //4004片选

sbit MOSI=P1^1; //4004数据输入

sbit MISO=P1^2; //4004数据输出

sbit SCLK=P1^3; //ISD4004时钟

sbit INT =P1^4; //4004中断

sbit STOP=P3^4; //4004复位

sbit LED1 =P1^6; //录音指示灯

//===============================LCD1602接口定义===================== /*注意,P2.2到P2.4需要接上拉电阻

---------------------------------------------------

=============================================================*/

#define LCM_Data P0 //LCD1602数据接口

sbit LCM_RW = P2^3; //读写控制输入端,LCD1602的第五脚

sbit LCM_RS = P2^4; //寄存器选择输入端,LCD1602的第四脚

sbit LCM_E = P2^2; //使能信号输入端,LCD1602的第6脚

//***************函数声明************************************************

void WriteDataLCM(uchar WDLCM);//LCD模块写数据

void WriteCommandLCM(uchar WCLCM,BuysC); //LCD模块写指令

uchar ReadStatusLCM(void);//读LCD模块的忙标

void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符

void LCMInit(void);

void DelayUs(uint us); //微妙延时程序

void DelayMs(uint Ms);//毫秒延时程序

void init_t0();//定时器0初始化函数

void setkey_treat(void);//录音键处理程序

void upkey_treat(void);//播放键处理程序

void display();//显示处理程序

void isd_setrec(uchar adl,uchar adh);//发送setrec指令

void isd_rec();//发送rec指令

void isd_stop();//stop指令(停止当前操作)

void isd_powerup();//发送上电指令

void isd_stopwrdn();//发送掉电指令

void isd_send(uchar isdx);//spi串行发送子程序,8位数据

void isd_setplay(uchar adl,uchar adh);

void isd_play();

//程序中的一些常量定义

uint time_total,st_add,end_add=0;

uint adds[25];//25段语音的起始地址暂存

uint adde[25];//25段语音的结束地址暂时

uchar t0_crycle,count,count_flag,flag2,flag3,flag4;

uchar second_count=170,msecond_count=0;

//second_count为芯片录音的起始地址,起始地址本来是A0,也就是160,

//我们从170开始录音吧。

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

/*==================================================================== =======

主程序

====================================================================== =======*/

////////////////////////////////////////////////

sbit K0 = P2^0; //

sbit K1 = P2^1; //

sbit K2 = P2^5; //

sbit K3 = P3^0; //

sbit K4 = P3^1; //

sbit K5 = P3^2; //

sbit K6 = P3^3; //

sbit K7 = P3^5; //

sbit K8 = P3^6; //

sbit K9 = P3^7; //

////////////////////////////////////////////////

void main(void)

{

LED1=0;//灭录音指示灯

flag3=0;

flag4=0;

time_total=340;//录音地址从170开始,对应的单片机开始计时的时间就是340*0.1秒adds[0]=170;

count=0;

LCMInit(); //1602初始化

init_t0();//定时器初始化

DisplayOneChar( 0,5,'I'); //开机时显示000 ISD4004-X

DisplayOneChar( 0,6,'S');

DisplayOneChar( 0,7,'D');

DisplayOneChar( 0,8,'4');

DisplayOneChar( 0,9,'0');

DisplayOneChar( 0,10,'0');

DisplayOneChar( 0,11,'4');

DisplayOneChar( 0,12,'-');

DisplayOneChar( 0,13,'X');

//////////////////////////////////////////////////

K0 = P2^0; //

K1 = P2^1; //

K2 = P2^5; //

K3 = P3^0; //

K4 = P3^1; //

K5 = P3^2; //

K6 = P3^3; //

K7 = P3^5; //

K8 = P3^6; //

K9 = P3^7; //

////////////////////////////////////////////////

while(1)

{

display();//显示处理

/////////////////////////////////////////////

if(K0==0)

//你

{ st_add=0x0170;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号INT =P1^4

isd_stop(); //放音完毕,发送stop指令

}

if(K1==0) //好

{ st_add=0x0181;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号

isd_stop(); //放音完毕,发送stop指令

}

if(K2==0) //对不起

{ st_add=0x0194;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号

isd_stop(); //放音完毕,发送stop指令

}

if(K3==0) //谢谢

{ st_add=0x0211;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号

isd_stop(); //放音完毕,发送stop指令

}

if(K4==0) //没关系

{ st_add=0x0225;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号

isd_stop(); //放音完毕,发送stop指令

}

if(K5==0) //什么

{ st_add=0x0240;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号

isd_stop(); //放音完毕,发送stop指令

}

if(K6==0) //真

{ st_add=0x0254;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号INT =P1^4

isd_stop(); //放音完毕,发送stop指令

}

if(K7==0) //克服

{ st_add=0x0267;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号INT =P1^4

isd_stop(); //放音完毕,发送stop指令

}

if(K8==0) //叫

{ st_add=0x0281;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号INT =P1^4

isd_stop(); //放音完毕,发送stop指令

}

if(K9==0) //早上

{ st_add=0x0293;

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号INT =P1^4

isd_stop(); //放音完毕,发送stop指令

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////

//upkey_treat();//放音键处理

// setkey_treat();//录音键处理

}

}

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

//录音键处理程序

//从指定地址开始录音的程序就是在这段里面

void setkey_treat(void)

{

set_key=1;//置IO口为1,准备读入数据

DelayUs(1);

if(set_key==0)

{

if(flag3==0)//录音键和放音键互锁,录音好后,禁止再次录音。如果要再次录音,那就要复位单片机,重新开始录音

{

if(count==0)//判断是否为上电或复位以来第一次按录音键

{

st_add=170;

}

else

{

st_add=end_add+3;

}//每段语言间隔3个地址

adds[count]=st_add;//每段语音的起始地址暂时

if(count>=25)//判断语音段数时候超过25段,因为单片机内存的关系?

//本程序只录音25段,如果要录更多的语音,改为不可查询的即可

{//如果超过25段,则覆盖之前的语音,从新开始录音

count=0;

st_add=170;

time_total=340;

}

isd_powerup(); //AN键按下,ISD上电并延迟50ms

isd_stopwrdn();

isd_powerup();

LED1=1;//录音指示灯亮,表示录音模式

isd_setrec(st_add&0x00ff,st_add>>8); //从指定的地址

if(INT==1)// 判定芯片有没有溢出

{

isd_rec(); //发送录音指令

}

time_total=st_add*2;//计时初始值计算

TR0=1;//开计时器

while(set_key==0);//等待本次录音结束

TR0=0;//录音结束后停止计时

isd_stop(); //发送4004停止命令

end_add=time_total/2+2;//计算语音的结束地址

adde[count]=end_add;//本段语音结束地址暂存

LED1=0; //录音完毕,LED熄灭

count++;//录音段数自加

count_flag=count;//录音段数寄存

flag2=1;

flag4=1;//解锁放音键

}

}

}

//=================================================

//放音机处理程序

//从指定地址开始放本段语音就是这段程序

void upkey_treat(void)

{

//uchar ovflog;

AN=1;//准备读入数据

DelayUs(1);

if(AN==0)//判断放音键是否动作

{

if(flag4==1)//互锁录音键

{

//if(flag2==1)//判断是否为录音好后的第一次放音

//{

count=0;//从第0段开始播放

//}

/////////////////////////////////////////

// count=0;//从第0段开始播放

/////////////////////////////////////////

isd_powerup(); //AN键按下,ISD上电并延迟50ms

isd_stopwrdn();

isd_powerup();

///////////////////////////////////////////////////

//count=0;

///////////////////////////////////////////////////

st_add=adds[count];//送当前语音的起始地址

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音

isd_play(); //发送放音指令

DelayUs(20);

while(INT==1); //等待放音完毕的EOM中断信号

isd_stop(); //放音完毕,发送stop指令

while(AN==0); //

isd_stop();

count++;//语音段数自加

flag2=0;

flag3=1;

if(count>=count_flag)//如果播放到最后一段后还按加键,则从第一段重新播放

{

count=0;

}

}

}

}

//************************************************?

//发送rec指令

void isd_rec()

{

isd_send(0xb0);

SS=1;

}

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

//发送setrec指令

void isd_setrec(unsigned char adl,unsigned char adh)

{

DelayMs(1);

isd_send(adl); //发送放音起始地址低位

DelayUs(2);

isd_send(adh); //发送放音起始地址高位

DelayUs(2);

isd_send(0xa0); //发送setplay指令字节

SS=1;

}

//===================================================================== ========

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

//定时器0中断程序

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0_crycle++;

if(t0_crycle==2)// 0.1秒

{

t0_crycle=0;

time_total++;

msecond_count++;

if(msecond_count==10)//1秒

{

msecond_count=0;

second_count++;

if(second_count==60)

{

second_count=0;

}

}

if(time_total==4800)time_total=0;

}

}

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

//定时器0初始化函数

void init_t0()

{

TMOD=0x01;//设定定时器工作方式1,定时器定时50毫秒

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;//开总中断

ET0=1;//允许定时器0中断

t0_crycle=0;//定时器中断次数计数单元

}

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

//显示处理程序

void display()

{

uchar x;

if(flag3==1||flag4==1)//判断是否有录音过或者放音过

{

x=count-1;

if(x==255){x=count_flag-1;}

}

DisplayOneChar( 0,0,x/100+0x30); //显示当前语音是第几段

DisplayOneChar( 0,1,x/10%10+0x30);

DisplayOneChar( 0,2,x%10+0x30);

if(flag3==0)//录音时显示本段语音的起始和结束地址

{

DisplayOneChar( 1,0,st_add/1000+0x30);//计算并显示千位

DisplayOneChar( 1,1,st_add/100%10+0x30);

DisplayOneChar( 1,2,st_add/10%10+0x30);

DisplayOneChar( 1,3,st_add%10+0x30);

DisplayOneChar( 1,4,'-');

DisplayOneChar( 1,5,'-');

DisplayOneChar( 1,6,end_add/1000+0x30);

DisplayOneChar( 1,7,end_add/100%10+0x30);

DisplayOneChar( 1,8,end_add/10%10+0x30);

DisplayOneChar( 1,9,end_add%10+0x30);

}

if(flag4==1)//放音时显示本段语音的起始和结束地址

{

DisplayOneChar( 1,0,adds[x]/1000+0x30);

DisplayOneChar( 1,1,adds[x]/100%10+0x30);

DisplayOneChar( 1,2,adds[x]/10%10+0x30);

DisplayOneChar( 1,3,adds[x]%10+0x30);

DisplayOneChar( 1,4,'-');

DisplayOneChar( 1,5,'-');

DisplayOneChar( 1,6,adde[x]/1000+0x30);

DisplayOneChar( 1,7,adde[x]/100%10+0x30);

DisplayOneChar( 1,8,adde[x]/10%10+0x30);

DisplayOneChar( 1,9,adde[x]%10+0x30);

}

}

//===================================================================== =

// LCM初始化

//===================================================================== =

void LCMInit(void)

{

LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号

DelayMs(5);

WriteCommandLCM(0x38,0);

DelayMs(5);

WriteCommandLCM(0x38,0);

DelayMs(5);

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示

WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置

WriteCommandLCM(0x0C,1); // 显示开及光标设置

DelayMs(100);

}

//*==================================================================== =

// 写数据函数: E =高脉冲RS=1 RW=0

//===================================================================== =

void WriteDataLCM(uchar WDLCM)

{

ReadStatusLCM(); //检测忙

LCM_Data = WDLCM;

LCM_RS = 1;

LCM_RW = 0;

LCM_E = 0; //若晶振速度太高可以在这后加小的延时

LCM_E = 0; //延时

LCM_E = 1;

}

//*==================================================================== // 写指令函数: E=高脉冲RS=0 RW=0

//=====================================================================

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测

{

if (BuysC) ReadStatusLCM(); //根据需要检测忙

LCM_Data = WCLCM;

LCM_RS = 0;

LCM_RW = 0;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

}

//*==================================================================== // 正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;

// DB7: 0 LCD控制器空闲,1 LCD控制器忙。

// 读状态

//===================================================================== =

unsigned char ReadStatusLCM(void)

{

LCM_Data = 0xFF;

LCM_RS = 0;

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

while (LCM_Data & Busy); //检测忙信号

return(LCM_Data);

}

//===================================================================== =

//功能: 在1602 指定位置显示一个字符:第一行位置0~15,第二行16~31

//说明: 第X 行,第y 列注意:字符串不能长于16个字符

//===================================================================== =

void DisplayOneChar( unsigned char X, unsigned char Y, unsigned char ASCII)

{

X &= 0x1;

Y &= 0xF; //限制Y不能大于15,X不能大于1

if (X) Y |= 0x40; //当要显示第二行时地址码+0x40;

Y |= 0x80; // 算出指令码

WriteCommandLCM(Y, 0); //这里不检测忙信号,发送地址码

WriteDataLCM(ASCII);

}

//=====================================================================

//spi串行发送子程序,8位数据

void isd_send(uchar isdx)

{

uchar isx_counter;

SS=0;//ss=0,打开spi通信端

SCLK=0;

for(isx_counter=0;isx_counter<8;isx_counter++)//先发低位再发高位,依次发送。

{

if((isdx&0x01)==1)

MOSI=1;

else

MOSI=0;

isdx=isdx>>1;

SCLK=1;

DelayUs(2);

SCLK=0;

DelayUs(2);

}

}

//===================================================================== =

//stop指令(停止当前操作)

void isd_stop()//

{

DelayUs(10);

isd_send(0x30);

SS=1;

DelayMs(50);

}

//===================================================================== =

//发送上电指令

void isd_powerup()//

{

DelayUs(10);

SS=0;

isd_send(0x20);

SS=1;

DelayMs(50);

}

//===================================================================== =

//发送掉电指令

void isd_stopwrdn()//

{

DelayUs(10);

isd_send(0x10);

SS=1;

DelayMs(50);

}

void isd_play()//发送play指令

{

isd_send(0xf0);

SS=1;

}

void isd_setplay(uchar adl,uchar adh)//发送setplay指令

{

DelayMs(1);

isd_send(adl); //发送放音起始地址低位

DelayUs(2);

isd_send(adh); //发送放音起始地址高位

DelayUs(2);

isd_send(0xe0); //发送setplay指令字节

SS=1;

}

void DelayUs(uint us)

{

while(us--);

}

//==================================================================== // 设定延时时间:x*1ms

//==================================================================== void DelayMs(uint Ms)

{

uint i,TempCyc;

for(i=0;i

{

TempCyc = 250;

while(TempCyc--);

}

}

单片机引脚说明-按其引脚功能分为四部分叙述这40条引脚的功能

单片机引脚说明-按其引脚功能分为四部分叙述这40条引脚的功能

下面按其引脚功能分为四部分叙述这40条引脚的功能。 1、主电源引脚VCC和VSS VCC——(40脚)接+5V电压;VSS——(20脚)接地。 2、外接晶体引脚XTAL1和XTAL2 XTAL1(19脚)接外部晶体的一个引脚。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。当采用外部振荡器时,对HMOS单片机,此引脚应接地;对CHMOS 单片机,此引脚作为驱动端。 XTAL2(18脚)接外晶体的另一端。在单片机内部,接至上述振荡器的反相放大器的输出端。采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对XHMOS,此引脚应悬浮。 3、控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP ①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。推

荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VCC引脚之间连接一个约10μF 的电容,以保证可靠地复位。 VCC掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。当VCC主电源下掉到低于规定的电平,而VPD在其规定的电压范围(5±0.5V)内,VPD就向内部RAM提供备用电源。 ②ALE/PROG(30脚):当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。因此,它可用作对外输出的时钟,或用于定时目的。然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。 对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。 ③PSEN(29脚):此脚的输出是外部程序存储器的读选通信号。在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效。

STC89C51单片机引脚功能介绍

C51单片机引脚功能介绍 C51单片机引脚功能介绍 单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 ⒈电源: ⑴VCC - 芯片电源,接+5V; ⑵VSS - 接地端; ⒉时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 ⒊控制线:控制线共有4根, ⑴ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ①ALE功能:用来锁存P0口送出的低8位地址新门户 ②PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 ⑵PSEN:外ROM读选通信号。

⑶RST/VPD:复位/备用电源。 ①RST(Reset)功能:复位信号输入端。 ②VPD功能:在Vcc掉电情况下,接备用电源。 ⑷EA/Vpp:内外ROM选择/片内EPROM编程电源。 ①EA功能:内外ROM选择端。 ②Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。 ⒋I/O线 89C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。 1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。 2、振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶体震荡器,连上就能了,按下图1接上即可。 3、复位管脚:按下图1中画法连好。 EA管脚:EA管脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个管脚相连,不然单片机就没法控制它了,单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED和1脚相连。(见图1,其中R1是限流电阻) 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此要1脚我们要能够控制,也就是说,我们要能够让1管脚按要求变为高或低电平。即然要控制1脚,就得给它起个名字,叫它什么名字呢,设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定。 名字有了,要计算机做事,也得要向计算机发命令,计算机能听得懂的命令称之为计算机的指令。让一个管脚输出高电平的指令是SETB,让一个管脚输出低电平的指令是CLR。因此,我们要P1.0输出高电平,只要写SETB P1.0,要P1.0输出低电平,只要写CLR P1.0就能了。但是我们怎样才能计算机执行这条指令呢?要解决这个问题,第一,计算机看不懂SETB CLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计算机去读。计算机只懂一样东西:数字。因此我们得把SETB P1.0变为(D2H,90H ),把CLR P1.0变为(C2H,90H ),至于为什么是这两个数字,这也是由51芯片的设计者--INTEL规定的,我们不去研究。第二步,在得到这两个数字后,还要借助于一个硬件工具"编程器"将这两个数字进入单片机的内部。编程器:就是把你在电脑上写出来的代码用汇编等编译器生成的一个

mcs-51单片机的引脚和输入输出端口

MCS-51单片机的引脚和输入输出端口 MCS-51有4组8位I/O口,共占用32个引脚:P0、P1、P2和P3口,P1、P2和P3为准双向口,P0口则为双向三态输入输出口。 ●P0口(P0.0~P0.7)占用32~39脚; ●P1口(P1.0~P1.7)占用1~8脚; ●P2口(P2.0~P2.7)占用21~28脚; ●P3口(P3.0~P3.7)占用10~17脚; 这四个口的主要功能如下: (1) P0 口是一个8位不带内部上拉电阻的漏极开路型准双向I/O口,因此该口输出时需外接上拉电阻,而P1 、P2 和P3口都是带内部上拉电阻的8位双向I/O口。 (2) 在访问片外ROM时,P0口分时兼作数据总线和低8位地址线;P2口作高位地址线。 (3) 内部带程序存储器的芯片,在EPROM编程和程序验证时,P1输入低8位地址,P2输入高8位地址,P0输入指令代码。(注:P1、P2作输入口时,必须要使每位先置“1”,才能读入外部数据。) (4) P3口除作双向I/0口外还兼有专用功能。 P0口和P2口: 图1为P0口和P2口其中一位的电路图,由图可见,电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,另外还有一个数据输出的驱动和控制电路。这两组口线用来作为CPU与外部数据存储器、外部程序存储器和I/O扩展口,而不能像P1、P3直接用作输出口。它们一起可以作为外部地址总线,P0口身兼两职,既可作为地址总线,也可作为数据总线。 P2口作为外部数据存储器或程序存储器的地址总线的高8位输出口AB8-AB15,P0口由ALE选通作为地址总线的低8位输出口AB0-AB7。外部的程序存储器由PSEN信号选通,数据存储器则由WR和RD读写信号选通,因为216=64k,所以8051最大可外接64kB的程序存储器和数据存储器 P1口:图2为P1口其中一位的电路图,P1口为8位准双向口,每一位均可单独定义为输入或输出口,当作为输入口时,1写入锁存器,Q(非)=0,T2截止,内上拉电阻将电位拉至1,此时该口输出为1,当0写入锁存器,Q(非)=1,T2导通,输出则为0。 作为输入口时,锁存器置1,Q(非)=0,T2截止,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平,正因为这个原因,所以P1口常称为准双向口。需要说明的是,作为输入口使用时,有两种情况,其一是:首先是读锁存器的内容,进行处理后再写到锁存器中,这种操作即读—修改—写操作,像JBC(逻辑判断)、CPL(取反)、INC(递增)、DEC(递减)、ANL(与逻辑)和ORL(逻辑或)指令均属于这类操作。其二是:读P1口线状态时,打开三态门G2,将外部状态读入CPU。 P3口:P3口的电路如图3所示,P3口为准双向口,为适应引脚的第二功能的需要,增加了第二

基于51单片机系统设计

基于51单片机的多路温度采集控制系统设计 言: 随着现代信息技术的飞速发展,温度测量控制系统在工业、农业及人们的日常生活中扮演着一个越来越重要的角色,它对人们的生活具有很大的影响,所以温度采集控制系统的设计与研究有十分重要的意义。 本次设计的目的在于学习基于51单片机的多路温度采集控制系统设计的基本流程。本设计采用单片机作为数据处理与控制单元,为了进行数据处理,单片机控制数字温度传感器,把温度信号通过单总线从数字温度传感器传递到单片机上。单片机数据处理之后,发出控制信息改变报警和控制执行模块的状态,同时将当前温度信息发送到LED进行显示。本系统可以实现多路温度信号采集与显示,可以使用按键来设置温度限定值,通过进行温度数据的运算处理,发出控制信号达到控制蜂鸣器和继电器的目的。 我所采用的控制芯片为AT89c51,此芯片功能较为强大,能够满足设计要求。通过对电路的设计,对芯片的外围扩展,来达到对某一车间温度的控制和调节功能。 关键词:温度多路温度采集驱动电路 正文: 1、温度控制器电路设计 本电路由89C51单片机温度传感器、模数转换器ADC0809、窜入并出移位寄存器74LS164、数码管、和LED显示电路等组成。由热敏电阻温度传感器测量环境温度,将其电压值送入ADC0809的IN0通道进行模数转换,转换所得的数字量由数据端D7-D0输出到89C51的P0口,经软件处理后将测量的温度值经单片机的RXD端窜行输出到74LS164,经74LS164 窜并转换后,输出到数码管的7个显示段,用数字形式显示出当前的温度值。89C51的P2.0、P2.1、P2.2分别接入ADC0809通道地址选择端A、B、C,因此ADC0809的IN0通道的地址为F0FFH。输出驱动控制信号由p1.0输出,4个LED为状态指示,其中,LED1为输出驱动指示,LED2为温度正常指示,LED3为高于上限温度指示,LED4为低于下限温度指示。当温度高于上限温度值时,有p1.0输出驱动信号,驱动外设电路工作,同时LED1亮、LED2灭、LED3亮、LED4灭。外设电路工作后,温度下降,当温度降到正常温度后,LED1亮、LED2亮、LED3灭、LED4灭。温度继续下降,当温度降到下限温度值时,p1.0信号停止输出,外设电路停止工作,同时LED1灭、LED2灭、LED3灭、LED4亮。当外设电路停止工作后,温度开始上升,接着进行下一工作周期。 2、温度控制器程序设计 本软件系统有1个主程序,6个子程序组成。6个子程序为定时/计数器0中断服务程序、温度采集及模数转换子程序ADCON、温度计算子程序CALCU、驱动控制子程序DRVCON、十进制转换子程序METRICCON 及数码管显示子程序DISP。 (1)主程序 主程序进行系统初始化操作,主要是进行定时/计数器的初始化。 (2)定时/计数器0中断服务程序 应用定时计数器0中断的目的是进行定时采样,消除数码管温度显示的闪烁现象,用户可以根据实际环境温度变化率进行采样时间调整。每当定时时间到,调用温度采集机模数转换子程序ADCON,得到一个温度样本,并将其转换为数字量,传送给89C51单片机,然后在调用温度计算子程序CALCU,驱动控制子程序DRVCON,十进制转换子程序MERTRICCON,温度数码显示子程序DISP。

80C51单片机引脚图及引脚功能介绍

80C51单片机引脚图及引脚功能介绍 首先我们来介绍一下单片机的引脚图及引脚功能(如下图所示),引脚的具体功能将在下面详细介绍 单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 ⒈ 电源: ⑴ VCC - 芯片电源,接+5V; ⑵ VSS - 接地端; ⒉ 时钟:

XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 ⒊ 控制线:控制线共有4根, ⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ① ALE功能:用来锁存P0口送出的低8位地址 ② PROG功能:片内有EPROM的芯片,在EPROM 编程期间,此引脚输入编程脉冲。 ⑵ PSEN:外ROM读选通信号。 ⑶ RST/VPD:复位/备用电源。 ① RST(Reset)功能:复位信号输入端。 ② VPD功能:在Vcc掉电情况下,接备用电源。 ⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。 ① EA功能:内外ROM选择端。 ② Vpp功能:片内有EPROM的芯片,在EPROM 编程期间,施加编程电源Vpp。 ⒋ I/O线

80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。 P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。 拿到一块单片机,想要使用它,首先必须要知道怎样去连线,我们用的一块89C51的芯片为例,我们就看一下如何给它连线。 1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。 2、振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶体震荡器,电容,连上就能了,按图1接上即可。 3、复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。 4、 EA管脚:EA管脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。

(完整word版)基于51单片机的温度控制系统设计

基于51单片机的水温自动控制系统 0 引言 在现代的各种工业生产中 ,很多地方都需要用到温度控制系统。而智能化的控制系统成为一种发展的趋势。本文所阐述的就是一种基于89C51单片机的温度控制系统。本温控系统可应用于温度范围30℃到96℃。 1 设计任务、要求和技术指标 1.1任务 设计并制作一水温自动控制系统,可以在一定范围(30℃到96℃)内自动调节温度,使水温保持在一定的范围(30℃到96℃)内。 1.2要求 (1)利用模拟温度传感器检测温度,要求检测电路尽可能简单。 (2)当液位低于某一值时,停止加热。 (3)用AD转换器把采集到的模拟温度值送入单片机。 (4)无竞争-冒险,无抖动。 1.3技术指标 (1)温度显示误差不超过1℃。 (2)温度显示范围为0℃—99℃。 (3)程序部分用PID算法实现温度自动控制。 (4)检测信号为电压信号。 2 方案分析与论证 2.1主控系统分析与论证 根据设计要求和所学的专业知识,采用AT89C51为本系统的核心控制器件。AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器。其引脚图如图1所示。 2.2显示系统分析与论证 显示模块主要用于显示时间,由于显示范围为0~99℃,因此可采用两个共阴的数码管作为显示元件。在显示驱动电路中拟订了两种设计方案: 方案一:采用静态显示的方案 采用三片移位寄存器74LS164作为显示电路,其优点在于占用主控系统的I/O口少,编程简单且静态显示的内容无闪烁,但电路消耗的电流较大。 方案二:采用动态显示的方案 由单片机的I/O口直接带数码管实现动态显示,占用资源少,动态控制节省了驱动芯片的成本,节省了电 ,但编程比较复杂,亮度不如静态的好。 由于对电路的功耗要求不大,因此就在尽量节省I/O口线的前提下选用方案一的静态显示。

单片机各个引脚功能概述

单片机引脚,单片机引脚是什么意思 8051单片机引脚功能介绍 首先我们来连接一下单片机的引脚图,如果,具体功能在下面都有介绍。 单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 ⒈ 电源: ⑴ VCC - 芯片电源,接+5V; ⑵ VSS - 接地端; ⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 ⒊ 控制线:控制线共有4根, ⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ① ALE功能:用来锁存P0口送出的低8位地址 ② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 ⑵ PSEN:外ROM读选通信号。 ⑶ RST/VPD:复位/备用电源。 ① RST(Reset)功能:复位信号输入端。 ② VPD功能:在Vcc掉电情况下,接备用电源。 ⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。 ① EA功能:内外ROM选择端。 ② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。 ⒋ I/O线 80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。

〈51单片机引脚图及引脚功能〉 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。 1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。 2、振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶体震荡器,电容,连上就能了,按图1接上即可。 3、复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。 4、 EA管脚:EA管脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED和1脚相连。(见图1,其中R1是限流电阻) 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED 才发亮。因此要1脚我们要能够控制,也就是说,我们要能够让1管脚按要求变为高或低电平。即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不能由我们来更改。

基于51单片机的交通灯控制系统设计

目录 一引言 (2) 二概要设计 (2) 2.1 设计思路 (2) 2.2总体设计框图 (2) 三硬件设计 (3) 3.1LED循环电路设计 (3) 3.1.1 89cs51单片机概述 (3) 3.1.2 LED循环说明 (5) 3.2 倒计时显示电路 (5) 3.2.1 74LS164芯片 (5) 3.2.2 共阴极数码显示管 (6) 3.2.3 倒计时电路 (6) 3.2.4 急通车电路 (7) 四软件按设计 (7) 4.1 程序流程图: (7) 4.2 LED红绿灯显示 (8) 4.3倒计时显示 (9) 4.4 急通车控制 (9) 4.5程序代码 (9) 五总结 (9) 参考文献 (9) 附录一: (9) 附录二: (10)

基于51单片机的交通灯控制系统设计 摘要:在日常生活中,交通信号灯的使用,市交通得以有效管理,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。交通灯控制系统由80C51单片机、键盘、LED 显示、交通灯延时组成。系统除具有基本交通灯功能外,还具有时间设置、LED信息显示功能,市交通实现有效控制。 关键词:交通灯,单片机,自动控制 一引言 当今,红绿灯安装在个个道口上,已经成为疏导交通车辆最常见和最有效的手段。但这个技术在19世纪就已经出现了。 1858年,在英国伦敦主要街头安装了以燃煤气为光源的红、蓝两色的机械般手势信号灯,用以指挥马车通行。这是世界上最早的交通信号灯。1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的会议大厦前的广场上,安装了世界上最早的煤气红绿灯。它由红绿两以旋转方式玻璃提灯组成,红色表示“停止”,绿色表示“注意”。1869年1月2日,煤气灯爆炸,是警察受伤,遂被取消! 电气启动的红绿灯出现在美国,这种红绿灯由红黄绿三色圆形的投光器组成,1914年始装于纽约市5号大街的一座高塔上。红灯亮表示“停止”,绿灯亮表示“通行”。 信号灯的出现,使得交通得以有效的管理,对于疏导交通流量、提高道路通行能力、减少交通事故有明显效果。1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。绿灯时通行信号灯,面对绿灯的车辆可以直行,左转弯和右转弯,除非两一种标志禁止某一种转向。左右转弯车辆必需让合法的正在路口内行驶的车辆和过人行横线的行人优先通行。红灯是禁行信号灯,面对红灯的车辆必需在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已经十分接近停车线而不能安全停车的可以进入交叉路口! 二概要设计 2.1 设计思路 利用单片机实现交通灯的控制,该任务分以下几个方面: a 实现红、绿、黄灯的循环控制。要实现此功能需要表示三种不同颜色的LED灯分别接在P1个管脚,用软件实现。 b 用数码管显示倒计时。可以利用动态显示或静态显示,串行并出或者并行并出实现。 C 实现急通车。这需要人工实现,编程时利用到中断才能带到目的,只要有按钮按下,那么四个方向全部显示红灯,禁止以诶车辆通行。当情况解除,让时间回到只能隔断处继续进行。 2.2总体设计框图 见图一:

51单片机主要引脚功能

51单片机主要引脚功能 XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。 RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。 VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V 电源的正负端。 P0~P3 为可编程通用I/O 脚,其功能用途由软件定义 P0 口:P0 口是一组8 位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8 个TTL 逻辑门电路,对端口P0 写1 时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。 P1 口:P1 是一个带内部上拉电阻的8 位双向I/O 口,P1 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口写1,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在 上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。 P2 口:P2 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口P2 写1,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内 部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。 P3 口:P3 口是一组带有内部上拉电阻的8 位双向I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对P3 口写入1 时,它

基于51单片机的温度控制系统的设计

基于单片机的温度控制系统设计 1.设计要求 要求设计一个温度测量系统,在超过限制值的时候能进行声光报警。具体设计要求如下: ①数码管或液晶显示屏显示室内当前的温度; ②在不超过最高温度的情况下,能够通过按键设置想要的温度并显示;设有四个按键,分别是设置键、加1键、减1键和启动/复位键; ③DS18B20温度采集; ④超过设置值的±5℃时发出超限报警,采用声光报警,上限报警用红灯指示,下限报警用黄灯指示,正常用绿灯指示。 2.方案论证 根据设计要求,本次设计是基于单片机的课程设计,由于实现功能比较简单,我们学习中接触到的51系列单片机完全可以实现上述功能,因此可以选用AT89C51单片机。温度采集直接可以用设计要求中所要求的DS18B20。报警和指示模块中,可以选用3种不同颜色的LED灯作为指示灯,报警鸣笛采用蜂鸣器。显示模块有两种方案可供选择。 方案一:使用LED数码管显示采集温度和设定温度; 方案二:使用LCD液晶显示屏来显示采集温度和设定温度。 LED数码管结构简单,使用方便,但在使用时,若用动态显示则需要不断更改位选和段选信号,且显示时数码管不断闪动,使人眼容易疲劳;若采用静态显示则又需要更多硬件支持。LCD显示屏可识别性较好,背光亮度可调,而且比LED 数码管显示更多字符,但是编程要求比LED数码管要高。综合考虑之后,我选用了LCD显示屏作为温度显示器件,由于显示字符多,在进行上下限警戒值设定时同样可以采集并显示当前温度,可以直观的看到实际温度与警戒温度的对比。LCD 显示模块可以选用RT1602C。

3.硬件设计 根据设计要求,硬件系统主要包含6个部分,即单片机时钟电路、复位电路、键盘接口模块、温度采集模块、LCD 显示模块、报警与指示模块。其相互联系如下图1所示: 图1 硬件电路设计框图 单片机时钟电路 形成单片机时钟信号的方式有内部时钟方式和外部时钟方式。本次设计采用内部时钟方式,如图2所示。 单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为此放大器的输入端和输出端,其频率范围为~12MHz ,经由片外晶体振荡器或陶瓷振荡器与两个匹配电容一 起形成了一个自激振荡电路,为单片机提供时钟源。 复位电路 复位是单片机的初始化操作,其作用是使CPU 和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作,以防止电源系统不稳定造成CPU 工作不正常。在系统中,有时会出现工作不正常的情况,为了从异常状态中恢复,同时也为了系统调试方便,需要设计一个复位电路。 单片机的复位电路有上电复位和按键复位两种形式,因为本次设计要求需要有启动/复位键,因此本次设计采用按键复位,如图3。复位电路主要完成系统 图2 单片机内部时钟方式电路 图3 单片机按键复位电路

51单片机读引脚及读锁存器

51单片机I/O引脚IO口工作原理 一、P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。 下面,我们先就组成P0口的每个单元部份跟大家介绍一下: 先看输入缓冲器:在P0口中,有两个三态的缓冲器,在学数字电路时,我们已知道,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),大家看上图,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为…读锁存器?端)有效。下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为…读引脚?的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。 D锁存器:构成一个锁存器,通常要用一个时序电路,时序的单元电路在学数字电路时我们已知道,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O 口线中都是用一个D触发器来构成锁存器的。大家看上图中的D锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。 对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。如果时序控制端CP的时序脉冲一旦到了,这时D端输入的数据就会传输到Q及Q非端。数据传送过来后,当CP时序控制端的时序信号消失了,这时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来了)。如果下一个时序控制脉冲信号来了,这时D端的数据才再次传送到Q端,从而改变Q端的状态。 多路开关:在51单片机中,当内部的存储器够用(也就是不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器)时,P0口可以作为通用的输入输出端口(即I/O)使用,对于8031(内部没有ROM)的单片机或者编写的程序超过了单片机内部的存储器容

完整版单片机控制系统的设计

学号 07437230 常州大学 硬件实习报告 题目:步进电机单片机控制系统的设计 学生: 学院(系):专业班级: 指导教师: 通信(怀)081单片机原理与应用实习任务书 一、设计题目 步进电机单片机控制系统的设计 二、设计背景 步进电机是工业过程控制及仪表中的主要控制元件之一。它可以在机械结构中把丝杆的角度变成直线位移,也可以用它带动螺旋电位

通信工程系指导教师:孙守昌1、前言 1.1课题的背景、目的和意义 1.1.1课题设计的背景:

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机也是工业过程控制及仪表中的主要控制元件之一。它可以在机械结构中把丝杆的角度变成直线位移,也可以用它带动螺旋电位器,调节电压和电流,从而实现对执行机构的控制。在数字控制系统中,由于它可以直接接收计算机输出的数字信号,而不需要进行D/A转换,所以使用起来十分方便。步进电机具有快速的启停能力和精度高的显著特点,在定位场合得到了广泛应用。 1.1.2 课题设计的目的: (1)了解步进电机的结构和工作原理。 (2)掌握步进电机控制系统的设计方法及其调试技术。 (3)能够使用电路仿真软件进行电路调试。步进电机驱动控制系统设计内容 1.1.3 课题设计的意义: 随着工业自动化的发展,步进电机的应用越来越广泛。步进电机是用脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的微电动机,它最突出的优点是可以在宽阔的频率来实现调速,快速起停,正转反转控制及制动等,并且用其组成的开环系统既简单,廉价,又非常可行,因此在打印机等办公自动化设备以及各种控制装备等多领域有着极其广泛的应用。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,研制步进电机驱动器具有十分重要的意义。 1.1.4课题的现状与发展趋势 步进电动机又称脉冲电动机或阶跃电动机,国外一般称为Stepping moter,pulse motor或Stepper servo,其应用发展已有80年的历史。正是由于步进电机具有突出的优点,所以成了机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展。步进电机的需求量与日俱增,在各个国民经济领域都有应用。比如在数控系统中就得到了广泛应用。目前世界各国都在大力发展数控技术,我国的数控系统也取得了很大发展,我国已经能够自行研制开发适合我国数控机床发展需要的各种档次的数控系统。

80C51单片机的引脚功能

1.1 80C51单片机的引脚功能 80C51系列中,用CHMOS工艺制造的单片机都采用双列直插式(DIP)40脚封装,引脚信号完全相同。图2-9为引脚图,这40根引脚大致可分为:电源(V CC、V SS、V PP、V PD)、时钟(XTAL1、XTAL2)、I/O口(P0~P3)、地址总线(P0口、P2口)和控制总线(ALE、RST、、、)等几部分。它们的功能简述如下: 1.电源 Vcc(引脚号40),芯片电源,接+5V;Vss(引脚号20),电源接地端。 2.时钟 XTAL1(引脚号18)内部振荡电路反相放大器的输入端,是外接晶振的一个引脚。当采用外部振荡器时,此引脚接地。 XTAL2(引脚号19)内部振荡器的反相放大器输出端,是外接晶振的另一端。当采用外部振荡器时,此引脚接外部振荡源。 3.控制总线 (1)ALE/(引脚号30):正常操作时为ALE功能(允许地址锁存),用来把地址的低字节锁存到外部锁存器。ALE引脚以不变的频率(振荡器频率的 1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟信号或用于定时。但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲。ALE端可以驱动(吸收或输出电流)8个LSTTL电路。在8751单片机EPROM编程期间,此 引脚接编程脉冲(功能)。 (2)(引脚号29):外部程序存储器读选通信号。在从外部程序存储器取指令(或数据)期间,在每个机器周期内两次有效。可以驱动8个LSTTL电路。 (3)RST/VPD(引脚号9):复位信号输入端。振荡器工作时,该引脚上持续2个机器周期的高电平可实现复位操作。此引脚还可接上备用电源。在Vcc掉电期间,由向内部RAM提供电源,以保持内部RAM中的数据。 (4)/Vpp(引脚号31):为内部程序存储器和外部程序存储器的选择端。当为高电平时,访问内部程序存储器(PC值小于4K);当为低电平时,访问外部程序存储器。对于87C51单片机,在EPROM编程期间,此端为21V编程电源输入端。

at89c51引脚图及功能

at89c51引脚图及功能 AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。 主要性能参数: ·与MCS-51产品指令系统完全兼容·4k字节可重擦写Flash闪速存储器·1000次擦写周期 ·全静态操作:0Hz-24MHz ·三级加密程序存储器·128×8字节内部RAM ·32个可编程I/O口线·2个16位定时/计数器·6个中断源 ·可编程串行UART通道·低功耗空闲和掉电模式 功能特性概述: AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 ·P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。 在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。 在FIash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。 ·P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱

51单片机引脚介绍

51单片机引脚功能介绍 引脚大全 51单片机引脚功能: MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图: l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。 这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,对于初学者来说很难理解的,我这里都是按我自已的表达方式来写的,相信你也能够理解的。 P0口有三个功能: 1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口) 2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口) 3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。 P1口只做I/O口使用:其内部有上拉电阻。 P2口有两个功能: 1、扩展外部存储器时,当作地址总线使用 2、做一般I/O口使用,其内部有上拉电阻; P3口有两个功能: 除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。

有内部EPROM的单片机芯片(例如8751),为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚的形式提供的, 即:编程脉冲:30脚(ALE/PROG) 编程电压(25V):31脚(EA/Vpp) 接触过工业设备的兄弟可能会看到有些印刷线路板上会有一个电池,这个电池是干什么用的呢?这就是单片机的备用电源,当外接电源下降到下限值时,备用电源就会经第二功能的方式由第9脚(即RST/VPD)引入,以保护内部RAM中的信息不会丢失。 在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。 ALE 地址锁存控制信号:在系统扩展时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。参见图2(8051扩展2KB EEPROM电路,在图中ALE与4LS373锁存器的G相连接,当CPU对外部进行存取时,用以锁住地址的低位地址,即P0口输出。 由于ALE是以晶振六分之一的固定频率输出的正脉冲,当系统中未使用外部存储器时,ALE脚也会有六分之一的固定频率输出,因此可作为外部时钟或外部定时脉冲使用。 PSEN 外部程序存储器读选通信号:在读外部ROM时PSEN低电平有效,以实现外部ROM单元的读操作。 1、内部ROM读取时,PSEN不动作; 2、外部ROM读取时,在每个机器周期会动作两次; 3、外部RAM读取时,两个PSEN脉冲被跳过不会输出; 4、外接ROM时,与ROM的OE脚相接。 参见图2—(8051扩展2KB EEPROM电路,在图中PSEN与扩展ROM的OE脚相接) EA/VPP 访问和序存储器控制信号 1、接高电平时: CPU读取内部程序存储器(ROM) 扩展外部ROM:当读取内部程序存储器超过0FFFH(8051)1FFFH(8052)时自动读取外部ROM。

基于51单片机的云台控制系统设计

李建:基于单片机的云台控制系统设计 ABSTRACT This paper design a Yuntai control system using AT89C52 MCU based on analysis of the Yuntai of the structure and it's control requirements. And the same time realize communication of computer through serial communication of RS-485 bus. MCU control module, keyboard module, motor driver module and remote control module comprise the control system. And complete the corresponding software design, testing and simulation. Key word: A T89C52; Yuntai control; Stepper motor; Simulation ;Serial communication 目录 摘要........................................................................................... 错误!未定义书签。ABSTRACT ................................................................................................................... I 第1章引言 (1) 1.1 云台 (1) 1.2 单片机 (1) 1.3 本设计完成的任务 (2) 第2章云台 (3) 2.1 云台概述 (3) 2.1.1 云台内部结构 (3) 2.1.2云台的性能指标 (3) 2.1.3云台电机 (5) 2.2 步进电机 (6) 2.2.1步进电机的工作原理 (6) 2.2.2 步进电机主要技术指标 (8) 第3章总体方案 (10) 3.1云台控制系统简析 (10) 3.2控制系统实现 (10)

51单片机的引脚

当我们拿到一块单片机芯片时,看到这么多的“大腿”,他们都有干什么用的?在这节课我们就针对这个问题进行讲解。 引脚功能: MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图: l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。 这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,初学者很难理解,这里都是按我自已的表达方式来写的,相信你也能够理解。 P0口有三个功能: 1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口) 2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口) 3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。

P1口只做I/O口使用:其内部有上拉电阻。 P2口有两个功能: 1、扩展外部存储器时,当作地址总线使用 2、做一般I/O口使用,其内部有上拉电阻; P3口有两个功能: 除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。 有内部EPROM的单片机芯片(例如8751),为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚的形式提供的, 即:编程脉冲:30脚(ALE/PROG) 编程电压(25V):31脚(EA/Vpp) 接触过工业设备的兄弟可能会看到有些印刷线路板上会有一个电池,这个电池是干什么用的呢?这就是单片机的备用电源,当外接电源下降到下限值时,备用电源就会经第二功能的方式由第9脚(即RST/VPD)引入,以保护内部RAM中的信息不会丢失。 (注:这些引脚的功能应用,除9脚的第二功能外,在“新动力2004版”学习套件中都有应用到。) 在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。 ALE/PROG 地址锁存控制信号:在系统扩展时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。(在后面关于扩展的课程中我们就会看到8051扩展 EEPROM电路,在图中ALE与74LS373锁存器的G相连接,当CPU对外部进行存取时,用以锁住地址的低位地址,即P0口输出。ALE有可能是高电平也有可能是低电平,当ALE是高电平时,允许地址锁存信号,当访问外部存储器时,A

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