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

📄 dj485p9k.c.bak

📁 这是一个PIC单片机的实时操作系统
💻 BAK
📖 第 1 页 / 共 3 页
字号:

//**********************************************************************
//*    主机与分机通话程序,由CCS改为PICC 的版本
//*
//* DJ485 的程序还是有点总是不能通过编译 
//*
// 485的芯片的发送使用端只有在高电平时才会有效,低电平时是无效的
//485DA,485DB,已是能够正确地接收与发送数据了,
//异步收发器的RC7,RC6都要设为输入
//485EA,EB主要是增加了注释2007-2-25 13:43
//485E2B程序把程序调好了,程序可以发送也是可以接收,E2A是不能用2007-2-25 20:28
//485F做为最终版本2007-2-25 20:35
//G的程序想把它改成可以接收不同的命令并做出不同的回答S2007-2-26 13:07
//H的程序准备把读EERPOM的程序也补上去2007-3-4 22:27
//I的程序加上了模拟串口部分2007-3-11 19:58
  //后面把程序改成了多个C文件的集成,这样比较好控制
//K的程序和以前的相比,把接收模拟232部分电路做好了点
//    并且把中断调用的接收程序做为一个子程序来做,把模拟232发送与接收都调试好了 2007-3-14 22:07
     //程序在调模拟串口接收数据后会现出现退不出来的情况,估计是没有关闭一下RB0中断功能,
     //程序在RB0中断接收到跳出来的情况是不正常的,准备先用串口接收功能先把程序调试好了再好
     //L的程序准备先用异步端口把接收的数据进行处理,再想想用模拟口时如何处理
     //M的程序补上按键,和可以接收PING的命令
     //M的测试发现,接收到的每个数据后面有跟着一个00,要清除掉2007-3-21 20:46
     //P 的程序EEPROM读写不正确,还没找出原因2007-3-22 22:31
    //P2 已可以正确认的写入EEPROM的数据了
    //P3的程序增加了接收当前表格的联控数量
    //P4增加了液晶的子程序2007-3-26 23:01,其它的暂时关掉了
    //P5 对液晶子程序增加中文字的
    //P6把液晶与通讯同时打开调试,可以接收联控数据了
    //p7液晶增加上了,同时按键采用RA5做为输入了2007-4-1 20:03
    //P9准备在P7的基本上增加了欢迎界面2007-4-5 21:02
    //P9C的程序还是有点问题
    //P9D的程序基本上调试已可能,但是在通讯过程还是会存在死机的可能性还有写EEPROM时有时会写不进行,子程序要改进
   
 //P9E 把按键使能了,同时把SHOUDAO改成位变量,增加了自动测试,与手动测试模式 2007-4-14 22:25 //P9G准备增加判断写数据时是不是没写好的子程序,同时改进液晶的提示信息
 //P9H 把读的程序也调好了,2007-4-22 16:33,但是在配合联控时还是有问题,要再调一下
 //P9H 写完再读的程序有点错,单独读没错,要再看一下
 //P9H 的程序没再看液晶了,总结出了,在烧写联控时,如果要烧写成功的话
 //把要把数据线,时钟线,和控制线平时都要为低电平,这样才不会引起单片机工作
 //另外的话,把今天测试时,把控制线先接地了,如果想用自动测试的话,我想最好要把如果收到信号后就把控制线拉低
 //烧写结结时,再把控制拉高,这想即可自动测试,又可以解瘊问题
 //24LCP6是不过在判断写时间去掉而已,外加了一个延时,可以再确认一下2007-4-23 22:34
 //dj485P9K是基本上可以用的程序了
//联控烧写程序总结
//********************************************************************************2007-4-26 21:46
//877的RA4是否没有开路输出的脚,没加上拉是输不出高电平的,这点一直没有注意到
//另外在读EERPOM,中一直会出现有点有错,原因还是找不到,就先不用的了
// 当单片机的引脚上有电压时,会使用单片机有可以处于不确认的状态中工作,如果有2-3个引脚上有
//电压时可能就更明显,在烧写时,平常尽量让单片机的SDA,SCL处于低电平,就可以比较正常的烧写了
//*************************************************************************
 
 
 
 
 
