📄 nobreakmod2.c
字号:
////发射端模拟程序,9600波特率,每次发送 26byte数据。
////发送的数据以FFFE为起始端
#include <reg52.h> //预处理文件里面定义了特殊寄存器名称如P1
sbit P1_0 = P1^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;
char s=0;
typedef unsigned char uchar;
typedef unsigned int uint;
uint crc; // CRC16 码
//数据位从高到低时,CRC16/CC1TT校验
uint crc16(unsigned char *ptr, unsigned char len)
{
unsigned char i;
while(len--!=0)
{
for(i=0x01;i!=0;i <<= 1)
{
if((crc&0x0001)!=0) {crc >>= 1; crc ^= 0x8408;}
else crc >>= 1;
if((*ptr&i)!=0) crc ^= 0x8408;
}
ptr++;
}
return(crc);
}
void delay()
{
TCON=0;
TMOD = 0x01; //模式设定为1
TH0=0xDC; //定时,2ms
TL0=0x00;
TR0=1;
do{}while(!TF0); //等待计数器计数溢出,TF0 变为1;
TF0=0;
}
void main(void)
{
char temp;
char crc1,crc2;//crc的高位和低位
char crcbuff [22] = {'a','b','c','d','e','f','g','h','i','j',0x01,0x01,
0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01}; //22byte数据
char design[26];
unsigned char a,b; //在C51 编程中因内存有限尽可能注意变量类型的使用
uchar *ptr;
crc = 0; // CRC 初值
ptr = crcbuff; // 指向第一个 Byte 数据
crc = crc16(ptr,22);
crc1=crc&0xFF;
crc=(crc>>8);
crc2=(crc&0xFF);
design[0]=0xFF;design[1]=0xFE;
design[24]=crc1;
design[25]=crc2;
for(a=0;a<=21;a++)
design[a+2]=crcbuff[a];//定义数据
P2_1=1;
P2_2=1;
P2_3=1;
P2_4=0;
P2_5=0;
P2_6=0;
P2_7=0;
P1_0=0; //端口的初始值为0
TMOD = 0x02; //计时模式为2
IE=0; //禁止中断
TCON=0; //计数器清零
TH0 = 0xA0; //计数器置初值 9600波特率
TL0 = 0xA0;
TR0 = 1; //启动计数器
do
{
for (b=0; b<26; b++)
{
temp=design[b];
for(a=0;a<8;a++)
{
s=((temp&0x80)!=0); // 读已定义的数据并写数据到P1_0口:最高位;
temp<<=1;
do{}while(!TF0); //等待计数器计数溢出
P1_0=s;
TF0=0;
if(b==25&&a==7) ////////////////发送最后一位!
{
do{}while(!TF0); //等待计数器计数溢出
P1_0=0;
TF0=0;
}
}
}
delay(); //在发送数据之间有一定延时
TMOD = 0x02; //计数器模式变回为2
TH0 = 0xA0; //计数器置初值 9600波特率
TL0 = 0xA0;
TR0=1; //开始计数
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -