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

📄 gm16c550.c

📁 一种gm16c550的c51程序,我花几天时间搞的
💻 C
字号:
#include "stdafx.h"

data unsigned char ReceiveSBUF;

unsigned char step = 0;
unsigned char indexMeter  = 0;
unsigned char flagMeter;
unsigned char meterOvertimeFlag = 0;  // 读电表超时使能  0: 不进行超时计数  1:进行超时计数
unsigned char meterOTCounter = 0;     // 读电表超时计数器
unsigned int  len  = 0;
unsigned char BuffMeter[30];


struct  GM16c550_data
       {unsigned char n;//
        unsigned char index;
        unsigned char *d;
       }GM16c550_recive_datastream;
//=================================================================================================
void GM16c550_set_BTL(unsigned char cs)
{GM16c550_LCR=0x80;
 switch(cs)
       {case   1:       GM16c550_DLL=0x80;     GM16c550_DLM=0x01;  break;//600
        case   2:       GM16c550_DLL=0xc0;     GM16c550_DLM=0x00;  break;//1200
        case   3:       GM16c550_DLL=0x80;     GM16c550_DLM=0x00;  break;//1800
        case   4:       GM16c550_DLL=0x60;     GM16c550_DLM=0x00;  break;//2400
        case   5:       GM16c550_DLL=0x30;     GM16c550_DLM=0x00;  break;//4800
        case   6:       GM16c550_DLL=0x18;     GM16c550_DLM=0x00;  break;//9600
        case   7:       GM16c550_DLL=0x0c;     GM16c550_DLM=0x00;  break;//19200
        case   8:       GM16c550_DLL=0x06;     GM16c550_DLM=0x00;  break;//38400
        default :       GM16c550_DLL=0x18;     GM16c550_DLM=0x00;  break;//9600
        }
 GM16c550_LCR&=0x1b;
 return;
}
//=================================================================================================
void GM16c550_init(void)
{
	GM16c550_set_BTL(2);
 	GM16c550_LCR=0x1b;//03;//1b;//无奇偶校验、数据位为8位、停止位1位
 	GM16c550_FCR=0x07;//00:禁止FIFO模式  07:FIFO设置
 	GM16c550_IER=0x01;//01;//使能接收和发送中断03b 7;//开启接收器线状
 	//GM16c550_ISR=0x3f;//05;//???????????????
 	//GM16c550_MCR=0x03;//?????????
 	IT1 = 1;
 	EX1=1;
	// IP=0x40;
 }
//=================================================================================================
bit GM16c550_send(unsigned char datastr[20],unsigned int n)
{
	unsigned char j;
	unsigned int i;
 	unsigned long k;
	bit ok=1;
 	RS485_en=0;
 	delay(5);
 	delay(250);
 	i=0;
 	for(i=0;i<=n&&ok;i++)
    {
		j=GM16c550_LSR;
     	k=0;
     	while((!(j&0x60))&&(k<wait_limit))
        {
			j=GM16c550_LSR;
           	delay(1);
           	k++;
        }
     	if(k<wait_limit)
       	GM16c550_THR=datastr[i];
     	else
       	{
			ok=0;
        	GM16c550_init();//?????????
       	}
     	delay(50);
    }

 	delay(5);
 	RS485_en=1;;
 	return  ok;
}
//=================================================================================================
void GM16c550_recive_byte(void)  interrupt 2
{
 	EX1 = 0;
	ReceiveSBUF = GM16c550_RHR;
	recv645();
 	EX1 = 1;
}

// 接收电表645规约
void recv645() reentrant
{
	switch(step)
	{
		case 0:                 // 帧头
		{
			if(ReceiveSBUF == 0x68)
			{						
				BuffMeter[indexMeter++] = ReceiveSBUF;
				step++;
//				485Timer = 0;
//				485Timerflag = 1;
			}
		}
		break;
		case 1: // 电表地址
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		{
			BuffMeter[indexMeter++] = ReceiveSBUF;
			step++;
		}
		break;
		case 7: // 帧头
		{
			if(ReceiveSBUF == 0x68)
			{
				BuffMeter[indexMeter++] = ReceiveSBUF;
				step++;
			}	
			else
			{						
				flagMeter  = 0;
				indexMeter = 0;
				step       = 0;
			}
		}
		break;
		case 8: //控制码
		{
			BuffMeter[indexMeter++] = ReceiveSBUF;
			step++;
		}
		break;
		case 9: // 数据长度
		{
			len = 0;
			BuffMeter[indexMeter++] = ReceiveSBUF;
			step++;
		}	
		break;
		case 10:                // 读取数据
		{
			BuffMeter[indexMeter++] = ReceiveSBUF;
			len ++;
			if(len == BuffMeter[9]) 
				step ++;
		}
		break;
		case 11:                // 读取校验
		{
			BuffMeter[indexMeter++] = ReceiveSBUF;
			step++;
		}
		break;
		case 12:                // 读取结束符
		{
			if(ReceiveSBUF == 0x16)
			{				
				BuffMeter[indexMeter] = ReceiveSBUF;
				flagMeter = 1;
				step = 0;

				meterOTCounter    = 0;  // 清超时计数器
				meterOvertimeFlag = 0;  // 清超时定时器
			}					
			else
			{
				flagMeter  = 0;
				indexMeter = 0;
				step       = 0;
			}
		}
		break;
		default:
		{
			flagMeter    = 0;
			indexMeter   = 0;
			step         = 0;
		}
		break;
	}
}

⌨️ 快捷键说明

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