微型计算机接口技术大作业
计算机接口技术课堂大作业1
计算机接口技术课堂大作业参考答案(1)姓名:班级:学号:成绩:——————————————————————————————————一.填空题(每空2分,共30分)1.接口的编址方式有(统一编址)和(独立编址)。
2.数据输入/输出的三种基本方式是(查询)、(中断)和(DMA)。
3.8086CPU的外部中断引脚有(INTR)和(NMI)。
4.在8086CPU系统中,设某中断源的中断类型号为08H,中断矢量为0100H:1000H,则相应的中断矢量存储地址为(0020H);从该地址开始,连续的4个存储单元存放的内容依次为(00H、10H、00H、01H)。
5.定时器/计数器8254的地址范围是304H~307H,则控制端口的地址是(307H)。
6.如用译码器74LS138的输出信号与8086CPU的WR信号组合后成为8255A的片选控制信号,应选用下列哪中逻辑电路(B)。
A.与门 B.和门C.与非门D.和非门7.在某一存储器系统中,设有只读存储器16KB,随机存储器48KB,用16根地址线来寻址,如只读存储器位于低地址段,则其地址范围是(C)。
A. 0000H—2BFFHB. 0000H—0FFFHC. 0000H—3FFFHD. 0000H—4AFFH8.键盘硬中断的类型号是9,它对应的中断向量指针是( 0000:0024H )。
(包括段地址和徧移量)9.在给接口编址的过程中,如果有5根地址线没有参加译码,则可能产生(32)个重叠的地址。
10.某8254A定时器/计数器0的CLK0输入时钟频率是1MHz,要求的定时时间是10ms,则定时器/计数器0的定时常数应该是(10000)二.简答题(每小题5分,共40分)1.什么是端口?8086共有多少端口?答:一个I/O地址称为一个端口;8086共有65536个端口。
2.请用74LS138设计一个产生308H~30FH的PC机译码电路。
答:3.请简述在8254A定时器/计数器中,什么是硬件触发和软件触发?答:软件触发特点:8253A初始化后,只要写入定时/计数常数,8253A就开始计数.。
微机接口大作业
tim_wr_buffer[7] = tim_rd_buffer[7];//year
PCF8583_write_n_byte(1,2,tim_wr_buffer,8);
}
void PCF8583_jian_time()//减1分钟
PCF8583_respons();
if(!tim_ack)
{
tim_err = 1;
PCF8583_stop();
return;
}
temp++;
n_byte--;
}
PCF8583_stop();
}
void PCF8583_read_n_byte(unsigned char add,unsigned char com,unsigned char n_byte)
unsigned charday;
unsigned charweekday;
unsigned charmonth;
unsigned intyear;
} time;
sbit tim_sda=P1^0;
sbit tim_scl=P1^1;
sbit sbDIN= P3^5; //MAX7219的数据引脚
sbit sbLOAD = P3^6; //MAX7219的控制引脚
模拟电脑显示数据
C语言程序:
#include <reg51.h>
#include <intrins.h>
#include <I2Clib.c>
#include <stdio.h>
struct time
计算机接口技术大作业
计算机接口技术大作业LT哈尔滨工业大学本科毕业设计(论文)哈尔滨工业大学本科毕业设计(论文)摘要学习计算机组成原理和计算机接口技术之中,“中断”是一个必须要学习的美容,计算机之所以能够“智能”的运行起来使得其更容易被人使用很重要的一点就是有了中断技术。
因为中断计算机从一个只靠计算速度和存储量来来博得人们喜爱的机器变成了一个用户有好的聪明的机器。
本文将从几个问题入手来来逐一介绍计算机中断技术和中断系统。
一:什么是中断?1.1 中断的定义在计算机科学中,中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。
发出这样的信号称为进行中断请求(interrupt request,IRQ)。
硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。
中断在计算机多任务处理,尤其是实时系统中尤为有用。
这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。
上面是来自维基百科对中断定义。
个人认为中断就是计算机在执行程序的过程中,当出现异常情况或者是特殊请求时,计算机停止执行现行程序的运行,转向对这些异常情况或特殊请求的处理,处理后再返回到现行程序的间断处,继续执行原程序,这就是中断。
哈尔滨工业大学本科毕业设计(论文)图1.1中断处理过程打一个不太恰当的比方。
比如说你正在看书那么你就是CPU,看书就相当于你正在执行的程序,当你电话响了或者是有其他的事情发生导致你必须停下正在看的书去做另一件事(接电话)。
那么这就是一个中断,在这个中断中现行程序是看书,中断时电话响了,CPU是你自己。
当你接完电话之后(假设接完电话就没其他特殊的事了)那么你就回去看书,也就相当于定义中的返回执行原程序。
接口大作业
基于8088的电子钟设计-----《微控制器与微处理器原理》综合设计数媒08作者: XXX学号:030508概述文章从对《微机原理与接口技术》教材内容与计算机技术的近期发展的关联、比较中,指出该课程的教学重点。
针对我们学生的畏难情绪和缺乏兴趣“学习通病”,提倡“模块记忆”和“形象比喻教学”。
还主张把配套的课程实验划分为验证性实验、设计性实验和综合提高性实验,分别拟定教学目的和要求、编写实验指导书,达到逐级提高我们学生解决实际问题能力的目的。
引言:1978年Intel公司开发出比8086性能更出色的8088处理器,并成功将其销售给IBM全新个人计算机部门,使得8088成为全新热销的IBM PC的大脑。
从8088开始,个人计算机的概念开始在全世界范围内发展起来。
标志着一个新时代的开始。
虽然处理器的发展速度非常迅猛,但是作为里程碑式的8088,仍然作为实验工具被使用。
本文就是基于8088处理器的电子钟的开发。
本实验利用Protel绘制原理图,使用微机原理仿真试验箱,利用系统提供的8253计数器/定时器,中断器8259,6个LED实现了电子钟的基本功能,在电子钟上显示时,分,秒,并具有设置时间,计时,闹钟的功能。
使用汇编语言进行编程。
Abstract:In 1978 Intel Corporation developed 8088 processors. The 8088 processor is more superior than the 8086 processor. The Intel Corporation sold the 8088 processor to the PC department of IBM. Then the concept of PC started to develop all over the world. Even the development of processors is fast, the classical 8088 processor is still used in the experiments. This paper is about the development of eletron clock based on the 8088 processor.This paper ueses Protel to draw the schematic diagram and uses the microcomputer simulation texting box including the 8253 counter/timer,8259 interrupter and six LEDs to realize the basic function of electron clock. The electron clock can display the hour , the minute and the second. It can set the time and count .It can also have the function of alarm clock. This paper uses compiling language to program.一、总设计:1设计内容利用TDS—MD微机实验系统设计数字电子钟及钟控显示装置软硬件。
吉林大学2019-2020学年第一学期期末考试《计算机接口技术》大作业参考答案
吉林大学网络教育学院2019-2020学年第一学期期末考试《计算机接口技术》大作业学生姓名专业层次年级学号学习中心成绩年月日作业完成要求:大作业要求学生手写,提供手写文档的清晰扫描图片,并将图片添加到word 文档内,最终wod文档上传平台,不允许学生提交其他格式文件(如JPG,RAR等非word 文档格式),如有雷同、抄袭成绩按不及格处理。
一、简答题(每小题8分,共80分)1、计算机I/O接口有何用途?试列出8个I/O接口。
答:计算机I/O接口是连接计算机和外部设备的纽带和桥梁,它主要用于协调和控制计算机与外设之间的信息流通和交换。
例如:串行通讯口(COM口)、并行打印机口、软盘驱动器接口、硬盘驱动器接口、光驱接口、显示器接口、音响设备接口、其它通用设备接口(USB、SCSI等)。
2、简述系统总线,AGP总线,PCI总线及ISA总线的作用。
答:系统总线是CPU与存储器及桥接器之间传递信息的通道,AGP总线专门用与连接CPU与显示器适配器,PCI总线一般用于连接一些高速外设接口作为高速外设与CPU或内存交换信息的通道,而ISA总线一般用于连接一些非高速外设接口作为非高速外设与CPU或内存交换信息的通道。
3、存储单元的选择由什么信号控制?读、写靠什么信号区分?答:存储单元的选择由地址信号控制,而对存储单元进行读操作还是写操作则要靠读、写信号区分。
4、详细叙述总线缓冲器的作用。
答:总线缓冲器的作用主要是控制各路数据在总线上的交叉传送避免相互冲突,当几路数据都要向总线上传送时,就通过各路的缓冲器来解决,当一路传送时,缓冲器使其它各路数据与总线断开。
5、锁存器和寄存器有什么不同?答:锁存器与寄存器都是用来暂存数据的器件,在本质上没有区别,不过寄存器的输出端平时不随输入端的变化而变化,只有在时钟有效时才将输入端的数据送输出端(打入寄存器),而锁存器的输出端平时总随输入端变化而变化,只有当锁存器信号到达时,才将输出端的状态锁存起来,使其不再随输入端的变化而变化。
计算机接口技术大作业
计算机接口技术大作业课题名称:单路中断方式A/D采集及8355LED显示驱动班级:B13082041姓名:高炼学号:132208100055一.技术要求及说明1.一路检测,在LED上显示。
2.判断上下限并区别显示,下限LED全灭,上限LED全亮。
二.硬件原理及说明1.8259芯片内部结构原理如图2. 8255A内部结构8255芯片编程模型A口方式控制输出结构图8255方式选择控制字3.ADC0809内部结构图ADC0809通道选择表如图74HC138的作用:就是选择芯片时用的,提供芯片的入口地址74HC138集成译码器原理图5.电位器作用电位器的作用就是产生模拟信号,输送到模数转换器,然后模数转换器将模拟信号转变为数字信号。
6.LED灯LED灯的亮灭由8255的PA口控制,8个PA口中输出高电平的PA口对应的LED灯就会发光。
三.总体流程及重要子程序流程设计与分析四.收获与体会模数转换,电位器产生模拟信号,产生的模拟信号就通过模数转换器转变成数字信号,产生的数字信号输入到8259中断控制器中,使8259在适当的时候产生中断,通过中断控制8255的工作方式,而译码器的作用就是提供每个芯片的入口地址。
五.程序清单程序源代码:#define PA8255 0x8000 //8255 PA输出地址#define CTL8255 0x8003#define CS0809 0x9000#define mode 0x82#define ICW1 0x13 //单片8259, 上升沿中断, 要写ICW4#define ICW2 0x20 // 中断号为20H#define ICW4 0x01 // 工作在8086/88 方式#define OCW1 0xfe // 只响应INT0 中断#define CS8259A 0xd000#define CS8259B 0xd001extern unsigned char IN(unsigned int port);extern void OUT(unsigned int port, unsigned char v); extern void DISABLE(void);extern void ENABLE(void);extern void SETINT(unsigned char NO, unsigned int *ENTER); unsigned char buf;unsigned char Read0809(){unsigned char i;OUT(CS0809, 0); //起动A/Dfor (i=0; i<0x80; i++) ; //延时>100usreturn(IN(CS0809)); //读入结果}interrupt IEnter(){if(buf == 0x00) //下限{OUT(PA8255, 0x00);}else if(buf == 0xff) //上限{OUT(PA8255, 0xff);}else{OUT(PA8255, 0x3c);}OUT(CS8259A, 0x20); //中断服务程序结束指令}void IInit() //初始化{OUT(CS8259A, ICW1);OUT(CS8259B, ICW2);OUT(CS8259B, ICW4);OUT(CS8259B, OCW1);}void main(){OUT(CTL8255,mode);DISABLE(); //关闭中断响应IInit();SETINT(ICW2, &IEnter); //中断入口地址ENABLE(); //打开中断响应while (1){buf = Read0809();}叮叮小文库}欢迎有需要的朋友下载!!11。
微原大作业
微机原理与接口技术 ----大作业2016.6.24大作业:微处理器系统应用设计ARM微处理器系统32位数据总线(D31-D0)、32位地址总线(A31-A0)和控制线RD、WE、0BE和IRQ0。
要求存储器容BE、1BE、2BE、3量为1GB,其中ROM存储区512MB,从0x00000000开始的连续存储区,采用128MB ROM芯片;RAM存储区512MB,采用128MB SRAM 芯片,从0x20000000开始的连续存储区。
SRAM和ROM芯片通过总线与ARM微处理器系统相连;I/O接口为一片8282锁存器、一片七段数码管(共阴极)、一个按键,如下图所示;数码管通过8282锁存器与PA口相连,按键与ARM微处理器IRQ0相连。
每按一次键,通过中断方式在数码管显示其加1后的值(显示值为9时加1后显示0)。
数码管初值为本人学号的最后一位。
编写完成上述处理程序。
处理程序中采用子程序进行数码显示,中断方式实现按键处理,中断服务程序包括显示子程序。
IRQ0图8282锁存器接口图0-9数码管显示字样:要求:1、给出设计的RAM和ROM地址范围及必要说明;2、画出采用基本逻辑门(与、或、非门类)设计译码电路的微处理器总线与存储器连接图;3、画出完成上述处理程序流程图,并做必要的说明;4、程序从地址0x400处启动,给出完整处理程序清单,并有必要的注释。
一.ROM和RAM设计ROM区芯片个数:512M/128M=4片起始地址:0x00000000终止地址:0x1FFFFFFFROM芯片地址线:A[0:26]RAM区芯片个数:512M/128M=4片起始地址:0x20000000终止地址:0x3FFFFFFFRAM 芯片地址线:A[0:26]128MB = 134217728 B = B因此需要27位的地址总线访问存储器地址总线分配: A0~A26 作为存储器地址 A29 A28 A27 作为片选信号272二.电路图设计A29A30A31D[0:31]三.处理程序流程图四.处理程序清单Startup.s------------------------------------------------AREA RESET,CODEEXPORT __VectorsEXPORT Reset_Handler__VectorsDCD __initial_spDCD Reset_HandlerSPACE 14*4SPACE 6*4DCD EXTI0_HandlerReset_Handler PROCIMPORT EX4_EXTIldr r1,=EX4_EXTIbx r1B .ENDPEXTI0_Handler PROCIMPORT EXTI0_Cldr r1,=EXTI0_Cbx r1BX LRENDPAREA STACK,DATASPACE 0x100__initial_spENDMyhead.h---------------------------------------------------------------------- struct _RCC{IntCR;int CFGR;int CIR;int APB2RSTR;int APB1RSTR;int AHBENR;int APB2ENR;int APB1ENR;int BDCR;int CSR;};#define RCC ((volatile struct _RCC *)0x40021000)struct _GPIO{int CRL;int CRH;int IDR;int ODR;int BSRR;};#define GPIOB ((volatile struct _GPIO *)0x40010C00) #define GPIOA ((volatile struct _GPIO *)0x40010800)struct _USART{int SR;int DR;int BRR;int CR1;int CR2;int CR3;};#define USART1 ((volatile struct _USART *)0x40013800)struct _NVIC{int ISER[8];int rsv0[24];int ICER[8];int rsv1[24];int ISPR[8];int rsv2[24];int ICPR[8];int rsv3[24];int IABR[8];int rsv4[56];char IPR[240];int rsv5[644];int STIR;};#define NVIC ((volatile struct _NVIC *)0xE000E100)struct _BTIM{int CR1;int CR2;int rsv0;int DIER;int SR;int rsv1[4];int CNT;int PSC;int ARR;};#define TIM1 ((volatile struct _BTIM *)0x40012C00)struct _DMA_CH{int CCR;int CNDTR;int CPAR;int CMAR;int rsv;};struct _DMA{int ISR;int IFCR;struct _DMA_CH CH[7];};#define DMA1 ((volatile struct _DMA *)0x40020000) #define DMA2 ((volatile struct _DMA *)0x40020400)struct _AFIO{int EVCR;int MAPR;int EXTICR[4];int RESERVED0;int MAPR2;};#define AFIO ((volatile struct _AFIO *) 0x40010000)struct _EXTI{intIMR;int EMR;int RTSR;int FTSR;int SWIER;int PR;};#define EXTI ((volatile struct _EXTI *) 0x40010400 )Myfunction.c--------------------------------------------------------------------------------------------------- #include "Myhead.h"void RCC_Init(){RCC->APB2ENR|=((1<<3)|(1<<2)|(1<<0)); //PB PA AFIOGPIOB->CRL=0x88008; //设置PE3 PE4}void LED_Init(){GPIOA->CRL=0x33333333; //设置输出GPIOA->ODR|=(1<<5); //首先让数码管熄灭}void KEY_Init(){GPIOB->CRL=0x8; //按键设置GPIOB->ODR=0;}void AFIO_Init(){AFIO->EXTICR[0]=0x1; //PB0 TO EXTI0}void EXTI_Init(){EXTI->IMR=0x1; // EXTI0 使能EXTI->FTSR=0x1; // EXTI0 增加}void EXTI_Clear(){EXTI->PR=0x1; // EXTI0 除能}void NVIC_Init(){NVIC->ISER[0]=0xFFFFFFFF; // EXTI0 使能}void LED_Start(){GPIOA->ODR = 0xB6; //显示我的号尾数5 }void LED_On(){int t;t=GPIOA->ODR;if(t==0xFC) GPIOA->ODR=0x60; //0->1if(t==0x60) GPIOA->ODR=0xDA; //1->2if(t==0xDA) GPIOA->ODR=0xF2; //2->3if(t==0xF2) GPIOA->ODR=0x66; //3->4if(t==0x66) GPIOA->ODR=0xB6; //4->5if(t==0xB6) GPIOA->ODR=0xBE; //5->6if(t==0xBE) GPIOA->ODR=0xE0; //6->7if(t==0xE0) GPIOA->ODR=0xFE; //7->8if(t==0xFE) GPIOA->ODR=0xF6; //8->9if(t==0xF6) GPIOA->ODR=0xFC; //9->0}void EXTI0_C(){LED_On();}int EX4_EXTI(){RCC_Init();LED_Init();KEY_Init();AFIO_Init();EXTI_Init();NVIC_Init();for(;;){}return 0; }。
微机原理与接口技术、单片机、交通灯、信号灯大作业程序
微机原理与接⼝技术、单⽚机、交通灯、信号灯⼤作业程序ORG 0000HAJMP MAINORG 000BHAJMP TOINTMAIN: MOV SP, #30HMOV DPTR, #0100H ;书MOV A, #03HMOVX @DPTR,ASETB F0MOV 53H, #0AHMOV R1, 53HMOV R4, #01HMOV 54H, #0FHMOV R2, 54HMOV R5, #14HMOV R3, #00HMOV TMOD, #01HMOV TH0, #0D2HMOV TL0, #94HMOV IE, #10000010BSETB TR0MOV P1, #00100001BKEY: ORL P3,#0FFHMOV A,P3CJNE A,#0F0H,KLPLJMP DIRKLP: ACALL DEL1ORL P3,#0FFHMOV A,P3MOV 56H,ACJNE A,#0F0H,KLP1LJMP DIRKLP1: ORL P3,#0FFHMOV A,P3CJNE A,#0F0H,KLP1ACALL DEL1ORL P3,#0FFHMOV A,P3CJNE A,#0F0H,KLP1MOV P1,#00010010BMOV R3,#05HMOV R4,#03HSETB 20H.0LJMP DIRDIR: ACALL CAI ;ACALL DISPLAYSJMP KEYCAI: MOV R0, #70HCJNE R4,#01H,LOOPMOV A,R1LJMP CAI1LOOP: CJNE R4,#02H,LOOP4MOV A,R2LJMP CAI1LOOP4: MOV A,R3CAI1: MOV 50H,ADIV ABMOV R0,#70HMOV @R0, BINC R0MOV @R0, ARETDISPLAY: MOV R0, #70HMOV R6, #0FEHACALL DIS4INC R0ACALL DIS4RETDIS4: MOV R7,#04HMOV A, @R0RL ARL AMOV 50H, ALP: MOV DPTR, #0102HMOV A, #0FFHMOVX @DPTR, AMOV DPTR, #DTABMOV A, 50HINC 50HMOVC A, @A+DPTRMOV DPTR, #0101HMOVX @DPTR, AMOV DPTR, #0102HMOV A, R6MOVX @DPTR, ARL AMOV R6, AACALL DELDJNZ R7, LPRETDEL: MOV 51H, #02HDL0: MOV 52H, #0FEHDL1: DJNZ 52H, DL1DJNZ 51H, DL0RETDEL1: MOV 51H, #18HDL10: MOV 52H, #0FEHDL11: DJNZ 52H, DL11DJNZ 51H, DL10RETDTAB: DB 83H,7DH,7DH,83H ;0DB 0FDH,01H,0BDH,0FFH ;1DB 9DH,7DH,6DH,0B1H ;2DB 93H,6DH,6DH,0BBH ;3DB 0F7H,81H,0D7H,0E7H ;4DB 73H,6DH,6DH,1DH ;5DB 0B3H,6DH,6DH,83H ;6DB 3FH,41H,7FH,3FH ;7DB 93H,6DH,6DH,93H ;8DB 83H,6DH,6DH,9BH ;9TAB1: DB 00H,16H,32H,48H,64H,80H,96HTAB3: DB 0BFH,03H,0BFH,0DFH,9CH,6BH,67H,00H ;红个DB 0EFH,81H,0EFH,0EFH,9CH,6BH,67H,00H ;红⼗DB 0BFH,03H,0BFH,0DFH,71H,7BH,7DH,81H ;绿个DB 0EFH,81H,0EFH,0EFH,71H,7BH,7DH,81H ;绿⼗TOINT: MOV TH0, #0D2HDJNZ R5, BACKCJNE R3, #00H, YELSJMP ADBACK: RETIBACK1: MOV R5,#14HRETIAD: JB F0, REDSJMP GREENRED: DJNZ R1, BACK1RED1: MOV P1, #00010010B MOV R3, #05HMOV R1, #0AHMOV R4, #03HLJMP BACK1YEL: DJNZ R3, BACK1JB 20H.0, YEL1JB F0, RYELLJMP GYEYRYEL: MOV P1, #00001100B MOV R4, #02HCPL F0LJMP BACK1GYEY: MOV P1, #00100001B MOV R4, #01HCPL F0LJMP BACK1GREEN: DJNZ R2, BACK1 GREEN1: MOV P1, #00010010B MOV R3, #05HMOV R2, #0FHMOV R4, #03HLJMP BACK1YEL1: CLR 20H.0MOV P1,#00001001BCLR TR0JIANZHI:MOV A,56HCJNE A,#0F1H,KNEXTINC 55HMOV A,55HMOV P1,#00001001BCJNE A,#03H,SLPMOV 55H,#00HORL P3,#0FFHMOV A,P3SLP2: ORL P3,#0FFHMOV A,P3MOV 56H,ACJNE A,#0F0H,SLP8LJMP SLP2SLP8: ACALL DEL1ORL P3,#0FFHMOV A,P3MOV 56H,ACJNE A,#0F0H,SLP9LJMP SLP2SLP9: ORL P3,#0FFHMOV A,P3CJNE A,#0F0H,SLP9ACALL DEL1ORL P3,#0FFHMOV A,P3CJNE A,#0F0H,SLP9MOV A,56HCJNE A,#0F2H,SLP1MOV R4,#01HSETB F0MOV P1,#00100001BLJMP JIESUSLP1: CJNE A,#0F4H,SLP2MOV R4,#02HMOV P1,#00001100BCLR F0LJMP JIESUJIESU: SETB TR0MOV TH0, #0D2HMOV TL0, #94HMOV R5,#14HMOV R1, 53HMOV R2, 54HMOV R7,04HRETISLP: LJMP DIR1KNEXT: MOV A,55HCJNE A,#01H,KNEXT1MOV A,56HCJNE A,#0F2H,KNEXT02MOV P1,#00001001BLJMP SCANKNEXT02:CJNE A,#0F4H,KNEXT03 MOV P1,#00100001BLJMP SCANKNEXT03:MOV P1,#00001100B LJMP SCANKNEXT1: MOV A,56HCJNE A,#0F2H,KNEXT12INC 57HMOV A,57HCJNE A,#05H,KNE1LMOV 57H,#01HKNE1L: LJMP DIR1KNEXT12:MOV A,57HCJNE A,#01H,KNEXT122MOV A,53HMOV B,#0AHDIV ABMOV 58H,BMOV 59H,AACALL ZENGJMOV B,#0AHMOV A,59HMUL ABADD A,58HMOV 53H,ALJMP DIR1KNEXT122:CJNE A,#02H,KNEXT123 MOV A,53HMOV B,#0AHDIV ABMOV 58H,AMOV 59H,BACALL ZENGJMOV B,#0AHMOV A,58HMUL ABADD A,59HMOV 53H,ALJMP DIR1KNEXT123:CJNE A,#03H,KNEXT124 MOV A,54HMOV B,#0AHDIV ABMOV 58H,BMOV 59H,AACALL ZENGJMOV B,#0AHMOV A,59HMUL ABADD A,58HMOV 54H,ALJMP DIR1KNEXT124:MOV A,54HMOV B,#0AHDIV ABMOV 58H,AMOV 59H,BACALL ZENGJMOV B,#0AHMOV A,58HMUL ABADD A,59HMOV 54H,ALJMP DIR1DIR1: MOV A,56HCJNE A,#0F1H,DLPDLP1: MOV A,55HDLP7: RL ARL AMOV 50H,AMOV R6,#0FEHMOV R7,#04HDLP10: MOV A,50HMOV DPTR, #0102HMOV A, #0FFHMOVX @DPTR, AMOV DPTR, #DTABMOV A, 50HINC 50HMOVC A, @A+DPTRMOV DPTR, #0101HMOVX @DPTR, AMOV DPTR, #0102HMOV A, R6MOVX @DPTR, ARL AMOV R6, AACALL DELDJNZ R7, DLP10LJMP SCANDLP: MOV A,55HCJNE A,#01H,DLP2LJMP DLP1DLP2: MOV A,56HMOV A,57HDEC ARL ARL ARL AMOV R6,#0FEHMOV R7,#08HMOV 50H,ADLP8: MOV DPTR, #0102H MOV A, #0FFHMOVX @DPTR, AMOV DPTR, #TAB3MOV A, 50HINC 50HMOVC A, @A+DPTR MOV DPTR, #0101H MOVX @DPTR, AMOV DPTR, #0102H MOV A, R6MOVX @DPTR, ARL AMOV R6, AACALL DELDJNZ R7, DLP8LJMP SCANDLP3: MOV A,57HCJNE A,#01H,DLP4MOV A,53HMOV B,#0AHDIV ABMOV 58H,BMOV A,58HLJMP DLP7DLP4: CJNE A,#02H,DLP5 MOV A,53HMOV B,#0AHDIV ABLJMP DLP7DLP5: CJNE A,#03H,DLP6 MOV A,54HMOV B,#0AHDIV ABMOV 58H,BMOV A,58HLJMP DLP7DLP6: MOV A,54HMOV B,#0AHDIV ABLJMP DLP7SCAN: ORL P3,#0FFH MOV A,P3CJNE A,#0F0H,SLP5 LJMP DIR1SLP5: ACALL DEL1ORL P3,#0FFHMOV A,P3MOV 56H,ACJNE A,#0F0H,SLP6 LJMP DIR1SLP6: ORL P3,#0FFH MOV A,P3ORL P3,#0FFH MOV A,P3CJNE A,#0F0H,SLP6 LJMP JIANZHI ZENGJ: MOV A,56H CJNE A,#0F4H,JIAN INC 58HMOV A,58HCJNE A,#0AH,ZLP0 MOV 58H,#00H RETJIAN: DEC 58H MOV A,58HCJNE A,#0FFH,ZLP0 MOV 58H,#09H ZLP0: RETEND。
微型计算机接口技术 大作业
小组成员:赖…,欧…,李…..一、设计任务及要求编写一实现电子琴的程序,并实现若干扩展功能。
基本功能:用8257键盘输入对应的七个音阶,通过实验箱的喇叭发出声音,并通过七段数码管显示输入音阶;扩展功能:1、录音:记录所弹奏曲目2、放录音:任意时刻重放最新记录曲目3、在程序中可预设一曲目,按一键实现播放该曲目。
4、在播放录制曲目或预设曲目时,按8279键盘上任意键可以暂停播放,再按一次从暂停处继续播放。
5、程序运行时有友好的用户介面二、元件与仪器介绍本设计所要用到的元器件有:计时器8253,使用8088芯片的键盘控制器,并行控制器8255A,实验箱。
2.1 8253的介绍8253是可编程的计数器/定时器,其内部有三个独立的16位计数器/定时器通道,每个计数器通道均可按6种不同的方式工作,并且都可以按二进制或十进制计数。
2.1.1 8253的工作原理8253是可编程的计数器/定时器,其CLK0~CLK2是计数器0~2的时钟脉冲输入端, GATE0~GATE2是门控脉冲输入端, OUT0~OUT2是输出端及内部结构见下图。
当用8253做外部事件计数器时,在CLK端所加的计数脉冲由外部事件产生,这些脉冲的间隔可以不相等。
如果要用它做定时器,则CLK端应输入精确的时钟脉冲。
这时, 8253所能实现的定时时间决定于计数脉冲的频率和计数器的初值,即定时时间=时钟脉冲周期t c ×预置的计数初值n8253的控制逻辑由5个控制信号WR、CS、A1和A0组成,对应的操作见表1。
8253编程时,要对其控制字寄存器写入相应的控制字,控制字寄存器格式如表2所示。
其中: SC1, SC0———通道选择位。
为00, 01, 10分别表示选择0, 1, 2通道。
RL1, RL0——读/写操作位。
00 表示锁存数据,可随时读取计数器中的计数值; 01 表示只读/写低8位,高8位自动置为0; 10表示只读/写高8位,低8位自动置为0; 11表示读/写16位数据,先低8位,后高8位。
微机接口作业及答案
《微型计算机原理与接口技术》部分作业及补充题参考答案第7章存储器系统P2176.某SRAM存储芯片,其字位结构为512K×8bit,试问其地址、数据引脚各是多少个?答:∵219=512K,所以地址引脚需19根;数据引脚需8根(8bit)。
8.现有1024×1bit的存储芯片,若用它组成容量为16K×8bit的存储器。
试求:(1)实现该存储器所需的芯片数量答:(16K×8bit)/(1K×1bit)=128片(2)该存储器所需地址的地址码总位数是多少?其中几位选片?几位用作片内地址?答:∵214 =16K,所以地址码总位数为14位。
而1024×1bit存储芯片需要地址10位,因此选片地址为4位,片内地址为10位。
第8章输入/输出系统P2442.接口电路的作用是什么?I/O接口应具备哪些功能?参见教材P2193.什么是端口?端口有几类?参见教材P220 8.1.2 输入输出端口4.I/O端口有哪两种编址方式?PC系列机采用哪种编址方式?答:I/O端口和存储单元统一编址及I/O端口独立编址两种。
PC机采用I/O端口独立编址。
7. 定时/计数器的3个通道在PC系列机中是如何应用的?答:0#计数器用于系统时钟中断;1#计数器用于动态存储器刷新定时;2#计数器用于发声系统音调控制。
10.系统机定时/计数器的通道0定时周期最长是多少?要实现长时间定时,应采取什么措施?如果采用外扩8254定时/计数器实现长时间定时,应采取哪些措施?答:系统机定时/计数器通道0定时周期最长是55ms。
要实现长时间定时,只能使用 INT 1CH 中断的方法,通过对预先设定的中断次数进行计数,达到n倍55ms的定时目的。
采用外扩8254,可以使用三个通道硬件级联的方法实现长时间定时。
补充题:设PC 系统机外扩了一片8254 及相应的实验电路。
(1) 根据由门电路构成的译码电路,分析出该片8254 的四个端口地址。
(完整版)微型计算机接口技术及应用习题答案(刘乐善)
习题一1.什么是接口?接口就是微办理器 CPU 与外面世界的连结零件,是 CPU 与外界进行信息互换的中转站。
2.为何要在 CPU 与外设之间设置接口?在 CPU 与外设之间设置接口主要有 4 个原由:(1)CPU 与外设二者的信号不兼容,包含信号线的功能定义、逻辑定义和时序关系(2)CPU 与外设的速度不般配,CPU 的速度快,外设的速度慢(3)若不经过接口,而由CPU 直接对外设的操作实行控制,会使CPU 处于穷于对付与外设打交道之中,大大降低CPU 的效率(4)若外设直接由CPU 控制,会使外设的硬件构造依靠于CPU,对外设自己的发展不利。
3.微型计算机的接口一般应具备那些功能?微机的接口一般有以下的几个功能:(1)履行CPU命令的功能:CPU将对外设的控制命令发到接口电路中的命令寄存器(命令口)中,在经剖析去控制外设(2)返回外设状态的功能:经过状态寄存器(状态口)达成,包含正常工作状态和故障状态(3)数据缓冲的功能:接口电路中的数据寄存器(数据口)对CPU 于外设间传递的数据进行中转(4)设施寻址的功能:CPU某个时辰只好和一台外设互换数据,CPU 发出的地点信号经过接口电路中的地点译码电路来选中I/O 设施(5)信号变换的功能:当CPU 与外设的信号功能定义、逻辑关系、电平高低及工作时序不兼容时接口电路要达成信号的变换功能(6)数据宽度与数据格式变换的功能:因为CPU 办理的数据都是并行的,当外设采纳串行传递方式时,接口电路就要达成串、并之间的变换,并进行数据格式的变换。
4.接口技术在微机应用中起的作用?跟着计算机技术的高速发展,计算机的应用愈来愈宽泛。
但是,在微机系统中,微办理器的强盛功能一定经过外面设施才能实现,而外设与微办理器之间的信息互换和通讯又是靠接口来实现的,因此,接口技术成为了一门重点技术,它直接影响微机系统的功能和微机的推行应用。
5.接口电路的硬件一般由哪几部分构成?接口电路的硬件一般由以下几部分构成:(1)基本逻辑电路:包含命令寄存器、状态寄存器和数据缓冲寄存器,是接口电路中的中心(2)端口地点译码电路:实现设施的选择功能(3)供选电路:依据不一样任务和功能要求而增添的功能模块电路。
微机原理与接口技术作业1
一、单选题第1题(1分)你的得分:1下面的数值表示中,和127相等的是【1】。
A. 11111111BB. 127HC. 80HD. 7FH题目答案:D你的答案:D第2题(1分)你的得分:1下面【2】命题是正确的。
A. 负数的反码与其真值数相同B. 负数的补码与其真值数相同C. 正数的原码、反码、补码与其真值数相同D. [+0]反=11111111B 题目答案:C你的答案:C第3题(1分)你的得分:1采用十六进制书写二进制数,位数可以减少到原来的【3】。
A. 1/2B. 1/3C. 1/4D. 1/5题目答案:C你的答案:C题目分析:一位十六进制数可以用四位二进制来表示,所以采用十六进制书写二进制数,位数可以减少到原来的1/4。
第4题(1分)你的得分:1计算机内机器数通常采用【4】形式来表示。
A. 原码B. 反码C. 补码D. ASCII码题目答案:C你的答案:C题目分析:计算机内机器数通常采用补码形式来表示;而字符则采用ASCII码表示。
第5题(1分)你的得分:1下列不同数制表示的数中,数值最小的是【5】。
A. 11011101BB. 334QC. 219DD. DAH题目答案:D你的答案:D题目分析:A. 11011101B=221B. 334Q=220C. 219D=219D. DAH=218第6题(1分)你的得分:1下面几个不同进制的数中,最小的数是【6】。
A. 1001001BB. 75C. 37DD. A7H题目答案:C你的答案:C题目分析:A. 1001001B=73B. 75=75C. 37D=37D. A7H=167第7题(1分)你的得分:0下列数中最大的数是【7】。
A. 10000011BB. (10010101)BCDC. 92HD. 101 题目答案:C你的答案:B题目分析:A. 10000011B=131B. (10010101)BCD=95C. 92H=150D. 101第8题(1分)你的得分:1将93H看成一个组合BCD码,其结果是【8】。
计算机接口技术大作业
计算机接口技术大作业班级:姓名:学号:指导老师:设计内容:总结计算机接口技术发展,CPU可以选择8086或者单片机,应用所学芯片(不限于)8255、8251、8253、8237、8259、0809、0832、8279及总线接口相关知识,设计一套系统或一个小装置。
要求至少用到以上三款芯片或接口技术,提倡在proteus 中仿真,然后到实验室验证。
计算机接口技术发展微机系统中,接口处于微机总线与设备之间,进行CPU与设备之间的信息交换。
设置接口的目的有两条:通过接口实现设备与总线的连接;连接起来以后,CPU通过接口对设备进行访问,即操作或控制设备。
接口技术的基本内容包括设备接口设计和应用程序设计,实现把设备连接到用户总线(ISA)和完成对设备在应用层的访问。
接口技术的新内容包括总线接口设计和设备驱动程序设计,实现把用户总线(ISA)连接到PCI总线和完成对设备在windows操作系统核心层的访问。
设备驱动程序的程序结构,编程语言,开发工具和程序设计,调试,安装方法与应用程序完全不同,是现代微机接口技术的新内容。
接口技术的发展是随着微机体系结构(CPU,总线,存储器)和被连接的对象,以及操作系统应用环境的发展而发展的。
当接口的两端及应用环境发生了变化,作为中间桥梁的接口也必须发生变化。
这种变化与发展,过去是如此,今后仍然如此。
早期的计算机系统,接口与设备之间无明显的边界,接口与设备控制器做在一起。
到8位微机,在接口与设备之间有了边界,并且出现了许多接口标准。
早期计算机系统中并没有设置独立的接口电路,对外设的控制和管理完全由CPU直接操作。
由于微机技术的发展,其应用越来越广泛,外设品种和门类大大增加,且性能各异,操作复杂,因此,不设接口就不行了。
为了解决矛盾,开始在CPU与外设之间设置了简单的接口电路,后来逐步发展成为独立功能的接口和设备控制器,把对外设的控制任务交给接口去完成,这样大大减轻了主机的负担,简化了CPU对外设的控制和管理。
完整word版计算机接口技术大作业
苏州科技学院电子与信息工程学院《计算机接口技术》大作业业:电子信息工程专级:班姓名:号:学月6年20121.设计内容:应用所学芯片8255、8251、8253、8237、8259、0809、0832及总线接口相关知识,在proteus中设计一套系统或一个小装置。
要求至少用到以上三款芯片或接口技术。
2.考核要求:1、设计具有基本完整的功能,具有可实现性;2、强调创新性和应用性,不与现有系统、产品雷同;3、硬件设计要求详尽,软件设计可以限于主要功能和关键部分4、自拟题目,题目要求新颖硬件设计3.3.1 设计思想硬件电路的搭建主要由8255A、8251和8253组成,利用地址译码器将8086芯片的端口地址分隔开,然后分给各个芯片。
3.2主要元器件介绍3.2.1 8255A模型页1第:各引脚功能如下采用双列直插式封装,共有40个引脚,8255 用来传送数据信息。
与单片机数据总线连接,D0--D7:三态双向数据线, CS:片选信号线,低电平有效,表示芯片被选中。
RD:读出信号线,低电平有效,控制数据的读出。
WR:写入信号线,低电平有效,控制数据的写入。
+5V电源。
Vcc: /输出线。
PA0--PA7:A口输入 /输出线。
:B口输入PB0--PB7 输出线。
口输入:C/PC0--PC7 :复位信号线。
RESET 内部端口。
A0:地址线,用来选择8255A1、:地线。
GND: 其控制逻辑为A1 A0 RD WR CS 工作状态A口数据-->数据总线0 0 0 1 0B口数据-->数据总线0 1 0 1 0C口数据-->数据总线1 0 0 1 0总线数据-->A口0 0 1 0 0总线数据-->B口0 1 1 0 0总线数据-->C口1 0 1 0 0总线数据-->控制字寄存器111页2第三态数据总线-->* * * 1 *1 非法状态0 1 0 1-->0 * 三态* 1 数据总线1//输出端口,两个工作方式控制电路,一个读8255内部包括三个并行数据输入8位总线缓冲器。
(完整版)微机原理与接口技术作业(含答案)
(完整版)微机原理与接⼝技术作业(含答案)o d 浙江⼤学远程教育学院《微机原理与接⼝技术》课程作业姓名:学号:年级:学习中⼼:第2章 P522.80C51单⽚机引脚有哪些第⼆功能?第⼀功能第⼆功能P0.0~P0.7 地址总线Ao ~A7/数据总线D0~D7 P2.0~P2.7 地址总线A8~A15 P3.0 RXD(串⾏输⼊⼝) P3.1 TXD(串⾏输出⼝) P3.2 INT0外部中断0) P3.3 IINT1(外部中断1)P3.4 TO(定时器/计数器0的外部输⼊) P3.5 T1(定时器/计数器0的外部输出) P3.6 WR(外部数据存储器或I /O 的写选通)P3.7 RD 外部数据存储器或I /O 的读选通)4.80C51单⽚机的存储器在结构上有何特点?在物理上和逻辑上各有哪⼏种地址空间?访问⽚内RAM 和⽚外RAM 的指令格式有何区别?1、80C5l 单⽚机采⽤哈佛结构,即将程序存储器和数据存储器截然分开,分别进⾏寻址。
不仅在⽚内驻留⼀定容量的程序存储器和数据存储器及众多的特殊功能寄存器,⽽且还具有较强的外部存储器扩展能⼒,扩展的程序存储器和数据存储器寻址范围都可达64 KB 。
2、在物理上设有4个存储器空间·⽚内程序存储器; ·⽚外程序存储器;·⽚内数据存储器;. ·⽚外数据存储器。
在逻辑上设有3个存储器地址空间●⽚内、⽚外统⼀的64 KB 程序存储器地址空间。
●⽚内256字节(80C52为384字节)数据存储器地址空间。
⽚内数据存储器空间在物理上⼜包含两部分:●对于80C51型单⽚机,0~127字节为⽚内数据存储器空间;128~255字节为特殊功能寄存器(SFR)空间(实际仅占⽤了20多个字节)。
●对于80C52型单⽚机,O ~127字节为⽚内数据存储器空间;128~255字节共128个字节是数据存储器和特殊功能寄存器地址重叠空间。
⽚外64 KB 的数据存储器地址空间。
微机原理与接口技术_大作业
课程设计报告课程:微机原理与接口技术题目:键盘扫描实验班级:学号:姓名:日期:一、设计目的通过本次课程设计,掌握8255芯片使用方法和编程方法,理解所学的芯片的原理、内部结构等,从而提高对芯片的综合运用能力,进一步掌握微机系统的软件、硬件设计的方法、设计步骤,掌握微机系统与接口扩展电路的设计方法,做到理论联系实际,提高动手能力和分析问题、解决问题的能力,理论联系实际,实现由学习知识到应用知识的初步过渡。
二、设计要求利用8255可编程并行口做一个键盘扫描实验,每一个键对应一个ASCII码,并实现在数码管上同一位显示。
三、设计思想8255是一种可编程并行I/O接口芯片,具有3个带锁存或缓冲的数据端口,它的并行数据宽度为8位,可与外设并行进行数据交换。
A口和B口内具有中断控制逻辑,在外设与CPU之间可用中断方式进行信息交换。
把8255并口和键盘,组成一个键盘装置,通过CPU对8255的控制最总达到键扫的目的,每一个键对应一个ASCII 码字符,通过8255的输入和输出,最终显示在屏幕上。
四、原理图1.芯片接线2.8255实验连线:3.按键ASCII码:A B1 C0 DF E五、程序框架1.主程序:2.键盘扫描程序:3.显示程序:六、程序代码;****************根据查看端口资源修改下列符号值*******************IOY0 EQU 9C00H ;片选IOY0对应的端口始地址;*****************************************************************MY8255_A EQU IOY0+00H*4 ;8255的A口地址MY8255_B EQU IOY0+01H*4 ;8255的B口地址MY8255_C EQU IOY0+02H*4 ;8255的C口地址MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDATA SEGMENTMES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$'DTABLE DB 3FH,77H,7CH,4FH,06H,6DH,7DH,39H,3FH,6FH,77H,5EH,39H,71H,79H,71H TT DB 0HDATA ENDSCODE SEGMENT ;数据段ASSUME CS:CODE, DS:DATASTART: MOV AX, DATAMOV DS, AXMOV DX, OFFSET MESMOV AH, 09HINT 21HMOV DX, MY8255_MODE ;控制字寄存器MOV AL, 81HOUT DX, ALBEGIN: CALL CLEAR ;调用清屏函数CALL CCSCAN ;键扫函数JNZ GETKEY1 ;有键按下发生跳转CALL CLEARMOV DX, MY8255_A ;刷新MOV AL, 11011111BOUT DX, ALMOV DX, MY8255_BMOV AL, TTOUT DX, ALMOV AH, 1INT 16HJZ BEGINQUIT: MOV AX, 4C00HINT 21HGETKEY1:MOV CH, 0FEH ;打开第一根列线MOV CL, 00H ;纪录打开的列线COLUM: MOV AL, CHMOV DX, MY8255_AOUT DX,AL ;把AL输给端口MOV DX, MY8255_C ;读入三行IN AL, DXL1: TEST AL,01H ;逻辑与判断行线开关 JNZ L2 ;关的跳第二行MOV AL,00HJMP KCODEL2: TEST AL,02HJNZ L3MOV AL,04HJMP KCODEL3: TEST AL,04HJNZ L4MOV AL,08HJMP KCODEL4: TEST AL,08HJNZ NEXTMOV AL,0CHKCODE: ADD AL,CL ;CL加入存储器对应数MOV CL,AL ;纪录ALYY: CALL CLEAR ;判断按键是否弹起CALL CCSCANCALL CLEARMOV DX,MY8255_A ;刷新MOV AL,11011111BOUT DX,ALMOV DX,MY8255_BMOV AL,TTOUT DX,ALJNE YY ;不为零有键按KON: CALL CLEARMOV AL,CLMOV BX,OFFSET DTABLE ;定义变量首地址AND AX,00FFHADD BX,AXMOV AL,[BX]MOV CL, ALMOV DX,MY8255_A ;A口控制列线和数码管MOV AL,11011111B ;关掉五个打开对应的一个OUT DX, ALMOV AL, CLMOV DX, MY8255_BOUT DX, ALMOV TT, ALJMP KERRNEXT: INC CLMOV AL, CHTEST AL,08H ;将AL和第三根列线比较JZ KERR ;真跳转ROL AL,1 ;不是第三根左移一顺序扫 MOV CH, ALJMP COLUMKERR: JMP BEGINCCSCAN PROC NEARMOV AL, 00H MOV DX, MY8255_AOUT DX, ALMOV DX, MY8255_CIN AL, DXNOT ALAND AL, 0FHRETCCSCAN ENDPCLEAR PROC NEARMOV DX, MY8255_BMOV AL, 00HOUT DX, ALRETCLEAR ENDP ;结束子程序CODE ENDSEND START。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微型计算机接口技术大作业学院(系):软件学院专业:软件工程班级:姓名:学生学号:电话:2011年6月5日P2P语音聊天工具一、程序简介程序实现了文字聊天和语音聊天,程序即可以作为服务器端侦听其他用户的连接请求,也可以作为客户端主动连接其他用户。
程序使用了Win32 API提供的用于多媒体服务的函数接口,主要涉及波形音频设备的相关内容。
程序主要分为四个模块:1.主程序模块(消息处理和界面控制)2.负责接收连接的服务器Socket模块3.负责接收和发送数据的客户端模块4.声卡数据的采集和播放模块二、流程图主模块流程图:负责接收连接的服务器Socket模块:负责接收和发送数据的客户端模块:声卡数据的采集和播放模块流程图:三、代码实现代码主要是用MFC对话框程序框架编写的,对于界面上的控件和消息传递的部分,此处略去,仅仅给出主要程序的代码。
主模块代码://初始化端口号、聊天消息框和输入框CExample2_ChatRoomDlg::CExample2_ChatRoomDlg(CWnd* pParent /*=NULL*/) : CDialog(CExample2_ChatRoomDlg::IDD, pParent){//{{AFX_DATA_INIT(CExample2_ChatRoomDlg)m_sInputString = _T(""); //输入框m_sShowString = _T(""); //聊天消息框m_uPort = 4000; //端口号//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}//初始化服务器IP地址(默认设置为本机的IP地址)BOOL CExample2_ChatRoomDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);if(AfxSocketInit(NULL)==0){AfxMessageBox("CSocketInital Error");}BYTE f0,f1,f2,f3;CString name;CClientSocket::GetLocalHostName(name); //获取本机名CClientSocket::GetIpAddress(name,f0,f1,f2,f3); //获取本机IP//设置服务器IP为本机IP((CIPAddressCtrl *)(GetDlgItem(IDC_IPADDRESS)))->SetAddress(f0,f1,f2,f3);m_bInit=false;m_bClient=false;m_willchating=TRUE;return TRUE;}//显示主窗体BOOL CExample2_ChatRoomApp::InitInstance(){AfxEnableControlContainer();#ifdef _AFXDLLEnable3dControls();#elseEnable3dControlsStatic();#endifCExample2_ChatRoomDlg dlg; //创建窗体实例m_pMainWnd = &dlg;intnResponse = dlg.DoModal();if (nResponse == IDOK){}else if (nResponse == IDCANCEL){}return FALSE;}//对于用户更改聊天窗口内容的判断void CExample2_ChatRoomDlg::OnInputText(){if(!m_bInit) //如果用户还没有连接就输入聊天内容,提示用户先连接{AfxMessageBox("还没有连接到服务器!");return;}//如果用户按下Enter按钮,且焦点在输入窗口中,则对当前聊天室中的所//有用户发送消息CString in;CMessgmsg;GetDlgItemText(IDC_INPUTTEXT,in);if(in.GetLength()<1){return;} //如果用户没有输入内容,返回if(in.GetAt(in.GetLength()-1)=='\n'){in.TrimRight(" ");SetDlgItemText(IDC_INPUTTEXT,"");if(in.GetLength()>2){m_sMsgList+=in;SetDlgItemText(IDC_SHOWTEXT,m_sMsgList);Intm_iLineCurrentPos=((CEdit*)(GetDlgItem(IDC_SHOWTEXT)))->GetLineCount();((CEdit*)(GetDlgItem(IDC_SHOWTEXT)))->LineScroll(m_iLineCurrentPos);msg.m_strText=in;if(!m_bClient){POSITION pos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;){ //循环遍历所有建立连接的用户,分别发送消息CClientSocket * t= (CClientSocket *)m_connectionList.GetNext(pos);t->SendMessage(&msg);}}else{m_clientsocket.SendMessage(&msg);}}}}//建立服务器按钮void CExample2_ChatRoomDlg::OnSetserver(){if(!m_bInit){m_bClient=false; //作为服务器端m_bInit=true;if(m_pListenSocket.Init(GetDlgItemInt(IDC_PORT),this)==FALSE){ //初始化服务器(建立套接字并侦听,详见Server模块)m_bInit=false;return;}}}//连接服务器按钮void CExample2_ChatRoomDlg::OnConnectserver(){if(!m_bInit){BYTE f0,f1,f2,f3;CString name;//读取服务器IP输入框中的数据((CIPAddressCtrl *)(GetDlgItem(IDC_IPADDRESS)))->GetAddress(f0,f1,f2,f3);CStringip;ip.Format("%d.%d.%d.%d",f0,f1,f2,f3);m_bClient=true;m_clientsocket.Create();if(m_clientsocket.Connect(ip,GetDlgItemInt(IDC_PORT))) //连接服务器{m_clientsocket.Init(this);SetDlgItemText(IDC_SHOWTEXT,"成功连接到服务器.");m_bInit=true;}else{m_clientsocket.Close();AfxMessageBox("连接服务器失败!");m_bInit=false;}}}//用户按下语音聊天按钮void CExample2_ChatRoomDlg::OnNewsend(){if(m_willchating==TRUE){m_sound.Init(this); //初始化音频m_sound.Record(); //开始录音SetDlgItemText(IDC_NEWSEND,"停止语音聊天");m_willchating=FALSE;}else{CSingleLocklock(&m_mutex,TRUE);m_sound.StopRecord(); //停止录音SetDlgItemText(IDC_NEWSEND,"语音聊天");m_willchating=TRUE;lock.Unlock();}}负责接收连接的服务器Socket模块代码://服务器初始化BOOL CServerSocket::Init(UINT port, CExample2_ChatRoomDlg* dlg){m_uPort=port;m_dlg=dlg;if(Create(m_uPort)==FALSE) //创建套接字{AfxMessageBox("Server Socket Create Error");return FALSE;}if(this->Listen()==FALSE) //侦听{AfxMessageBox("Server Listen Error");return FALSE;}m_dlg->SetDlgItemText(IDC_SHOWTEXT,"正在侦听其他用户的连接请求!");return TRUE;}//当有连接请求时把该用户加入连接队列中void CExample2_ChatRoomDlg::ProcessPendingAccept(){CClientSocket* pSocket = new CClientSocket(); //为该用户分配一个套接口if (m_pListenSocket.Accept(*pSocket)) //接收连接请求{CMessgmsg;msg.m_strText="一个游客进入聊天室了\n";m_sShowString+="一个游客进入聊天室了\n";POSITION pos;//向所有用户发送消息for(pos=m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket * t= (CClientSocket *)m_connectionList.GetNext(pos);t->SendMessage(&msg);}pSocket->Init(this);m_connectionList.AddTail(pSocket);}elsedeletepSocket;}负责接收和发送数据的客户端模块代码://发送消息BOOL CClientSocket::SendMessage(CMessg * msg){if (m_aSessionOut != NULL){msg->Serialize(*m_aSessionOut);m_aSessionOut->Flush();return TRUE;}else{//对方关闭了连接m_bClose=true;CloseSocket();m_dlg->CloseSessionSocket();return FALSE;}}//接收消息voidCClientSocket::OnReceive(intnErrorCode){CSocket::OnReceive(nErrorCode);do{CMessg temp;temp.Serialize(*m_aSessionIn);m_dlg->m_sMsgList+=temp.m_strText; //添加条目m_dlg->SetDlgItemText(IDC_SHOWTEXT,m_dlg->m_sMsgList);if(temp.m_tag==1&&m_dlg->m_willchating==FALSE)//如果有声音过来并且本机的声音设备已经准备好了则首先在本机发出声音{memcpy(m_dlg->m_sound.m_cBufferOut,temp.m_buffer,MAX_BUFFER_SIZE);}intlinenum=((CEdit*)(m_dlg->GetDlgItem(IDC_SHOWTEXT)))->GetLineCount();((CEdit *)(m_dlg->GetDlgItem(IDC_SHOWTEXT)))->LineScroll(linenum);if(!m_dlg->m_bClient) //如果是服务器端的话,转发消息{for(POSITIONpos=m_dlg->m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket * t = (CClientSocket*)m_dlg->m_connectionList.GetNext(pos);if(t->m_hSocket!=this->m_hSocket){t->SendMessage(&temp);}}}}while (!m_aSessionIn->IsBufferEmpty());}声卡数据的采集和播放模块代码://初始化voidCSound::Init(CExample2_ChatRoomDlg *dlg){int result;m_dlg=dlg;if(waveInGetNumDevs()==0) //是否有音频输入设备{AfxMessageBox("There is no sound input device");}if(waveOutGetNumDevs()==0) //是否有音频输出设备{AfxMessageBox("There is no sound output device");}//指定录音格式m_soundFormat.wFormatTag=WAVE_FORMAT_PCM;m_soundFormat.nChannels=1;m_soundFormat.nSamplesPerSec=8000;m_soundFormat.nAvgBytesPerSec=16000;m_soundFormat.nBlockAlign=2;m_soundFormat.cbSize=0;m_soundFormat.wBitsPerSample=16;int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &m_soundFormat, (DWORD)m_dlg->m_hWnd,0L,CALLBACK_WINDOW); //打开录音设备if(res!= MMSYSERR_NOERROR){AfxMessageBox("Error in waveInOpen function");return ;}res=waveOutOpen(&m_hWaveOut,WAVE_MAPPER, &m_soundFormat, (DWORD)m_dlg->m_hWnd,0L,CALLBACK_WINDOW); //打开录音设备if(res!= MMSYSERR_NOERROR){AfxMessageBox("Error in waveOutOpen function");return ;}//inm_pWaveHdrIn[0].lpData=m_cBufferIn;m_pWaveHdrIn[0].dwBufferLength=MAX_BUFFER_SIZE;m_pWaveHdrIn[0].dwBytesRecorded=0;m_pWaveHdrIn[0].dwFlags=0;result=waveInPrepareHeader(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR) ); //准备内存块录音if (result!= MMSYSERR_NOERROR){AfxMessageBox(_T("Cannot InPrepareHeader !"));return;};//增加内存块result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR));if (result!= MMSYSERR_NOERROR){AfxMessageBox(_T("Cannot InAddBuffer !"));return;};//outm_pWaveHdrOut[0].lpData=m_cBufferOut;m_pWaveHdrOut[0].dwBufferLength=MAX_BUFFER_SIZE;m_pWaveHdrOut[0].dwBytesRecorded=0;m_pWaveHdrOut[0].dwFlags=0;waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR)); //准备内存块录音waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR));}//开始录音voidCSound::Record(){waveInStart(m_hWaveIn);//开始录音}//播放本地声音voidCSound::Play(){memcpy(m_cBufferOut,m_cBufferIn,MAX_BUFFER_SIZE);}//停止录音voidCSound::StopRecord(){waveInStop(m_hWaveIn); //停止录音waveInReset(m_hWaveIn); //清空内存块}//清空录音缓冲区voidCSound::FreeRecordBuffer(){intresult=waveInUnprepareHeader(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR)); if (result!= MMSYSERR_NOERROR){AfxMessageBox(_T("Cannot UnInPrepareHeader !"));return;}; //inm_pWaveHdrIn[0].lpData=m_cBufferIn;m_pWaveHdrIn[0].dwBufferLength=MAX_BUFFER_SIZE;m_pWaveHdrIn[0].dwBytesRecorded=0;m_pWaveHdrIn[0].dwFlags=0;result=waveInPrepareHeader(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR) ); //准备内存块录音if (result!= MMSYSERR_NOERROR){AfxMessageBox(_T("Cannot InPrepareHeader !"));return;}; //inresult=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR)); //增加内存块if (result!= MMSYSERR_NOERROR){AfxMessageBox(_T("Cannot InAddBuffer !"));return;}; //in}//清空输出缓冲区voidCSound::FreePlayBuffer(){staticbool once=true;int result;result=waveOutUnprepareHeader(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(W AVEHDR));m_pWaveHdrOut[0].lpData=m_cBufferOut;m_pWaveHdrOut[0].dwBufferLength=MAX_BUFFER_SIZE;m_pWaveHdrOut[0].dwBytesRecorded=0;m_pWaveHdrOut[0].dwFlags=0;result=waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAV EHDR)); //准备内存块录音if (result!= MMSYSERR_NOERROR){AfxMessageBox(_T("Cannot OutPrepareHeader !"));return;}; //outresult=waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR)); //增加内存块if (result!= MMSYSERR_NOERROR){AfxMessageBox(_T("Cannot OutWrite !"));return;}; //out}//输入缓冲区满的时候触发的发送音频消息函数void CExample2_ChatRoomDlg::WriteBufferFull(LPARAM lp,WPARAMwp){m_sound.Play();//发出本地声音CSingleLocklock(&m_mutex,TRUE);CMessgmsg;msg.m_strText="";msg.m_tag=1;memcpy(msg.m_buffer,m_sound.m_cBufferIn,MAX_BUFFER_SIZE);if(!m_bClient){POSITION pos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;){ //如果是服务器端,就给所有客户端发送音频CClientSocket * t= (CClientSocket *)m_connectionList.GetNext(pos);t->SendMessage(&msg);}}else{m_clientsocket.SendMessage(&msg);}m_sound.FreeRecordBuffer();m_sound.FreePlayBuffer();lock.Unlock();}四、程序运行结果截图五、心得与体会通过学习大作业和平时的小作业,了解并掌握了网络通信编程、视频和音频传输技术,对于MPI、语音识别技术也有了一定的了解。