单片机多串口扩展

单片机多串口扩展
单片机多串口扩展

单片机多串口扩展

07计本三班

汪庆

0704013005

设计要求:选定具体单片机,利用IO口模拟单片机的串口时序,该软串口具有修改波特率、设定串口通信数据格式等功能,对外提供串口电平。

报告要求:选定单片机和所有器件具体型号,报告需有设计过程、原理图、程序流程图和源程序。

功能分析: 针对大多数单片机都只有一个串口的局限,在多数情况下限制它们的应用。利用单片机串口扩展技术,以MCS51 系列单片机8751 为例进行串行接口扩展,包括扩展两个独立的串口、一点对多点分时串口、单片机与RS232/ RS422/RS485 的串行通信接口。实际应用证明,设计可靠, 稳定性好。用多种方法进行串口扩展, 解决了单片机在串行通信系统中的串口局限问题。

关键词: 单片机; 串行接口; 串口扩展; 串行通信

引言

随着单片机技术的不断发展, 特别是网络技术在测控领域的广泛应用, 由单片机构成的多机网络测控系统已成为单片机技术发展的一个方向。单片机的应用已不仅仅局限于传统意义上的自动监测或控制[ 1 ],而形成了向以网络为核心的分布式多点系统发展的趋势[ 2 ] 。大多数单片机都只有一个串行接口, 在多数情况下限制了这些单片机的进一步应用。要实现单片机在应用系统中的有效通信, 就必须利用单片机的串口扩展技术对单片机进行串口扩展。单片机串口扩展是根据应用系统设计的需要, 把一个串口扩展为多个同类型的串口或一个串口扩展为多个不同类型( RS232/ RS422/ RS458) 的串口,或扩展两个独立的串口, 以便与不同接口的计算机或设备进行串行通信。

1 单片机串口扩展的硬件总体设计

单片机与PC 机或外设的串行通信一般采用RS232/RS422/ RS485 总线标准接口[ 3 ] 。为保证通信可靠, 在选择接口时必须注意通信的速率、通信距离、抗干扰能

力、电平匹配和通信方式[ 4 ] 。本文为了解决在单片机串行通信时遇到的串口问题, 以MCS51 系列单片机8751为例, 进行串口扩展, 其串口扩展的逻辑框图如图1 所

示, 包括通过通信接口芯片8251 再扩展一个独立串口,通过16 ×1 的多路切换器CD4067 实现一点对多点分时串口通信, 以及通过电平转换器MAX232 , MAX488 ,MAX485 实现单片机与不同类型接口

RS232/ RS422/RS458 的计算机或设备的串行通信。

图 1 单片机串口扩展的逻辑框图

2 两个独立串口扩展的电路设计

在单片机应用系统设计中, 有时需要两个独立的全双工串口进行通信, 但CPU8751 只有一个串口, 要扩展另一个独立的串口, 可通过8751 的P0 扩展可编程通信接口芯

片Intel8251 完成[5],采用中断方式, 因为它能更大限度地提高资源的利用率, 使CPU 8751 在不进行数据通信时做其它的工作。当有发送/ 接收请求时, 即TxRDY/ RxRDY = 1 ,向8751 的INTO 请求中断, 其电路设计如图2 所示, 允许使用192 00 波特的传送速率与外界通信。考虑到8251 在异步通信方式时, 输入时钟频率CLK必须大于接收时钟频率RxCLK和发送时钟频率TxCLK 的415倍, RxCLK 和TxCLK是波特率的1、16 或32 倍。要由CLK分频得到需要的Rx2CLK和TxCLK , 但不同的波特率对应分频倍数不同, 要由硬件完成不同分频倍数是很复杂的, 这里选用可编程芯片计数/ 定时器Intel8253 来完成, 只需根据不同情况改变计数初值。如果要8253 工作在方式3 即方波速率发生器, 对应的门控位GATE 要为高电平, 因而用8751 的P11= 0 的状

态来启动通道工作, 要求初始化时系统禁止通信, 由于单片机各端口复位后处于高电平状态, 所以P11端加一非门。当8253 的计数频率为11843 2 MHz、工作在方式3、RxCLK

和TxCLK 是波特率的16 倍时, 表 1 给出了常用波特率时8253 的计数初值和8251 时钟信号RxCLK和TxCLK 的关系,并且8253 计数初值为偶数,能较好满足要求。

图 2 8751 的另一个全双工串口的电路设计图

3一点对多点分时串行通信的扩展电路设计

为了实现1 对16 点分时串行通信, 两片CD4067 的OUT端分别接至8751 串口的发送端TXD 和接收端RXD , 以便完成串口的16 选 1 , CD4067 的A、B 、C、D

接8751 的P0通过锁存器出来的低 4 位地址A0- A3, INH 脚接系统的一个片选信号CS , 当CS 有效时, INH 脚为低电平, 即启动CD4067 工作。

4 单片机与不同类型串口的通信扩展电路的设计

单片机CPU8751 的串口是TTL 电平, 要实现8751与不同类型串口进行通信,需要用电平转换器完成不同类型串口的转换, 才能成功进行通信。下面对单片机8751 与RS232/ RS422/ RS485 的串行通信进行接口扩展。

单片机8751 有一个全双工串口, 如果要完成CPU8751 与RS232 接口的外设进行串行通信, 比如CPU8751 与PC 机通信( RS232 接口) ,两者之间必须有一个电平转换电路。采用电平转换器MCl488 和MCl489能完成TTL电平与RS232 转换, 即TTL 电平通过MCl488 转换成RS232 电平,RS232 电平通过MCl489 转换成TTL 电平, 但设计电路的不便之处是需要±12V 电压, 并且功耗较大, 不适合用于低功耗的系统。因此,可以采用ICL232 系列产品中的MAX232 芯片, 它是集RS232 串行接口发送器/ 接收器一体化的产品, 只需+5V 单一直流电

源供电, 驱动能力强。MAX232 芯片内置两个TTL 到RS232 和两个

RS232 到TTL 驱动电路, 即具有两个发送器和两个接收器, 只需外置4 个011μF 电容以供内部电路产生RS232 电压。MAX232 的发送器的发送输入为T1IN/ T2IN , 发送输出为T1OUT/ T2OUT ;接收器的接收输入为R1IN/ R2IN , 接收输出为R1OUT/R2OUT。RS232 接口也普遍使用9 芯插头座, 在许多场合下仅将发送端TXD 数据和接收端RXD 交叉连接,加上信号地GND 共使用三根线, 单片机8751 与RS232 接口的串行通信电路如图 3 所示, 图中只给出了一路TTL电平接口到RS232 电平接口的串行通信电路设计。

图 3 单片机8751 与RS232 接口的串行通信电路图

