⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialr.cpp

📁 大学微型计算机接口技术实验源代码,直接就可以运行,包含了C++和asm代码,比较前面.
💻 CPP
字号:

//*------------------------------------------------------*/
//*  Cexp8r.cpp(查询方式半双工串行通信接口实验-接收端程序)  */
//*  查询方式半双工串行通信接收程序 Source File            */
//*  Copyright (c) 2001 by HUST                          */
//*------------------------------------------------------*/
#include <conio.h>     //kbhit();
#include <stdio.h>     //printf();
#include <dos.h>       //delay();

#define data51 0x308    //8251A数据口
#define ctrl51 0x309	   //8251A命令/状态口
#define ctrl55 0x303    //8255命令口
#define timer2 0x306    //8253的2号计数器端口
#define timctl 0x307    //8253命令口
#define factor 16	   //波特率因子16

#ifdef      __cplusplus     //if in C++ mode
    #define __CPPARGS ...
#else
    #define __CPPARGS
#endif


unsigned long int clk = 1193182;
char buffer[1024] = "";
int len = 0;
//定时常数数组
int tc_table[8]={
	110,	// 0=110bps
	150,    // 1=150b/s
	300,    // 2=300b/s
	600,    // 3=600b/s
	1200,     // 4=1200b/s
	2400,     // 5=2400b/s
	4800,     // 6=4800b/s
	9600      // 1=9600b/s
};

void int51();           //初始化8251a
void set_bps(int bps);		   //8253-5记数初值计算与装入

void interrupt handler(__CPPARGS)
{
	int letter;
	disable();
	letter = inportb(data51);
	buffer[len++] = letter;
	outportb(0xa0,0x62);//发中断结束命令(OCW2),向从片8259发EOI命令
	outportb(0x20,0x20);//向主片8259发EOI命令
	enable();

}

void int51()
{
	outportb(ctrl51,0x00);
	delay(100);
	outportb(ctrl51,0x40);//8251复位
	delay(100);
	outportb(ctrl51,0x4a);//8251A方式命令
	delay(100);
	outportb(ctrl51,0x27);//8251A工作命令
}

void set_bps(int bps)
{
	int count,sendhigh,sendlow;
	count=clk/bps;
	count=count/factor;//计算计数初值
	sendhigh = (count >> 8) & 0x00ff;
	sendlow  = count & 0x00ff;
	outportb(timctl,0xb6);
	outportb(timer2,sendlow);//装计数初值低字节
	outportb(timer2,sendhigh);//装计数初值高字节
}

void main()
{
	int getvalue=0,getout = 1;
	int temp=-1;
	void interrupt (*oldhandler)(__CPPARGS);
	int status;
	for(;;)
	{
		clrscr();
		printf(" baud-rate :\n 0---110\n 1---150\n 2---300\n 3---600\n 4---1200\n 5---2400\n 6---4800\n 7---9600\n");
     printf("\n please select one of baud-rates\n");
		getvalue=getch();
		if((getvalue<'0') || (getvalue>'7'))
		{
			printf("\n Input error! try again please! \n");	//error message
			getch();
			continue;
		}
		else
		{
			break;
		}
	}
	temp = getvalue - '0';
	set_bps(tc_table[temp]);//8253-5记数初值计算与装入
	int51();//初始化8251a
	printf("\n now enter the serial communication");
	printf("\n if you want to end,please press \"q\" or \"Q\"\n");

	outportb(0x303,0x80);//初始化8255
	outportb(0x303,0x0d);//令PC6=1,打开8253的GATE2,输出方波
	delay(100);

	oldhandler=getvect(0x72);//获取原中断向量
	setvect(0x72,handler);//设置新中断向量

	status=inportb(0xa1);
	outportb(0xa1,status&0xfb);//打开IRQ10(OCW1)
	status=inportb(0x21);
	outportb(0x21,status&0xfb);//打开IRQ2(OCW1)
	delay(1000);

	while(getout)//按下Q/q就退出
	{
		int i=0;
		while(i<len)
		{
			printf("%c",buffer[i]);
			i++;
		}
		if (i==len) len=0;
		if(kbhit())
		{
			if((getch()==0x51)||(getch()==0x71)) getout = 0;//ESC键按下返回
		}
	}

	setvect(0x72,oldhandler);

	status=inportb(0xa1);
	outportb(0xa1,status|0x04);//屏蔽IRQ10(OCW1)
	status=inportb(0x21);
	outportb(0x21,status|0x04);//屏蔽IRQ2

	outport(ctrl55,0x0c);//关闭8253
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -