📄 send.c
字号:
/*
汉明码演示系统发送方程序:晶体频率为11.0592M
*/
#include <STC89C51RC_RD_PLUS.H>
#include "intrins.h"
#define DATAPORT P1 //8位原始数据端口
#define HAMMINGPORTL P0 //汉明数据低8位
#define HAMMINGPORTH P2 //汉明数据高4位
sbit DATAKEY = P3^2; //数据产生按键
sbit WRONGKEY = P3^3; //差错码产生按键
bit TimeFlag = 0 ; //时基标志 10ms置位一次
unsigned char DataCount = 0; //原始数据值,随机更新,取值范围0--255
unsigned char WrongCount = 0; //差错码产生位置,0--11
unsigned char DataValue = 0xaa; //最终数据值
unsigned int HammingValue = 0; //汉明码
unsigned int WrongValue = 0; //最终差错位置
unsigned char DisplayCount = 0; //显示刷新计数
unsigned char SendCount = 0; //发送处理
unsigned char HammingBuf[12]; //海明码计算缓冲区
unsigned int TempInt = 0;
#define OLEN 6
#define ILEN 6
#define START_SEND() {TI=1;}
//通信用到的全局变量
idata unsigned char OutputBuf[OLEN];
unsigned char OutputPoint=0; //输出缓冲区指针
bit OutputFlag=1; //输出完成置1
bit OutputStart=0; //为1正在输出中
unsigned char SendNum; //要发送的数据个数
void DelayMisc(unsigned int temp)
{
while (temp--);
}
void RSTDOG(void)
{
WDT_CONTR = 0x34; //喂狗
}
/******************************
系统初始化部分
*********************************/
void Init(void)
{
/****设置定时器***************/
TMOD=0X21; //定时器1用于波特率发生器
TH1=0XFB; //波特率为9600/11.0592M : 0XFD 9600/18.432M : 0XFB
TL1=0XFB;
TL0 = (65536-10000) % 256; //10ms中断一次
TH0 = (65536-10000) / 256;
TR0 =1;
TR1=1;
/*****设置串行通信************************/
SCON=0X50; //8位工作方式,
/*******开启中断****************************/
ES=1;
ET0 = 1;
EA = 1;
}
void T0_Server(void) interrupt 1
{
TL0 = (65536-10000) % 256; //10ms中断一次
TH0 = (65536-10000) / 256;
TimeFlag = 1;
}
/************************************/
//通信服务子程序
//
/**************************************/
//
//
void UART_Service(void) interrupt 4
{
if (RI==1) /*必须及时的将输入缓冲区中的数据取出,否则会丢失数据*/
{ /*可以根据波特率、任务切换时间合适设置缓冲区的大小避免以上问题*/
/*缓冲区大小>=任务切换时间/接收一个字节需要的时间*/
RI=0;
}
else
{
TI=0;
if(OutputPoint==SendNum)
{
return;
}
if(OutputStart==0)
{
OutputStart=1;
OutputPoint=0;
}
SBUF=OutputBuf[OutputPoint++];
if(OutputPoint==SendNum) //指定的字节个数已发送完
{
OutputStart=0;
OutputFlag=1;
OutputPoint=0;
SendNum=0;
return;
}
}
}
//计算汉明码
void CalHamming(void)
{
//计算汉明码
//先填充数据位
HammingBuf[11] = (DataValue & 0x80) >> 7;
HammingBuf[10] = (DataValue & 0x40) >> 6;
HammingBuf[9] = (DataValue & 0x20) >> 5;
HammingBuf[8] = (DataValue & 0x10) >> 4;
HammingBuf[6] = (DataValue & 0x08) >> 3;
HammingBuf[5] = (DataValue & 0x04) >> 2;
HammingBuf[4] = (DataValue & 0x02) >> 1;
HammingBuf[2] = (DataValue & 0x01);
//计算4位编码位
HammingBuf[0] = HammingBuf[2] ^ HammingBuf[4] ^ HammingBuf[6] ^ HammingBuf[8] ^ HammingBuf[10];
HammingBuf[1] = HammingBuf[2] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[9] ^ HammingBuf[10];
HammingBuf[3] = HammingBuf[4] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[11];
HammingBuf[7] = HammingBuf[8] ^ HammingBuf[9] ^ HammingBuf[10] ^ HammingBuf[11];
//产生最终汉明码
HammingValue = HammingBuf[0];
HammingValue += (HammingBuf[1] << 1);
HammingValue += (HammingBuf[2] << 2);
HammingValue += (HammingBuf[3] << 3);
HammingValue += (HammingBuf[4] << 4);
HammingValue += (HammingBuf[5] << 5);
HammingValue += (HammingBuf[6] << 6);
HammingValue += (HammingBuf[7] << 7);
TempInt = HammingBuf[8];
TempInt <<= 8;
HammingValue += TempInt;
TempInt = HammingBuf[9];
TempInt <<= 9;
HammingValue += TempInt;
TempInt = HammingBuf[10];
TempInt <<= 10;
HammingValue += TempInt;
TempInt = HammingBuf[11];
TempInt <<= 11;
HammingValue += TempInt;
//计算完直接显示之
DATAPORT = DataValue;
HAMMINGPORTH = (HammingValue / 256) | 0xf0;
HAMMINGPORTL = HammingValue % 256;
}
void main(void)
{
DATAPORT = 0;
HAMMINGPORTL = 0;
HAMMINGPORTH = 0;
DelayMisc(50000);
DATAPORT = 0xff;
HAMMINGPORTL = 0xff;
HAMMINGPORTH = 0xff;
Init(); //系统初始化
CalHamming(); //先计算一次汉明码
while(1)
{
RSTDOG(); //喂狗
/****随机数据和随机差错码产生*******/
DataCount++;
WrongCount++;
if (WrongCount > 11)
{
WrongCount = 0;
}
/**********按键检查*****************/
if (TimeFlag == 1)
{
//数据产生键
if (DATAKEY == 0)
{
DataValue = DataCount;
WrongValue = 0; //清除差错码
DisplayCount = 100; //需要显示刷新
CalHamming(); //计算汉明码
}
//差错产生键
if (WRONGKEY == 0)
{
WrongValue = 1;
WrongValue <<= WrongCount;
DisplayCount = 100; //需要显示刷新
CalHamming(); //计算汉明码
}
}
/************定时产生发送编码数据*****/
//1000ms发送一次
if (TimeFlag == 1)
{
SendCount++;
if (SendCount > 50)
{
SendCount = 0;
OutputBuf[0] = 0xff;
OutputBuf[1] = 0xaa;
OutputBuf[2] = (HammingValue ^ WrongValue) % 256; //先发低字节
OutputBuf[3] = (HammingValue ^ WrongValue) / 256; //先发低字节
//tputBuf[2] = (HammingValue ) % 256; //先发低字节
//tputBuf[3] = (HammingValue ) / 256; //先发低字节
SendNum = 4;
START_SEND();
}
}
/************差错位置闪动显示处理**************/
//200ms翻转一下显示
if (TimeFlag == 1)
{
DisplayCount++;
if (DisplayCount > 20)
{
DisplayCount = 0;
TempInt = (HAMMINGPORTH & 0x0F);
TempInt <<= 8;
TempInt += HAMMINGPORTL;
TempInt ^= WrongValue;
HAMMINGPORTH = (TempInt / 256) | 0xf0;
HAMMINGPORTL = TempInt % 256;
}
}
/*************************************/
if (TimeFlag == 1)
{
TimeFlag = 0 ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -