📄 dj485p9k.c.bak
字号:
//**********************************************************************
//* 主机与分机通话程序,由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 + -