#include <pic.h>
#include <pic1687x.h>
#include "DJ485headB.h"
#include <conio.h> //模拟232用
//24LC04的读写




//#define PKT_WAIT_ADDR_HIGH  1
static char cOurAddrHigh;
static char cOurAddrLow;
static char cRs485RxChar;
static char cRS485State;

static char cStart;
static char cNetAddrHigh, cNetAddrLow;
static char cLenExpected;// 数据的长度
static char cCommand;

bank1 char  c485Buf[35];
bank1 char  testbuf[01];
bank1 char  cData[10];
static char cRxCrcHigh, cRxCrcLow;
static char cCalcCrcHigh, cCalcCrcLow;
static char cBufPtr;
static char cError;
static char cCrcTmp, cCrcTmp5, cCrcTmp4, cCrcTmp3, cCrcTmp2;
uchar  LKCOUNT  ; //放置联网控制器的数量
//} RS485_Protocol;
#define MASTER


//函数声明
void CRC16_Init( void );
void BinToHexAscii( char c );
void CRC16_Update4Bits( char val );
char PacketHasPayload(void);
char PostValidatePacket(void);
char Rs485Decode( void );
void Rs485GetPacket( char *cCom, char *cLen, char *cData );
void Rs485Initialise(char cAddrHigh, char cAddrLow);
char Rs485Process(void);
void Rs485SendChar( char c );
void Rs485SendPacket( char cCmd, char cLen, char *cData );
void Rs485UpdateCrc( char cVal );
void Setup(void);
void ConfigureComms(void);
void delay_ms(int KK);
void PacketTest(char cCommand);//命令的响应
uchar  keyprocess(void) ; //判断按键按下的类型
void writeeeprom(void);//写EEPRM用的函数
void  BeepSound(void); //蜂鸣器叫声
void BeepTwoSound(void) ;//失败叫两声
void readeeprom(void) ; //读EEPROM程序

//24l04
extern  unsigned  iic_read(unsigned char start_address );
extern  void iic_write(unsigned char start_address );
extern  unsigned char write;/*待写入数缓存*/
extern bank2 unsigned char read[30];
void delay();
// 模拟232的定义函数 
extern  char   getch(void) ;
extern  void  putch(char c) ;
//void  delay3(void);
void delay1ms(char  count);
extern void Lcdint(); //LCE初始化
extern  void LCD_Write_Dat(unsigned char val) ;
extern  void LCD_Write_Com(unsigned char val) ;
extern  void LcdFucInt(void) ; //显示菜单初始化
extern  void  LCDCOUNTOVER (unsigned char COUNT);//显示状态
extern  void  LcdFuc(unsigned char  FucK);
extern void  LcdFuc2(char CLen,const unsigned  char *FData);

bank1 char cTest[10];
char tbuf=0;
char test=0;
unsigned char  i,bbt[9];
const	unsigned char  KKB[8]= {
0x00, 0x02,0x01 ,0x01 ,0x00 ,0xA2 , 0X0E ,0X00} ;
const	unsigned char  KKE[8]= {
0x00, 0x02,0x01 ,0x01 ,0x00 ,0xA3 , 0X0E ,0X00} ;

char cPacketReady;
char  Int232Ready; //模拟232接收数据完毕
char cLenOfData;
char cCmd, c;
char LCDDATA ;
char  testlend;
bit  SHOUDAO=0X00;  //收到连接
bit  autoandsetp;
bit  bj=0;
extern bit err_flag;
//0x01;  //默认是自动连接测试,否则是手动连接
//1为自动运行,0为手动运行
	
//
bank1 uchar  keyready ;  //按键的类型 	
	

void  delay3(void)
{
	unsigned char k;
	for(k=100; k>0;k--)
	;
	
	}
	void  delay4(void)
{
	unsigned char k;
	for(k=150; k>0;k--)
	;
	
	}

void delay()
{
  unsigned  int  de;
  de=1000;
  while(de--)
  {;}
}

//************************************************************************
//输入参数: 命令
// 
//功能:输入命令,执行相应的功能
//
void  PacketTest(char  cCommand)
{
	
	 switch (cCommand )
	    {
						case     SENSOR_GET_DATA  :
						{ 
							
									Rs485SendPacket( SENSOR_GET_DATA, 5, &cTest[0] );
									asm("nop");
						
						}
						case    SENSOR_CONFIG   :
						
						{ 
						Rs485SendPacket( SENSOR_CONFIG, 5, &cTest[0] );
						asm("nop");
						
						}
						case  SENSOR_PING_SYNC :
						{ 
						Rs485SendPacket( SENSOR_PING_SYNC, 5, &cTest[0] );	
						asm("nop");
						
						}
						case  SENSOR_POLL_CMD  :
						{ 
						Rs485SendPacket( SENSOR_POLL_CMD, 5, &cTest[0] );
						asm("nop");
						
						}
	 	
	 	    }
	
	
	
	}




//****************************************************************************
// char GetPacketCmdType(void)
//
// Check packet command type
// Return TRUE if packet has a data payload.
//  测试数据包的类型  
//****************************************************************************
char PacketHasPayload(void)
{
			if ( cCommand == SENSOR_GET_DATA ) return TRUE;
			if  (cCommand == SENSOR_test)   return  TRUE;
			if  (cCommand == SENSOR_POLL_CMD )   return  TRUE;
			if  (cCommand == SENSOR_CONFIG )   return  TRUE;
			if  (cCommand == SENSOR_LKCOUNT )   return  TRUE;	
			if  (cCommand == SENSOR_LKSZ )   return  TRUE;	
  	
 		
  return FALSE;
}

//****************************************************************************
// void Rs485Decode(void)
//
// Decode an incomming packet on the RS485 network
//
// Expecting:
// START,
// NETWORK ADDRESS_HIGH,
// NETWORK ADDRESS_LOW,
// PAYLOAD LENGTH,
// COMMAND,
// optional DATA,
// CRC HIGH,
// CRC LOW
//
//****************************************************************************
//#separate
char Rs485Decode( void )
{
   switch ( cRS485State )
   {
        case    PKT_WAIT_START:  cStart = cRs485RxChar;
                                 if ( cRs485RxChar == PKT_START ) // Check for the start of packet byte
                                 {
                                    cRS485State++;
                                    asm("nop");
                                    asm("nop");
                                 }
                                 break;

        case PKT_WAIT_ADDR_HIGH: cNetAddrHigh = cRs485RxChar;
        	                         asm("nop");
                                 asm("nop");
                                 cRS485State++;
                                 break;

        case  PKT_WAIT_ADDR_LOW: cNetAddrLow = cRs485RxChar;
                                 cRS485State++;
                                 break;

        case       PKT_WAIT_LEN: cLenExpected = cRs485RxChar;
                                asm("nop");
                                testlend=cRs485RxChar;
                                 if ( cLenExpected > sizeof(c485Buf) )
                                 {
                                    cRS485State = PKT_INVALID;
                                    cError = BAD_LENGTH;
                                 }
                                 else
                                 {
                                   cBufPtr = 0;
                                   cRS485State++;
                                 }
                                 break;

        case           PKT_CMD:  cCommand = cRs485RxChar;
                                 if( PacketHasPayload() )  cRS485State = PKT_WAIT_DATA;
                             //    else
                               //  {
                              //     if(cCommand==SENSOR_test) cRS485State = PKT_WAIT_DATA;
                                   else cRS485State = PKT_WAIT_CRC_HIGH;
                             //    }
                                 break;

        case     PKT_WAIT_DATA:  c485Buf[cBufPtr] = cRs485RxChar;
                                 cBufPtr++;
                                 if ( cBufPtr == cLenExpected ) // If last byte of data received
                                 {
                                   cRS485State++;               // next byet is the CRC high byte
                                 }
                                 break;

        case PKT_WAIT_CRC_HIGH:  cRxCrcHigh = cRs485RxChar;
                                 cRS485State++;
                                 break;

        case  PKT_WAIT_CRC_LOW:  cRxCrcLow = cRs485RxChar;
                                 cRS485State = PKT_COMPLETE;
                                 break;

        case      PKT_COMPLETE:  break;       // Idle state
        case         PKT_VALID:  break;       // Idle state
        case       PKT_INVALID:  break;       // Idle state

        default:                 cRS485State = PKT_WAIT_START;
                                 break;
     }

 return cRS485State;
}