RS422/ RS485 传输方式与RS232 的不同, RS232 传输采用非平衡模式, 因此, 共模噪声会耦合到信号系统中, 其标准建议的最大通信距离为15 m ,而RS422/RS485 数据信号采用差分传输方式, 也称平衡传输, 具有一定的抗共模干扰能力, 最大通信距离为 1 200 m。RS422/ RS485 比RS232 抗干扰能力强, 较适合于远距离通信。RS422 以全双工方式通信, MAX488 是一种RS422 接口芯片, 适用于RS422 的低功率收发器。片内包括一个发送器和一个接收器, 它采用单一的+ 5 V 供电, 应用方便。

MAX488 的发送器的发送输入为DI , 正发送输出为Y ,负发送输出为Z ; 接收器的正接收输入为 A , 负接收输入为 B , 接收输出为RO,通信时主机的发送两线Y/ Z 连接到从机的接收两线A/ B , 从机的发送两线Y/ Z 连接到

主机的接收两线A/ B。单片机8751与RS422 接口的串行通信电路如图 4 所示。

图 4 单片机8751 与RS422 接口的串行通信电路图

RS485 是RS422 的变型, 不同之处只是RS485 采用半双工方式通信, MAX485 是RS485 使用的一种接口芯片, MAX485 的发送/ 接收转换器是由使能端和DE 控

制。当RE 和DE 都为0 时, MAX485 处于接收状态;RE 和DE 都为 1 时, MAX485 处于发送状态。在上电复位时, 由于硬件电路稳定需要一定的时间, 并且单片机各端口复位后处于高电平状态, 这样就会使总线上各个分机处于发送状态, 加上上电时各电路的不稳定, 可能向总线发送信息。因此, 如果用单片机的一根口线P10连接到发送和接收控制信号RE 和DE 端, 应将口线反向后接入MAX485 的控制端,使上电时MAX485 处于接收状态。MAX485 的发送器的发送输入为DI , 接收器的接收输出为RO, 单片机8751 与RS485 接口的串行通信电路如图5 所示。RS485 总线中的发送和接收信号共用一对总线A/ B , 在总线末端接一个匹配电阻, 当总线上没

有信号传输时, 总线处于悬浮状态, 容易受干扰信号的影响, 将总线上差分信号的正端A 和负端 B 间接一个12 K的匹配电阻, 吸收总线上的反射信号, 保证正常传输信号干净、无毛刺。即使有干扰信号, 却很难产生串行通信的起始信号0 , 从而增加了总线抗干扰的能力。

图 5 单片机8751 与RS485 接口的串行通信电路图

程序:

1、中断源修改

#define SYSINTR_SERIAL1 (SYSINTR_FIRMWARE+19)

修改以下中断范围使之能包含这个新添加的中断。

MapIrq2SysIntr(DWORD _Irq)

{

if( _Irq<=19 )

return ( SYSINTR_FIRMWARE + _Irq );

else

return (0xffffffff);

}

// 19 这个数字根据您的系统而定,并且需要和注册表相匹配。

这里,我们可以看到SYSINTR_SERIAL1定义到16+19=35=0x23,与注册表中一致。

2、打开串口源文件中ser2410_hw.c文件。这个文件修改了数据结构根据注册表中的配置情况进行端口匹配。

搜索:

S2410_SetSerialIOP(

PVOID pHead // @parm points to device head

)

将其函数改为:

{

PS2410_UART_INFO pHWHead = (PS2410_UART_INFO)pHead;

PSER_INFO pHWHead1 = (PSER_INFO)pHead;

RETAILMSG(DEBUGMODE, (TEXT("S2410_SetSerialIOP \r\n")));

if(pHWHead1->dwIOBase == 0x50004000)

{

#if USEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON &= ~(0x3<<8 | 0x3<<10 /*| 0x3<<12 | 0x3<<14*/); // clear

uart 1 - rx, tx

v_pIOPregs->rGPHCON |= (0x2<<8 | 0x2<<10 /*| 0x1<<12 | 0x0<<14*/);

v_pIOPregs->rGPHCON |= (0x2<<0 | 0x2<<2 );

v_pIOPregs->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#else

volatile IOPreg *s2410IOP;

s2410IOP = (volatile IOPreg *)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON &= ~(0x3<<8 | 0x3<<10/* | 0x3<<12 | 0x3<<14*/); // clear

uart 1 - rx, tx

s2410IOP->rGPHCON |= (0x2<<8 | 0x2<<10 /*| 0x1<<12 | 0x0<<14*/);

s2410IOP->rGPHCON |= (0x2<<0 | 0x2<<2 );

s2410IOP->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport = (volatile unsigned int *)(IOP_BASE+0x74);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#endif

}

else if(pHWHead1->dwIOBase == 0x50008000)

{

#if USEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON &= ~( 0x3<<12 | 0x3<<14); // clear uart 2 - rx, tx

v_pIOPregs->rGPHCON |= ( 0x2<<12 | 0x2<<14);

v_pIOPregs->rGPHCON |= (0x2<<0 | 0x2<<2 );

v_pIOPregs->rGPHUP &= ~0xc0;

pHWHead->rDTRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#else

volatile IOPreg *s2410IOP;

s2410IOP = (volatile IOPreg *)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON &= ~(0x3<<12 | 0x3<<14); // clear uart 2 - rx, tx

s2410IOP->rGPHCON |= ( 0x02<<12 | 0x02<<14);

s2410IOP->rGPHCON |= (0x2<<0 | 0x2<<2 );

s2410IOP->rGPHUP &= ~0xc0;

pHWHead->rDTRport = (volatile unsigned int *)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport = (volatile unsigned int *)(IOP_BASE+0x74);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#endif

}

else

{

#if USEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON &= ~(0x3<<0 | 0x3<<2 | 0x3<<4 | 0x3<<6/* | 0x3<<12 | 0x3<<14*/); // clear uart 0 - rx, tx

v_pIOPregs->rGPHCON |= (0x2<<4 | 0x2<<6/* | 0x1<<12 | 0x0<<14*/);

v_pIOPregs->rGPHCON |= (0x2<<0 | 0x2<<2 );

v_pIOPregs->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#else

volatile IOPreg *s2410IOP;

s2410IOP = (volatile IOPreg *)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON &= ~(0x3<<0 | 0x3<<2 | 0x3<<4 | 0x3<<6 /*| 0x3<<12 | 0x3<<14*/); // clear uart 0 - rx, tx

s2410IOP->rGPHCON |= (0x2<<4 | 0x2<<6 /*| 0x1<<12 | 0x0<<14*/);

s2410IOP->rGPHCON |= (0x2<<0 | 0x2<<2 );

s2410IOP->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport = (volatile unsigned int *)(IOP_BASE+0x74);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum =1;

#endif

}

LeaveCriticalSection(&(pHWHead->RegCritSec));

}

接着搜索:

SL_Init(

PVOID pHead, // @parm points to device head

PUCHAR pRegBase, // Pointer to 16550 register base

UINT8 RegStride, // Stride amongst the 16550 registers

EVENT_FUNC EventCallback, // This callback exists in MDD

PVOID pMddHead, // This is the first parm to callback

PLOOKUP_TBL pBaudTable // BaudRate Table

)

在PS2410_UART_INFO pHWHead = (PS2410_UART_INFO)pHead;这一句后面添加:

PSER_INFO pHWHead1 = (PSER_INFO)pHead;

再搜索:

if ( pHWHead->UseIrDA )

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART2regs->rURXH); }

else

{

把这其中的代码修改为以下代码

}

if(pHWHead1->dwIOBase == 0x50004000)

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART1regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART1regs->rURXH);

}

else if(pHWHead1->dwIOBase == 0x50008000)

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART2regs->rURXH);

}

else

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART0regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART0regs->rURXH);

}

3、打开ser2410_ser.c文件。

搜索:

const HWOBJ IoObj = {

THREAD_AT_INIT,

SYSINTR_SERIAL,

(PHW_VTBL) &IoVTbl

};

在其后面添加:

const HWOBJ Io1Obj = {

THREAD_AT_INIT,

SYSINTR_SERIAL1,

(PHW_VTBL) &IoVTbl

};

const HWOBJ Io2Obj = {

THREAD_AT_INIT,

SYSINTR_IR,

(PHW_VTBL) &IoVTbl

};

接着搜索:

const PCHWOBJ HWObjects[] = {

&IoObj,

&IrObj

};

将其修改为:

const PCHWOBJ HWObjects[] = {

&IoObj,

&Io1Obj,

&Io2Obj

};

再搜索:

GetSerialObject(

DWORD DeviceArrayIndex

)

将其函数改为:

{

PHWOBJ pSerObj;

DEBUGMSG(DEBUGMODE,(TEXT("GetSerialObject : DeviceArrayIndex = %d\r\n"),

DeviceArrayIndex));

// Now return this structure to the MDD.

if ( DeviceArrayIndex == 2 )

{

RETAILMSG(1,(TEXT("GetSerialObject Io2Obj\r\n")));

pSerObj = (PHWOBJ)(&Io2Obj);

}

else if(DeviceArrayIndex == 1)

pSerObj = (PHWOBJ)(&Io1Obj);

else

pSerObj = (PHWOBJ)(&IoObj);

return (pSerObj);

}

4、打开cfw.c文件,这就是中断处理。

搜索:

BOOL

OEMInterruptEnable(DWORD idInt, // @parm Interrupt ID to be enabled. See for a list of possble values.

LPVOID pvData, // @parm ptr to data passed in in the call

DWORD cbData) // @parm Size of data pointed to be

找到这一句:case SYSINTR_SERIAL:

在其后面添加:

case SYSINTR_SERIAL1: // Serial port1.

s2410INT->rSUBSRCPND = (INTSUB_RXD1 | INTSUB_TXD1 | INTSUB_ERR1);

s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;

s2410INT->rINTSUBMSK &= ~INTSUB_TXD1;

s2410INT->rINTSUBMSK &= ~INTSUB_ERR1;

s2410INT->rSRCPND = BIT_UART1;

// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in

the INTPND register.

if (s2410INT->rINTPND & BIT_UART1) s2410INT->rINTPND = BIT_UART1;

s2410INT->rINTMSK &= ~BIT_UART1;

break;

搜索:

void

OEMInterruptDone(DWORD idInt) // @parm Interrupt ID. See 依旧找到case SYSINTR_SERIAL:

在其后面添加:

case SYSINTR_SERIAL1:

s2410INT->rINTMSK &= ~BIT_UART1;

s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;

break;

5、打开armint.c文件。

搜索:else if(IntPendVal == INTSRC_UART0)

在其后面添加:

else if(IntPendVal == INTSRC_UART1)

{

SubIntPendVal = s2410INT->rSUBSRCPND;

// Note that we only mask the sub source interrupt - the serial driver will

clear the

// sub source pending register.

//

if(SubIntPendVal & INTSUB_ERR1)

{

s2410INT->rINTSUBMSK |= INTSUB_ERR1;

}

else if(SubIntPendVal & INTSUB_RXD1)

{

s2410INT->rINTSUBMSK |= INTSUB_RXD1;

}

else if(SubIntPendVal & INTSUB_TXD1)

{

s2410INT->rINTSUBMSK |= INTSUB_TXD1;

}

else

{

return(SYSINTR_NOP);

}

// NOTE: Don't clear INTSRC:UART1 here - serial driver does that.

//

s2410INT->rINTMSK |= BIT_UART1;

if (s2410INT->rINTPND & BIT_UART1) s2410INT->rINTPND = BIT_UART1;

return(SYSINTR_SERIAL1);

}

6、打开platform.reg文件,这个是WinCE注册表文件,在这里,我们要修改并添加串口。

搜索:[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SER2410],这就是串口1。将其下面的键值改为:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SER2410] "DeviceArrayIndex"=dword:0

"Irq"=dword:13

"IoBase"=dword:50000000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"="SER2410.Dll"

"Order"=dword:0

"Priority"=dword:0

"Port"="COM1:"

"DeviceType"=dword:0

"FriendlyName"="Serial Cable on COM1:"

"Tsp"="Unimodem.dll"

"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00

再在其后面添加串口2:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SER2410_2] "DeviceArrayIndex"=dword:1

"Irq"=dword:23

"IoBase"=dword:50004000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"="SER2410.Dll"

"Order"=dword:1

"Priority"=dword:0

"Port"="COM2:"

"DeviceType"=dword:0

"FriendlyName"="Serial Cable on COM2:"

"Tsp"="Unimodem.dll"

"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SER2410_2\Unimodem]

"Tsp"="Unimodem.dll"

"DeviceType"=dword:0

"FriendlyName"="SER2410_2 UNIMODEM"

"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00

再搜索:[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IRDA2410],这个是红外,也要修改下:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IRDA2410] "DeviceArrayIndex"=dword:2

"Irq"=dword:19

"IoBase"=dword:50008000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"="IRDA2410.Dll"

"Order"=dword:0

"Priority"=dword:0

"Port"="COM3:"

"DeviceType"=dword:0 ; IRDA modem, 0 -> null modem "FriendlyName"="S2410 IRDA2410"

"Index"=dword:2

"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"

1、中断源修改

#define SYSINTR_SERIAL1 (SYSINTR_FIRMWARE+19)

修改以下中断范围使之能包含这个新添加的中断。

MapIrq2SysIntr(DWORD _Irq)

{

if( _Irq<=19 )

return ( SYSINTR_FIRMWARE + _Irq );

else

return (0xffffffff);

}

// 19 这个数字根据您的系统而定,并且需要和注册表相匹配。

这里,我们可以看到SYSINTR_SERIAL1定义到16+19=35=0x23,与注册表中一致。

2、打开串口源文件中ser2410_hw.c文件。这个文件修改了数据结构根据注册表中的配置情况进行端口匹配。

搜索:

S2410_SetSerialIOP(

PVOID pHead // @parm points to device head

)

将其函数改为:

