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

📄 serials.cpp

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

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

#define data51 0x318    //8251A数据口
#define ctrl51 0x319	   //8251A命令/状态口
#define ctrl55 0x313    //8255命令口
#define timer2 0x316    //8253的2号计数器端口
#define timctl 0x317    //8253命令口
//#define clk    1193182 
#define factor 16	   //波特率因子16

unsigned long int clk = 1193182;//8251输入时钟频率(十六进制表示)
//定时常数数组
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 main()
{
	int getvalue=0;
	int temp=-1;
	int sletter,rletter,status;
	for(;;)
	{
		clrscr();
		printf("\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 take 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]);
	int51();
	printf("\n now enter the serial communication");
	printf("\n end with 'Esc'\n");
	outportb(ctrl55,0x80);//置PC6=1,打开8253-5的GATE2,开始输出方波
	outportb(ctrl55,0x0d);
	for(;;)//判断是否Esc键
	{
		if (kbhit()){//若无键按下,则转接收
			if((sletter=getche())==0x1b)//是ESC?是,则退出,并返回DOS
			{
				outport(ctrl55,0x0c);//关闭8253
				return;
			}
			else{
				status=inportb(ctrl51);//获取8253 TXRDY 状态
				if((status&0x01)!=0)//已准备好,则将键入的字符发送出去
				{
					outportb(data51,sletter);
				}
			}
		}
		else{
			status=inportb(ctrl51);//已准备好,即有数据传送过来,则接收1个字符
			if((status&0x02)!=0)
			{
				rletter=inportb(data51);
				printf("\n%c",rletter);
			}
		}
	}

}

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 i,sendhigh,sendlow;
	i=clk/bps;
	i=i/factor;//计算计数初值
	sendhigh = (i>>8)&0x00ff;
	sendlow  = i & 0x00ff;
	outportb(timctl,0xb6);
	outportb(timer2,sendlow);//装计数初值低字节
	outportb(timer2,sendhigh);//装计数初值高字节
}

⌨️ 快捷键说明

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