char IntRs485Decode( void )
{
   switch ( cRS485State )
   {
        case    PKT_WAIT_START:  cStart = cRs485RxChar;
                                 if ( cRs485RxChar == PKT_START ) // Check for the start of packet byte
                                 {
                                    cRS485State++;
                                    asm("nop");
                                    asm("nop");
                                 }
                                 break;

        case PKT_WAIT_ADDR_HIGH: cNetAddrHigh = cRs485RxChar;
        	                         asm("nop");
                                 asm("nop");
                                 cRS485State++;
                                 break;

        case  PKT_WAIT_ADDR_LOW: cNetAddrLow = cRs485RxChar;
                                 cRS485State++;
                                 break;

        case       PKT_WAIT_LEN: cLenExpected = cRs485RxChar;
        	                      testlend =cRs485RxChar;
                                asm("nop");
                                 if ( cLenExpected > sizeof(c485Buf) )
                                 {
                                    cRS485State = PKT_INVALID;
                                    cError = BAD_LENGTH;
                                 }
                                 else
                                 {
                                   cBufPtr = 0;
                                   cRS485State++;
                                 }
                                 break;

        case           PKT_CMD:  cCommand = cRs485RxChar;
                                 if( PacketHasPayload() )  cRS485State = PKT_WAIT_DATA;
                                 else
                                 {
                                   if(cCommand==SENSOR_test) cRS485State = PKT_WAIT_DATA;
                                   else cRS485State = PKT_WAIT_CRC_HIGH;
                                 }
                                 break;

        case     PKT_WAIT_DATA:  c485Buf[cBufPtr] = cRs485RxChar;
                                 cBufPtr++;
                                 if ( cBufPtr == cLenExpected ) // If last byte of data received
                                 {
                                   cRS485State++;               // next byet is the CRC high byte
                                 }
                                 break;

        case PKT_WAIT_CRC_HIGH:  cRxCrcHigh = cRs485RxChar;
                                 cRS485State++;
                                 break;

        case  PKT_WAIT_CRC_LOW:  cRxCrcLow = cRs485RxChar;
                                 cRS485State = PKT_COMPLETE;
                                 break;

        case      PKT_COMPLETE:  break;       // Idle state
        case         PKT_VALID:  break;       // Idle state
        case       PKT_INVALID:  break;       // Idle state

        default:                 cRS485State = PKT_WAIT_START;
                                 break;
     }

 return cRS485State;
}

//**************************************************
// 中断服务子程序
//**************************************************
//#INT_RDA
void interrupt clkint(void)   //定时器中断函数
{
	  GIE=0;// 关掉中断
	  
    if(T0IF==1)    //重新加载定时常数
    	{
    		T0IF=0;
    		TMR0 = TMR0_RELOAD;        // Reload PICs timer
    		}
    
    while(RCIF==1)              // If USART RX Interrupt
    {

         TMR0 = TMR0_RELOAD;

         cRs485RxChar = RCREG;
         asm("nop");
   asm("nop");
   asm("nop");

         if ( !( RCSTA & 6 ) )                 // Then if no errors
         {                                     // Process received character
             Rs485Decode();                    // Decode RS485 network trafic
             //bit_set( RCSTA, CREN );           // Enable receiver.
             CREN=1;
//    testbuf[tbuf]=cRs485RxChar;
//   tbuf++;
//  if(tbuf==0x08)     	
     asm("nop");
   asm("nop");
   asm("nop");
         }
         else
         {
             //bit_clear( RCSTA, CREN );         // Clear any errors
             CREN=0;
             cRs485RxChar = RCREG;
             cRs485RxChar = RCREG;
           //  bit_set( RCSTA, CREN );           // Enable receiver.
             CREN=1;
         }

       // bit_clear( PIR1, RCIF );
        RCIF=0;
      //  cRs485RxChar=0;

    }
   

⌨️ 快捷键说明

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