{

PS2410_UART_INFO pHWHead = (PS2410_UART_INFO)pHead;

PSER_INFO pHWHead1 = (PSER_INFO)pHead;

RETAILMSG(DEBUGMODE, (TEXT("S2410_SetSerialIOP \r\n")));

if(pHWHead1->dwIOBase == 0x50004000)

{

#if USEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON &= ~(0x3<<8 | 0x3<<10 /*| 0x3<<12 | 0x3<<14*/); // clear

uart 1 - rx, tx

v_pIOPregs->rGPHCON |= (0x2<<8 | 0x2<<10 /*| 0x1<<12 | 0x0<<14*/);

v_pIOPregs->rGPHCON |= (0x2<<0 | 0x2<<2 );

v_pIOPregs->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#else

volatile IOPreg *s2410IOP;

s2410IOP = (volatile IOPreg *)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON &= ~(0x3<<8 | 0x3<<10/* | 0x3<<12 | 0x3<<14*/); // clear

uart 1 - rx, tx

s2410IOP->rGPHCON |= (0x2<<8 | 0x2<<10 /*| 0x1<<12 | 0x0<<14*/);

s2410IOP->rGPHCON |= (0x2<<0 | 0x2<<2 );

s2410IOP->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport = (volatile unsigned int *)(IOP_BASE+0x74);

pHWHead->DsrPortNum = 1;

#endif

}

else if(pHWHead1->dwIOBase == 0x50008000)

{

#if USEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON &= ~( 0x3<<12 | 0x3<<14); // clear uart 2 - rx, tx

v_pIOPregs->rGPHCON |= ( 0x2<<12 | 0x2<<14);

v_pIOPregs->rGPHCON |= (0x2<<0 | 0x2<<2 );

v_pIOPregs->rGPHUP &= ~0xc0;

pHWHead->rDTRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#else

volatile IOPreg *s2410IOP;

s2410IOP = (volatile IOPreg *)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON &= ~(0x3<<12 | 0x3<<14); // clear uart 2 - rx, tx

s2410IOP->rGPHCON |= ( 0x02<<12 | 0x02<<14);

s2410IOP->rGPHCON |= (0x2<<0 | 0x2<<2 );

s2410IOP->rGPHUP &= ~0xc0;

pHWHead->rDTRport = (volatile unsigned int *)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport = (volatile unsigned int *)(IOP_BASE+0x74);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum = 1;

#endif

}

else

{

#if USEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON &= ~(0x3<<0 | 0x3<<2 | 0x3<<4 | 0x3<<6/* | 0x3<<12 | 0x3<<14*/); // clear uart 0 - rx, tx

v_pIOPregs->rGPHCON |= (0x2<<4 | 0x2<<6/* | 0x1<<12 | 0x0<<14*/);

v_pIOPregs->rGPHCON |= (0x2<<0 | 0x2<<2 );

v_pIOPregs->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport = (volatile unsigned int *)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum = 0;

#else

volatile IOPreg *s2410IOP;

s2410IOP = (volatile IOPreg *)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON &= ~(0x3<<0 | 0x3<<2 | 0x3<<4 | 0x3<<6 /*| 0x3<<12 | 0x3<<14*/); // clear uart 0 - rx, tx

s2410IOP->rGPHCON |= (0x2<<4 | 0x2<<6 /*| 0x1<<12 | 0x0<<14*/);

s2410IOP->rGPHCON |= (0x2<<0 | 0x2<<2 );

s2410IOP->rGPHUP |= 0x03;

pHWHead->rDTRport = (volatile unsigned int *)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport = (volatile unsigned int *)(IOP_BASE+0x74);

pHWHead->DtrPortNum = 0;

pHWHead->DsrPortNum =1;

#endif

}

LeaveCriticalSection(&(pHWHead->RegCritSec));

}

接着搜索:

SL_Init(

PVOID pHead, // @parm points to device head

PUCHAR pRegBase, // Pointer to 16550 register base

UINT8 RegStride, // Stride amongst the 16550 registers

EVENT_FUNC EventCallback, // This callback exists in MDD

PVOID pMddHead, // This is the first parm to callback

PLOOKUP_TBL pBaudTable // BaudRate Table

)

在PS2410_UART_INFO pHWHead = (PS2410_UART_INFO)pHead;这一句后面添加:

PSER_INFO pHWHead1 = (PSER_INFO)pHead;

再搜索:

if ( pHWHead->UseIrDA )

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART2regs->rURXH); }

else

{

把这其中的代码修改为以下代码

}

if(pHWHead1->dwIOBase == 0x50004000)

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART1regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART1regs->rURXH);

}

else if(pHWHead1->dwIOBase == 0x50008000)

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART2regs->rURXH);

}

else

{

pHWHead->pUFTXH = (volatile unsigned char *)&(v_pUART0regs->rUTXH);

pHWHead->pUFRXH = (volatile unsigned char *)&(v_pUART0regs->rURXH);

}

3、打开ser2410_ser.c文件。

搜索:

const HWOBJ IoObj = {

THREAD_AT_INIT,

SYSINTR_SERIAL,

(PHW_VTBL) &IoVTbl

};

在其后面添加:

const HWOBJ Io1Obj = {

THREAD_AT_INIT,

SYSINTR_SERIAL1,

(PHW_VTBL) &IoVTbl

};

const HWOBJ Io2Obj = {

THREAD_AT_INIT,

SYSINTR_IR,

(PHW_VTBL) &IoVTbl

};

接着搜索:

const PCHWOBJ HWObjects[] = {

&IoObj,

&IrObj

};

将其修改为:

const PCHWOBJ HWObjects[] = {

&IoObj,

&Io1Obj,

&Io2Obj

};

再搜索:

GetSerialObject(

DWORD DeviceArrayIndex

)

将其函数改为:

{

PHWOBJ pSerObj;

DEBUGMSG(DEBUGMODE,(TEXT("GetSerialObject : DeviceArrayIndex = %d\r\n"),

DeviceArrayIndex));

// Now return this structure to the MDD.

if ( DeviceArrayIndex == 2 )

{

RETAILMSG(1,(TEXT("GetSerialObject Io2Obj\r\n")));

pSerObj = (PHWOBJ)(&Io2Obj);

}

else if(DeviceArrayIndex == 1)

pSerObj = (PHWOBJ)(&Io1Obj);

else

pSerObj = (PHWOBJ)(&IoObj);

return (pSerObj);

}

4、打开cfw.c文件,这就是中断处理。

搜索:

BOOL

OEMInterruptEnable(DWORD idInt, // @parm Interrupt ID to be enabled. See

Interrupt ID's.Interrupt ID's> for a list of possble values.

LPVOID pvData, // @parm ptr to data passed in in the call

DWORD cbData) // @parm Size of data pointed to be

找到这一句:case SYSINTR_SERIAL:

在其后面添加:

case SYSINTR_SERIAL1: // Serial port1.

s2410INT->rSUBSRCPND = (INTSUB_RXD1 | INTSUB_TXD1 | INTSUB_ERR1);

s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;

s2410INT->rINTSUBMSK &= ~INTSUB_TXD1;

