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

📄 bertest.c

📁 通讯误码仪测试软件
💻 C
字号:
/* 511 code generator and Bit Error rate test */

#include "stdio.h"
#include "reg52.h"
#include <intrins.h>

#define	baudrate		9600
#define uartbaudrate	9600
#define Clock			33000000

sbit	SYN		=	P0^0;
sbit	RUN		=	P0^1;
sbit	TxData	=	P1^7;
sbit	DCacq	=	P1^5;
sbit 	PLLacq	=	P1^6;
sbit	RxData	=	P1^4;

sbit 	RxClk	=	P1^1;
sbit	TxClk	=	P1^0;

sbit	int0	=	P3^2;
sbit	int1	=	P3^3;

sbit	TestPin	=	P1^2;			//用于检测目的

bit		SYNFlag;					//初始状态为0,表示同步信号没有结束
bit		MeasureFlag;				//测量完成标志,为0表待测,为1表测量结束
unsigned int  data RxDCounter;		//接收位计数器
unsigned long data RxDResult;		//接收位总数计数器
unsigned long data TestTime=10;
unsigned long data leftTime=10;
unsigned int  data TestCounter=19200;//用于记每秒需要计次数,9.6K时为9600,16K是为16000
unsigned int  data BECounter;		//误码计数器
unsigned long data BEResult;
unsigned char data synCounter=0;	//同步头计数器
float data BER;


void MX589init();
typedef union 
{
	unsigned int uint;
	unsigned char uchar[2];
}dat;

dat bdata dataflow,Rxdataflow;

sbit	a0		=	ACC^0;
sbit	a4		=	ACC^4;
sbit	Tx0		=	dataflow.uchar[1]^0;
sbit	Tx4		=	dataflow.uchar[1]^4;
sbit	Rx0		=	Rxdataflow.uchar[1]^0;
sbit	Rx4		=	Rxdataflow.uchar[1]^4;			//用于记录511码发生器的第五位数据

void SerInitialize() {
 
/*--- set up Timer 1 to produce serial rate                                */
   TCON &= 0x3F;                     /* clear run & interrupt flags        */
   TMOD &= 0x0F;                     /* flush existing Timer 1 setup       */
   TMOD |= 0x20;                     /* flush existing Timer 1 setup       */

   SCON = 0x50;                     /* flush existing Timer 1 setup        */
   PCON |= 0x00;                       
   TH1 = TL1 = 0xF7; // 9.6Kbps  (unsigned char) 256-Clock/12/32/uartbaudrate;//设置波特率发生器定时器
   TR1 = 1;                        /* start the timer                    */
   TI  = 1;
}

