微型计算机接口技术大作业
计算机接口技术课堂大作业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。
- 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、语音识别技术也有了一定的了解。