s2410INT->rINTSUBMSK &= ~INTSUB_ERR1;

s2410INT->rSRCPND = BIT_UART1;

// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in

the INTPND register.

if (s2410INT->rINTPND & BIT_UART1) s2410INT->rINTPND = BIT_UART1;

s2410INT->rINTMSK &= ~BIT_UART1;

break;

搜索:

void

OEMInterruptDisable(DWORD idInt) // @parm Interrupt ID to be disabled. See

还是这一句:case SYSINTR_SERIAL:

在其后面添加:

case SYSINTR_SERIAL1:

s2410INT->rINTMSK |= BIT_UART1;

s2410INT->rINTSUBMSK |= INTSUB_RXD1;

s2410INT->rINTSUBMSK |= INTSUB_TXD1;

s2410INT->rINTSUBMSK |= INTSUB_ERR1;

break;

搜索:

void

OEMInterruptDone(DWORD idInt) // @parm Interrupt ID. See 依旧找到case SYSINTR_SERIAL:

在其后面添加:

case SYSINTR_SERIAL1:

s2410INT->rINTMSK &= ~BIT_UART1;

s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;

51单片机中断扩展

51单片机扩展中断的四种方法 MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时 ,就必须进行扩展,下面介绍两种简单的扩展方法: 一、采用硬件请求和软件查询的方法: 这种方法是:把各个中断源通过硬件“或非(高有效,如CD4002)”(与,低有效)门引入到单片机外部中断源输端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这 样当外部中断时,通过“或非”(与)门引起单片机中断,在中断服务程序中再通 过软件查询,进而转相应的中断服务程序。显然,这种方法的中断优先级取决于 软件查询的次序。其硬件连接和软件编程如下: Void zhongduan (void) interrupt 0 using 3 //中断函数 { EX0=0;//关中断 If(P0_0=1) { *****}//中断查询 If(P0_1=1) { *****}//中断查询 If(P0_2=1) { *****}//中断查询 EX0=1;开中断 } 二、用普通二极管构成中断选择

扩展的8个外部中断源均通过二极管向I N T(x=0或I)请求中断。当某个外部中断源请求中断服务时输出低电平电平,单片机满足响应外部中断(I N T)请求条件,响应中断,程序立即转向I NT 对应的中断入口地址处开始执PI.0~P1.7口外中断源的状态,以识别提出请求的外扩中断源,并转向中断服务程序为其服务,其查询顺序即顺序。在图中,是选用PI.0~PI.7作为外扩中断源请求的状态信息输入端口。 有点类似第一种方法。 三、用定时器/计数器作外部中断 单片机的定时器/计数器是一个加一计数器,每当计数输入端有一个“1—0”的负 跳变时,计数器加一,当加一计数器溢出时,就向CPU发出中断,利用这个特性 来扩展中断的方法是:首先把定时器/计数器设置成计数方式,并预置满值,把 外部中断源输入到P3口第4引脚或第5引脚(计数器输入端),这样就可以利用 定时器/计数器作为单片机外部中断了。注意这种方法的中断服务的入口地址应 在000BH或001BH。 四、用专用中断扩展芯片8259A 8259A是可编程中断控制接口,单片机控制八级中断。在系统中还可采用级联方式,一个主片可级联8个从片,这样在程序小于8K的情况,就可以用一片单片机实现了,而不需要用两片单片机控制,还要进行单片机点对点

单片机外部RA扩展

单片机外部RAM扩展模块 MCS-51系列单片机外部RAM为64K,在一些特殊场合下,远不能满足需要,本文就AT89C51讨论MCS-51系列单片机大容量RAM的扩 展方法。 首先介绍128K随机读取RAM HM628128。HM628128 是32脚双列直插式128K静态随机读取RAM,它具有容 量大、功耗低、价格便宜、集成度高、速度快、设计和 使用方便等特点。如若在系统中加入掉电保护电路,保 护数据有很高的可靠性,可以和EEPROM相媲美。 技术特性: (1)最大存取时间为120ns; (2)典型选通功耗75mW;典型未选通功耗10uW; (3)使用单一5V电源供电; (4)全静态存储器,不需要时钟及时序选通信号; (5)周期时间与存取时间相等; (6)采用三态输出电路,数据输入和输出端公用; 图6 HM628128外部引脚(7)所有输入和输出引脚均与TTL电平直接兼 容; (8)有两个片选端,适合于低功耗使用,即为了保存信息,用电池作为后备电源。保存信息的最低电源电压Vcc=2V。 引脚安排及功能表: 图6是HM628128的外部引脚排列图,各引脚名称及功用分别如下: A0~A16是17条地址线;I/O0~I/O7是8条双向数据线;CS1是片选1,低电平有效,CS2是片选2,高电平有效;WR是写控制线,当CS1为低电平,CS2为高电平时,WR的上升沿将I/O0~I/O7上的数据写到A0~A16选中的存储单元中;OE是读出允许端,低电平有效。 HM628128的功能表如表3所示。 WR CS1 CS2 OE 工作方式 X H X X未选中 X X L X未选中 H L H H 输出禁止 H L H L 读 L L H H 写 其中,H表示高电平,L表示低电平,X表示任意状态由于AT89C51直接外部RAM容量为64K,地址线为16条,其中低8位地址和数据分时复用,因此需要外部地址锁存器和ALE锁存信号来锁存低8位地址。又由于AT89C51的外部数据和外设地址通用,若扩展外设必然占用数据地址。因此本系统采用P2.7(A15)口来区分数据和外设:当P2.7(A15)口为高电平时,

(完整版)单片机发展历史

单片机发展历史 单片机(Microcontrollers)诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。 而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。高端的32位Soc单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。 当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。 单片机主要阶段 早期阶段 SCM即单片微型计算机(Microcontrollers)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。 Micro Controller Unit 中期发展

MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。 Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。 当前趋势 SoC嵌入式系统(System on Chip)式的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决,因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。 单片机早期发展 1971年intel公司研制出世界上第一个4位的微处理器;Intel公司的霍夫研制成功世界上第一块4位微处理器芯片Intel 4004,标志着第一代微处理器问世,微处理器和微机时代从此开始。因发明微处理器,霍夫被英国《经济学家》杂志列为“二战以来最有影响力的7位科学家”之一。 1971年11月,Intel推出MCS-4微型计算机系统(包括4001 ROM芯片、4002 RAM 芯片、4003移位寄存器芯片和4004微处理器)其中4004(下图)包含2300个晶体管,尺寸规格为3mm×4mm,计算性能远远超过当年的ENIAC,最初售价为200美元。 1972年4月,霍夫等人开发出第一个8位微处理器Intel 8008。由于8008采用的是P 沟道MOS微处理器,因此仍属第一代微处理器。 1973年intel公司研制出8位的微处理器8080;1973年8月,霍夫等人研制出8位微处理器Intel 8080,以N沟道MOS电路取代了P沟道,第二代微处理器就此诞生。 主频2MHz的8080芯片运算速度比8008快10倍,可存取64KB存储器,使用了基于6微米技术的6000个晶体管,处理速度为0.64MIPS(Million Instructions Per Second )。 1975年4月,MITS发布第一个通用型Altair 8800,售价375美元,带有1KB存储器。这是世界上第一台微型计算机。

关于51单片机外部中断响应

关于51单片机外部中断响应 外部中断方式最好设为下降沿方式,特别是中断引 脚接按键的情况。 外部下降沿中断:SETB IT0。每个机器周期都由硬 件对引脚自动采样,若连续在2个周期采样到电平从高 到低,则认定有中断请求,IE0=1。IE0会一直保持到该 中断请求被CPU响应,响应前都不会自动清零,只有在 响应后硬件才自动将IE0清零IE0=0。 外部低电平中断:CLR IT0。当中断引脚为低电平时,并保持一个机器周期,硬件自动置IE0=1。如果在下一个 周期采样到中断引脚为高电平时,硬件自动将IE0清0。中断标志位自动清0条件:下降沿中断只有CPU响应中断同时才会清0,否则一直保持。低电平中断:任何时候 当外部中断引脚为低电平时,IE0=1;为高电平时, IE0=0,所以不需要响应中断才会清0,与引脚状态有关。注意:当EA=0时,中断引脚为低电平也不会将IE0自动置1,只有EA=1时才会自动置1 单片机设计中有两个CPU时,主CPU控制副CPU中断时应注意:主CPU发出中断信号的时候,副CPU能够及时接收到,也就是副CPU工作状态不允许在关中断CLR EA的程序中运行。只要副CPU不工作在关中断的程序中运行,

主CPU发出的中断信号副CPU都能够及时响应中断。还有就是如果采用下降沿方式,主CPU发出的高低电平之间间隔时间只需一条NOP指令。所以应该尽可能考虑这个时差问题。有时候就是副CPU还没有运行完屏蔽中断的程序的时候,主CPU就发出了中断信号,造成副CPU无法中断或时好时坏。 键盘中断到今天为止终于可以告一段落了。 现在才知道,程序架构有了并不代表程序就容易完成,更多的时间在于调试,防真,再调试,如此循环。所以遇到问题要有耐心,信心,细心。做到这三点,不行也得行!!!!

单片机系统扩展

第六章单片机系统扩展 通常情况下,采用MCS-51单片机的最小系统只能用于一些很简单的应用场合,此情况下直接使用单片机内部程序存储器、数据存储器、定时功能、中断功能,I/O端口;使得应用系统的成本降低。但在许多应用场合,仅靠单片机的内部资源不能满足要求,因此,系统扩展是单片机应用系统硬件设计中最常遇到的问题。 在很多复杂的应用情况下,单片机内的RAM ,ROM 和 I/O接口数量有限,不够使用,这种情况下就需要进行扩展。因此单片机的系统扩展主要是指外接数据存贮器、程序存贮器或I/O接口等,以满足应用系统的需要。 6.1 单片机应用系统 按照单片机系统扩展与系统配置状况,单片机应用系统可以分为最小应用系统、最小功耗系统、典型应用系统等。 最小应用系统,是指能维持单片机运行的最简单配置的系统。这种系统成本低廉、结构简单,常用来构成简单的控制系统,如开关状态的输入/输出控制等。对于片内有ROM/EPROM 的单片机,其最小应用系统即为配有晶振、复位电路和电源的单个单片机。对于片内无ROM/EPROM的单片机,其最小系统除了外部配置晶振、复位电路和电源外,还应当外接EPROM 或EEPROM作为程序存储器用。最小应用系统的功能取决于单片机芯片的技术水平。 单片机的最小功耗应用系统是指能正常运行而又功耗力求最小的单片机系统。 单片机的典型应用系统是指单片机要完成工业测控功能所必须具备的硬件结构系统。 6.1.1 8051/8751最小应用系统 MCS-51系列单片机的特点就是体积小,功能全,系统结构紧凑,硬件设计灵活。对于简单的应用,最小系统即能满足要求。 8051/8751是片内有ROM/EPROM的单片机,因此,用这些芯片构成的最小系统简单、可靠。 图6-1 8051/8751最小应用系统 用8051/8751单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图6-1所示。由于集成度的限制,最小应用系统只能用作一些小型的控制单元。其应用特点: (1)有可供用户使用的大量I/O口线。因没有外部存储器扩展,这时EA接高电平,P0、P1、P2、P3都可作用户I/O口使用。

51单片机外部ram扩展c程序及硬件结构

c程序 #include #include #define uchar unsigned char #define uint unsigned int int n,m; void main() { unsigned int i; while(1) { for(i=0x0000;i<=0x7fff;i++) { XBYTE[i]=n;//写入ram } for(i=0x7fff;i>0x0000;i--) { m=XBYTE[i];//读外部存储器 } }

} 62256外部ram芯片 相关知识: XBYTE是一个地址指针(可当成一个数组名或数组的首地址),它在文件absacc.h中由系统定义,指向外部RAM(包括I/O口)的0000H单元,XBYTE后面的中括号[ ]0x2000H 是指数组首地址0000H的偏移地址,即用XBYTE[0x2000]可访问偏移地址为0x2000的I/O端口。 这个主要是在用C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。 比如:P2.7接WR,P2.6接RD,P2.5接CS,那么就可

以确定个外部RAM的一个地址,想往外部RAM的一个地址写一个字节时,地址可以定为XBYTE [0x4000],其中WR,CS为低,RD为高,那就是高位的4,当然其余的可以根据情况自己定,然后通过 XBYTE [0x4000] = 57; 这赋值语句,就可以把57写到外部RAM的0x4000处了,此地址对应一个字节。 XBYTE 的作用,可以用来定义绝对地址,是P0口和P2口的,其中P2口对应的是高位,P0口对应的是低位 如XBYTE[0x1234] = 0x56; 则等价于 mov dptr,#1234h mov @dptr,#56h 谢谢大家

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

习题5答案单片机系统扩展与接口技术

习题5答案单片机系统扩展与接口技术 一、选择题 1、地址空间3000H~37FFH共有 B 存储单元。 A.1K B.2K C.4K D.8K 2、在生产过程中完成程序写入的只读存储器称为 A 。 A.掩膜ROM B.PROM C.EPROM D.E2PROM 3、805l单片机系统扩展时使用的锁存器用于锁存B 。 A.高8位地址 B.低8位地址 C.8位数据. D.ALE信号 4、使用线选法扩展3片2732作外部程序存储器,需要使用 C 位地址线。 A.13 B.14 C.15 D.16 5、8155中的定时器/计数器是 D 。 A.16位加法计数器 B.16位减法计数器 C.14位加法计数器