void main()
{
	unsigned char i;

	P0=0xff;					//因为硬件原因,必需将P0口设为高阻态
	SerInitialize();			//串口初始化

	MX589init();				//同步589
	IT0 = 1;					//设置为边缘触发
	EX0 = 1;					//打开接收中断
	IT1 = 1;					//设置为边缘触发
	EX1 = 1;					//打开数据发送
	EA = 1;                     //启动中断
	
	RUN=0;						//点亮LED
	SYN=0;
	
	while(1)
	{
		printf("\n\n\n----------------------------------------\n");
		printf("协同集团无线设备误");
		printf("码测试仪 v1.0\n\n");
		printf("          2003年1月\n\n\n");
		printf("选择菜单:\n");
		printf("----------------------------------------\n");
		printf("<1> 设置测量时间(<268435秒)");
		printf("  当前为%ld秒\n\n",TestTime);
		printf("<2> 设置测试波特率");
		printf("(当前波特率为:%dbps)\n\n",TestCounter/2);
		printf("<3> 信号发生器反向处理\n\n");
		printf("<4> 开始测量\n\n");
//		printf("<5> 帮助\n\n");
		printf("请选择1~4:");
		RUN=1;                                     
		scanf("%c",&i);				//读入选择内容
		getchar();
		switch(i)
		{
			case '1':
				printf("\n请输入新的测量");
				printf("时间(单位,秒):");
				scanf("%ld",&TestTime);
				getchar();
				leftTime=TestTime;
				break;
			case '2':
				printf("<1> 9600bps\n");
				printf("<2> 16000bps\n");
				printf("请选择波特率(1,2):\n");
				scanf("%c",&i);
				getchar();
				if(i=='1')
				{
					TestCounter=19200;			//每两秒输出一次结果,此为9600波特率时
				}
				else if(i=='2')
				{
					TestCounter=32000;
				}
				else
				{
					printf("输入错误!任意键继续...\n");
					getchar();
				}
				break;
	
			case '3':
				break;
	
			case '4':
				BER=0;
				leftTime=TestTime;
				printf("\n测试已启动,测试时间");
				printf("为%ld秒,请稍候...\n\n",TestTime);
				printf("当前误码率   |");
				printf(" 剩于时间(每两秒更新)\n");
				printf("\r%1.4E  %6ld",BER,leftTime);

				SYN=0;				//点亮LED
				RUN=0;
				BECounter=0;
				RxDCounter=0;
				RxDResult=0;
				BEResult=0;
				MeasureFlag=0;

				EA=0;						//初始化的时候不能开中断
				MX589init();				//同步MX589
				TxData=1;					//为了同步
				for(i=0;i<10;i++)			//
				{
					while(int0==0);
					while(int0==1);
				}
				EA = 1;                     //启动中断
				while(leftTime>1)
				{
					RUN=!RUN;
						
					if(SYN)
					{
						SYN=1;				//点亮同步失败信号灯
						printf("\r接收信号同步失败,");
						printf("请检查电路连接是否正常");
						printf("按任意键退出...");
						_getkey();
						break;				//退出循环
					}
					if(MeasureFlag==1)
					{
						if(leftTime==TestTime)
						{
							EA=0;
							BECounter=0;
							RxDCounter=0;
							EA=1;
						}
						else
						{
							EA=0;				//因为在中断里边用这儿的数据,所以暂时关掉
							RxDResult+=RxDCounter;
							RxDCounter=0;
							EA=1;
							BER=(float )BECounter/(float )RxDResult;
						}
						leftTime--;
						leftTime--;
						printf("\r%1.4E  %6ld",BER,leftTime);
						MeasureFlag=0;
					}
				}
				//测试结束,重新设置计数器及状态
				if(!SYN)
				{
					leftTime=0;
					printf("\r%1.4E  %6ld",BER,leftTime);
					printf("\n\n测试结束,误码率为:%1.4E\n",BER);
				}
				break;
			case '5':
				break;
	
			default : break;
		}
	}
}


void MX589init()			//用于发前导码
{
	unsigned char i;
	SYNFlag=0;				//每次同步时都设为0
	dataflow.uint=-1;		//将数据设为0FFFFH
	Rxdataflow.uint=-1;
	PLLacq=1;
	DCacq=1;
	for(i=0;i<30;i++)		//preamble 30bits
	{
		while(int0==0);
		while(int0==1);
		TxData=!TxData;
	}
	PLLacq=0;
	DCacq=0;
	for(i=0;i<30;i++)		//medium bandwidth 30bits
	{
		while(int0==0);
		while(int0==1);
		TxData=!TxData;
	}

}


void Ext1Int (void) interrupt 0 using 1		//发送处理
{
	unsigned char data temp2;
	TxData=Tx0;
	temp2=Tx0^Tx4; 				//
	dataflow.uint=dataflow.uint>>1;
	dataflow.uchar[0]=temp2;
}


void Ext0Int() interrupt 2 using 1	//接收中断响应;程序里边有两处读入数据的地方
{
	bit tmp,temp2,help1;
	unsigned char i;
//	EA=0;
	for(i=0;i<10;i++){
		help1=!help1;
	}
	
	if(!SYNFlag)
	{
		if(!RxData){					//如果同步开始,要重置同步数据
			SYNFlag=1;
			Rxdataflow.uint=0x00F0;//0x00F0;//0x0178;  数据串中出现低电平的第一个数据
			BECounter=0;
			RxDCounter=0;
			SYN=0;
		}
	}else{							//如果同步已经结束,那么开始计算比较
		RxDCounter++;
		tmp=Rx0;
		temp2=Rx0^Rx4;
		Rxdataflow.uint=Rxdataflow.uint>>1;
		Rxdataflow.uchar[0]=temp2;

		if(RxData!=tmp){
			BECounter++;
			if(BECounter>(unsigned int)32000){
				SYN=1;
			}
		}
		if(RxDCounter==TestCounter)
		{
			MeasureFlag=1;		//每两秒一次结束标志
		}
	}
//	EA=1;
}

⌨️ 快捷键说明

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