📄 bertest.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 + -