D.14位减法计数器 6、定时器/计时器0的初始化程序如下: MOV TMOD,#06H MOV TH0,#0FFH MOV TL0,#0FFH SETB EA SETB ET0 执行该程序段后,把定时器/计时器0的工作状态设置成为 D A.工作方式0,定时应用,定时时间2u s,中断禁止 B.工作方式1,计数应用,计数值255,中断允许 C.工作方式2,定时应用,定时时间510 u s,中断禁止 D.工作方式2,计数应用,计数值1,中断允许 7、MCS-5 l单片机I/O编址采用的是统一编址的方法,因此 B 。 A.有专门的I/O操作指令 B.I/O寄存器与存储单元同等对待 C.地址空间与存储器空间是相互分开的 D.使用MOVX指令访问存储器,而使用MOVC指令进行I/O数据传送8、8155是一个可编程的I/O接口芯片,“可编程”是指 D 。 A.有14位可控定时器/计数器 B.芯片内包含有256字节的RAM C.只能使用中断编程的方法进行I/O数据传送 D.使用命令字以程序方法设置I/O数据传送的方式 9、访问接口,应在程序中使用 B 。 A.MOV指令 B.MOVX指令 C.MOVC指令 D.SWAP指令

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.360docs.net/doc/cb8125856.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

单片机的发展史

单片机发展史 单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。由于单片机在工业控制领域的广泛应用,为使更多的业内人士、学生、爱好者,产品开发人员掌握单片机这门技术,于是产生单片机开发板,比较有名的例如电子人DZR-01A单片机开发板。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。 早期的单片机都是8位或4位的。其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。此后在8031上发展出了MCS51系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。是的 单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。 单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。单片机作为微型计算机的一个重要分支,应用面很广,发展很快。自单片机诞生至今,已发展为上百种系列的近千个机种。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。关键词微型计算机 8位单片机发展趋势一、单片机发展历程 (1)SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。(2)MCU 即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。Philips 公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。(3)单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。二、以8位单片机为起点 (1)第一阶段(1976-1978):单片机的控索阶段。以Intel公司的MCS – 48为代表。MCS – 48的推出是在工控领域的控索,参与这一控索的公司还有Motorola 、Zilog等,都取得了满意的效果。这就是SCM的诞生年代,“单机片”一词即由此而来。 (2)第二阶段(1978-1982)单片机的完善阶段。Intel公司在MCS –48 基础上推出了完善的、典型的单片机系列MCS –51。它在以下几个方面奠定了典型的通用总线型单片机体系结构。①完善的外部总线。MCS-51设置了经典的8位单片机的总线结构,包括8位数据总线、16位地址总线、控制总线及具有很多机通信功能的串行通信接口。②CPU外围功能单元的集中管理模式。 ③体现工控特性的位地址空间及位操作方式。④指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令。 (3)第三阶段(1982-1990):8位单片机的巩固发展及16位单片机的推出阶段,也是单片机向微控制器发展的阶段。Intel公司推出的MCS – 96系列单片机,将一些用于测控系统的模数转换器、程序运行监视器、脉宽调制器等纳入片中,体现了单片机的微控制器特征。随着MCS – 51系列的广应用,许多电气厂商竞相使用80C51为内核,将许多测控系统中使用的电路技术、接口技术、多通道A/D转换部件、可靠性技术等应用到单片机中,增强了外围电路路功能,强化了智能控制的特征。 (4)第四阶段(1990—):微控制器的全面发展阶段。随着单片机在各个领域全面深入地发展和应用,出现了高速、大寻址范围、强运算能力的8位/16位/32位通用型单片机,以及小型廉价的专用型单片机。 单片机的发展趋势 (1)CMOS化近年,由于CHMOS技术的进小,大大地促进了单片机的CMOS化。CMOS芯片除了低功耗特性之外,还具有功耗的可控性,使单片机可以工作在功耗精细管理状态。这也是今后以80C51取代8051为标准MCU芯片的原因。因为单片机芯片多数是采用CMOS (金属栅氧化物)半导体工艺生产。CMOS电路的特点是低功耗、高密度、低速度、低价格。采用双极型半导体工艺的TTL电路速度快,但功耗和芯片面积较大。随着技术和工艺水平的提高,又出现了HMOS(高密度、高速度MOS)和CHMOS工艺。CHMOS和HMOS工艺的结合。目前生产的CHMOS电路已达到LSTTL的速度,传输延迟时间小于2ns,它的综合优势已在于TTL电路。因而,在单片机领域CMOS 正在逐渐取代TTL电路。 (2)低功耗化单片机的功耗已从Ma级,甚至1uA以下;使用电压在3~6V之间,完全适应电池工作。低功耗化的效应不仅是功耗低,而且带来了产品的高可靠性、高抗干扰能力以及产品的便携化。 (3)低电压化几乎所有的单片机都有WAIT、STOP等省电运行方式。允许使用的电压范围越来越宽,一般在3~6V范围内工作。低电压供电的单片机电源下限已可达1~2V。目前0.8V供电的单片机已经问世。 (4)低噪声与高可靠性为提高单片机的抗电磁干扰能力,使产品能适应恶劣的工作环境,满足电磁兼容性方面更高标准的要求,各单片厂家在单片机内部电路中都采用了新的技术措施。大容量化以往单片机内的ROM为1KB~4KB,RAM为64~128B。但在需要复杂控制的场合,该存储容量是不够的,必须进行外接扩充。为了适应这种领域的要求,须运用新的工艺,使片内存储器大容量化。目前,单片机内ROM最大可达64KB,RAM最大为2KB。(5)高性能化主要是指进一步改进CPU的性能,加快指令运算的速度和提高系统控制的可靠性。采用精简指令集(RISC)结构和流水线技术,可以大幅度提高运行速度。现指令速度最高者已达100MIPS(Million Instruction Per Seconds,即兆指令每秒),并加强了位处理功能、中断和定时控制功能。这类单片机的运算速度比标准的单片机高出10倍以上。由于这类单片机有极高的指令速度,就可以用软件模拟其I/O功能,由此引入了虚拟外设的新概念。(6)小容量、低

单片机的发展及应用

单片机的发展与应用 摘要:本文阐述了单片机基本组成以及一般原理。通过查阅相关资料认真总结了单片机的原理、应用、发展以及影响等方面的知识,较为详细地介绍当前单片机的应用领域以及发展历程、发展前景。主要内容包括:单片机的基本原理、硬件结构、具体的应用以及发展的历史与趋势的介绍。本文主要目的是想让大家对单片机有一个更为深入、更为全面的了解。以期,在单片机发展迅速、应用领域不断扩大的当今社会能有一个更好的发展。通过对本课题的研究发现,近年来。单片机在国内的发展速度很快,应用领域也在不断扩大。可见,单片机在国内的发展前景极为广阔。 关键词:单片机;芯片;发展;应用 Development and application of single-chip Abstract: The Intel MCS-51 series single-chip model, the basic components of single-chip, as well as general principles. Access to relevant information through carefully summed up the principle of single-chip, application, development and impact of knowledge, a more detailed description of the current single-chip applications as well as the development process, development prospects. The main contents include: the basic principles of single-chip, hardware structure, and specific applications and the development trend of the history and introduction. The main purpose of this paper is to make everyone have a more in-depth single-chip, a more comprehensive understanding. With a view to, the rapid development in the single-chip applications expanding today's society to have a better development. The subject of this study found that in recent years. Single-chip in the development of the domestic fast, applications are also expanding. This shows that single-chip prospects in the country are extremely broad. Keyword: single-chip; chip; development; application;

单片机外部中断(汇编)

由AT89S52内部定时器0,按方式1工作,即作为16位定时器使用每0.05秒T1溢出中断一次。P1口的P1.0~P1.8分别接8个发光二极管。要求编写程序模拟一时序控制装置。L4,L5亮→L3,L6亮→L2,L7亮→L1,L8亮→L2,L7亮→L3,L6亮→L4,L5亮→L1,L2,L3,L4亮→L5,L6,L7,L8亮→全亮→全灭,共10种状态,每种状态的持续时间为0.5秒。然后再从头循环。 由键盘生成外部中断信号,当任意键按下时,为外部中断请求信号,此时L2,L4,L6,L8亮,持续时间为5秒。 ORG 0000H LJMP MAIN ORG 000BH LJMP PIT0 ORG 003H LJMP PIINT0 ORG 0050H ASCTAB:DB 7EH,0BDH,0DBH,0E7H,0DBH,0BDH,07EH,0AAH,55H,00H,0FFH MAIN:MOV P1,#0EH MOV TMOD,#11H SETB PX0;INT0为高优先级 CLR PT0 ;T0为低优先级 SETB IT0;INT0边沿触发 SETB EX0;允许INT0中断 MOV TH0,#4CH MOV TL0,#00H MOV R3,#0BH MOV R2,#14H MOV DPTR,#ASCTAB SETB TR0 SETB ET0 SETB EA HERE:LJMP HERE PIT0:CLR TR0 MOV TH0,#4CH MOV TL0,#00H DJNZ R2,M MOV R2,#14H MOV A,#00H MOVC A,@A+DPTR MOV P0,A INC DPTR DJNZ R3,M

51单片机串口通信的原理与应用流程解析

51单片机串口通信的原理与应用流程解析 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1)。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。

51单片机外部中断

单片机技术与应用 实验报告 实验名称:外部中断(交通灯与急救车) 姓名: 学号: 班级: 指导老师: 完成时间:2012年5月5日

一.实验要求 以74LS273作为输出口,控制4个双色LED灯(可发红,绿,黄光),模拟交通灯管理,并允许急救车优先通过的要求。有急救车到达时,两向交通信号为全红,以便让急救车通过。假定急救车通过路口时间为10秒,急救车通过后,交通灯恢复中断前状态。本实验以按键为中断申请,表示有急救车通过。 二.实验目的 1.学习外部中断技术的基本使用方法。 2.学习中断处理程序的编程方法。 三.实验框图

四.实验程序 Green_NB0 BIT P1.0 Green_DX0 BIT P1.1 Green_DX1 BIT P1.2 Green_NB1 BIT P1.3 Red_NB0 BIT P1.4 Red_DX0 BIT P1.5 Red_DX1 BIT P1.6 Red_NB1 BIT P1.7 Scd EQU 30H ;秒 ORG 0000H JMP START ORG 0003H JMP INIT0 ORG 000BH JMP TIME0 START: MOV Scd, #00H MOV 31H, #00H MOV DPTR, #0F200H ; MOV P1, #69H ;初始亮灯情况:东西绿灯,南北红灯 MOV A,P1 MOVX @DPTR,A CLR 00H CLR F0 MOV TMOD, #01H ;设定定时器1 MOV IE, #83H ;设定中断使能定时器中断0、外部中断0和1 MOV SP, #60H MOV TH0, #30H MOV TL0, #0B0H SETB TR0 LOOP: JNB F0,N0 ;F0用户标志位,此处用作东西绿灯闪烁标识,1为绿灯闪烁 CPL Green_DX0 ;绿灯闪三秒 CPL Green_DX1 MOV A,P1 MOVX @DPTR,A CALL DELAY500MS JMP N1 N0: JNB 00H,N1 ;00H,值为1时,南北绿灯闪烁

51单片机串口通信

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

单片机的发展历史

英语翻译 单片机作为微型计算机的一个重要分支,应用面很广,发展很快。自单片机诞生至今,已发展为上百种系列的近千个机种。 单片机的发展历史 如果将8位单片机的推出作为起点,那么单片机的发展历史大致可分为以下几个阶段 (1)第一阶段(1976-1978):单片机的控索阶段。以Intel公司的MCS –48为代表。MCS – 48的推出是在工控领域的控索,参与这一控索的公司还有Motorola 、Zilog等,都取得了满意的效果。这就是SCM的诞生年代,“单机片”一词即由此而来的。 (2)第二阶段(1978-1982)单片机的完善阶段。Intel公司在MCS – 48 基础上推出了完善的、典型的单片机系列MCS –51。它在以下几个方面奠定了典型的通用总线型单片机体系结构。 1 完善的外部总线。MCS-51设置了经典的8位单片机的总线结构,包括8位数据总线、16位地址总线、控制总线及具有很多机通信功能的串行通信接口。 2 CPU外围功能单元的集中管理模式。 3 体现工控特性的位地址空间及位操作方式。 4 指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令。 (3)第三阶段(1982-1990):8位单片机的巩固发展及16位单片机的推出阶段,也是单片机向微控制器发展的阶段。Intel公司推出的MCS – 96系列单片机,将一些用于测控系统的模数转换器、程序运行监视器、脉宽调制器等纳入片中,体现了单片机的微控制器特征。随着MCS – 51系列的广应用,许多电气厂商竞相使用80C51为内核,将许多测控系统中使用的电路技术、接口技术、多通道A/D转换部件、可靠性技术等应用到单片机中,增强了外围电路路功能,强化了智能控制的特征。 (4)第四阶段(1990—):微控制器的全面发展阶段。随着单片机在各个领域全面深入地发展和应用,出现了高速、大寻址范围、强运算能力的8位/16位/32位通用型单片机,以及小型廉价的专用型单片机。 单片机的发展趋势 目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。 CMOS化近年,由于CHMOS技术的进小,大大地促进了单片机的CMOS化。CMOS芯片除了低功耗特性之外,还具有功耗的可控性,使单片机可以工作在功耗精细管理状态。这也是今后以80C51取代8051为标准MCU芯片的原因。因为单片机芯片多数是采用CMOS(金属栅氧化物)半导体工艺生产。CMOS电路的特点是低功耗、高密度、低速度、低价格。采用双极型半导体工艺的TTL电路速度快,但功耗和芯片面积较大。随着技术和工艺水平的提高,又出现了HMOS(高密度、高速度MOS)和CHMOS工艺。CHMOS和HMOS工艺的结合。目前生产的CHMOS 电路已达到LSTTL的速度,传输延迟时间小于2ns,它的综合优势已在于TTL电路。因而,在单片机领域CMOS正在逐渐取代TTL电路。

相关文档
最新文档