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

📄 nobreakmod2.c

📁 51单片机数据发射
💻 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 + -