📄 p_test.c
字号:
/*
******************************************************************************
无线数字传送程序
v1.0
write by Mr. pan
All rights reserved
******************************************************************************
*/
#include<iom8v.h>
#include<macros.h>
#include<eeprom.h>
#define baud 9600
#define fosc 3579545
//----分机编号---//
#define CarNumber 14
//--变量声明区---//
unsigned char Sbufx;
unsigned char SendSbuf[20]; //中断发送用的缓冲,发送后清零
unsigned char NowSbuf[20];
unsigned char krec,ReceiveSbuf[20]; //接收缓冲
unsigned char *SendPoint,Send_flag;
unsigned char TimeForCall;
unsigned int NowSend,NowSend2,TimeForSend;
unsigned char ICRead;
unsigned char SET_flag,CFM_flag;
//--wdg use
unsigned int TimeForWDG;
//--TIMER0 USE
unsigned char T0_Count;
//=========函数声明区=====//
void initialM8(void);
void putchar(unsigned char c);
unsigned char getchar(void);
void ReadEEPROM();
void PTR2K_SEND();
void PTR2K_RECEIVE();
void WRITEEEPROM();
//========模拟I2C 定义===//
//SDA-->PC1 ,SCL-->PC4, CS-->PC2 ,RST -->PC5
//SDA-->PC1
#define SDAH() (PORTC|=(1<<PC1))
#define SDAL() (PORTC&=0XFD)
// SCL-->PC4
#define SCLH() (PORTC|=(1<<PC4))
#define SCLL() (PORTC&=0XEF)
// CS-->PC2
#define CSL() (PORTC&=0XFB)
#define CSH() (PORTC|=(1<<PC2))
// RST -->PC5
#define RSTL() (PORTC&=0XDF)
#define RSTH() (PORTC|=(1<<PC5))
//SDA --输入
#define SDAIN() (DDRC&=0XDF)
#define SDAOUT() (DDRC=0XFF)
//========模拟I2C 函数声明===//
void I2C_Write(unsigned char addr,unsigned char Wbyte); //1
unsigned char I2C_Read(unsigned char addr); //2
unsigned char I2C_ReadByte(); //3
void I2C_WriteByte(unsigned char WriteByte); //4
void I2C_NACK(); //6
void I2C_CACK() ; //5
void I2C_ACK(); //7
void I2C_Stop(); //8
void I2C_Start(); //9
void sdelay(unsigned char k);
void I2C_Reset();
void IC_Num_Read();
/*---
void SDAH() ;
void SDAL() ;
*/
void I2C_CACK();
void putstr(char *s);
void Timer2_initial();
unsigned char kr1,kr2;
char const SET[]={"SET-"};//格式 :SET-001-015-0 Car NO+Dirver NO+CS=0/1
char const CF[]={"CFMK"}; //接收主机命令
struct node
{
char datax;
// node *next;
};
/*============================================================
MAIN START
===========================================================
*/
void main()
{
unsigned int i,j;
unsigned char test, k;
initialM8();
ReadEEPROM();
I2C_Reset();
i=0;
//I2C_Write(0,0X40);// test use
SDAIN();
//--主机设定--//
DDRB=0X03;
PORTB=0X02;
// I2C_Write(0,0X33);
sdelay(250);
ICRead=0;
T0_Count=0;
while(T0_Count<50);
//NowSend=1000;
//ADD WDG看,门狗
TimeForWDG=0;
WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1);//1024K脉冲数目
WDR(); ///看门狗清零
///==========~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
while(1)
{
//---SET-
if(NowSend!=(50*CarNumber))UDR='N';
NowSend=50*CarNumber;
TimeForWDG=0;
if(SET_flag)//回车结束符号
{
CLI();
// WRITEEEPROM(); //不设定---------????????????????????/
ReceiveSbuf[0]=0;
SEI();
SET_flag=0;
}
IC_Num_Read(); //是否有IC
SendSbuf[0]='T';
SendSbuf[1]='-';
//出错误检测
if((SendSbuf[4]<0x20)||(SendSbuf[4]>0x60))
{
SendSbuf[2]='E';
SendSbuf[3]='E';
SendSbuf[4]='R';
SendPoint=SendSbuf;
UDR=SendSbuf[4];
}
sdelay(250);
// ----------------------------------------
T0_Count=0;
//if(Sbufx=='S')CLI();
//PORTC|=0X02;
while(T0_Count<15);// 等待20ms
IC_Num_Read(); //是否有IC
T0_Count=0;
}
}
/*==========================================================================//
END MAIN()
============================================================================*/
void initialM8()
{
//== initial Timer0 as timer ==//
//--UART initial---//
UCSRB=(1<<RXEN)|(1<<TXEN); // Enable send and receive
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
//---接收中断使能---//
UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
//---定时器0初始化---//
TCCR0=(1<<CS02)|(1<<CS00); // 分频率=fosc/1024
TIMSK=(1<<TOIE0);
TCNT0=256-(baud/1024)/20; //定时0.05s
T0_Count=0;
TimeForCall=0;
//--------------------//
SEI();
DDRC=0XFF;
PORTC=0;
Sbufx=0;
//===PTR2000+ CONTROL ==//
DDRD|=0Xff;
PORTD|=0XF0;
PORTD&=0XEF;
PTR2K_RECEIVE(); //启动定为接收
while(T0_Count<10);
putstr("Start 00 \r\n");
PORTC=0;
Sbufx=0;
Send_flag=0;
Timer2_initial();
}
void putchar(unsigned char C)
{
//---关中断发送使能---//
//UCSRB&=0XDF;
while(!(UCSRA&(1<<UDRE)));
UDR=C;
//UCSRB|=0X40;
//---开中断发送使能--//
}
unsigned char getchar(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
void putstr(char *s)
{
while(*s)
{
putchar(*s);
s++;
}
}
///--- 发送 结束中断--硬件自动清零TXC标志位//
#pragma interrupt_handler Send_using_interrupt:iv_USART_TXC
void Send_using_interrupt(void)
{
if(*SendPoint)
{
UDR=*SendPoint;
Send_flag=1; //用他的 BIT0 记录发送
//*SendPoint=0;// 清零表明已经发送
SendPoint++;
return;
}
else
{ //--添加发送结束 标志的代码 here
Send_flag=0;
PTR2K_RECEIVE(); //由发送改为接收
}
//----用于精确定时---//
}
//--不能超过20个字符
void SendString2(unsigned char *str10)
{
unsigned char *p;
SEI();
while(Send_flag>0);//等待中断发送结束
p=SendSbuf;
while(*str10)
{
*p=*str10;
p++;
str10++;
//要有超时间判断,防止死循环====??????
}
//--开发送中断使能----//
SendPoint=SendSbuf;
UDR=*SendPoint; //启动发送中断
SendPoint++;
while(!Send_flag);
}
//---接收中断--//
#pragma interrupt_handler Receive_using_interrupt:iv_USART_RX
void Receive_using_interrupt(void)
{
//"SET- "-- AND --"CF"
char i;
Sbufx=UDR;
NowSbuf[0]=NowSbuf[1];
NowSbuf[1]=NowSbuf[2];
NowSbuf[2]=NowSbuf[3];
NowSbuf[3]=NowSbuf[4];
NowSbuf[4]=NowSbuf[5];
NowSbuf[5]=NowSbuf[6];
NowSbuf[6]=NowSbuf[7];
NowSbuf[7]=NowSbuf[8];
NowSbuf[8]=NowSbuf[9];
NowSbuf[9]=NowSbuf[10];
NowSbuf[10]=NowSbuf[11];
NowSbuf[11]=NowSbuf[12];
NowSbuf[12]=Sbufx;
/*
if((NowSbuf[0]=='S')&&(NowSbuf[1]=='E')&&(NowSbuf[2]=='T'))
{
SET_flag=1;
for(i=0;i<13;i++)
ReceiveSbuf[i]=NowSbuf[i];
}
*/
//-SEND SIGNED
if((NowSbuf[0]=='C')&&(NowSbuf[1]=='F')&&(NowSbuf[2]=='M'))
{
OCR2=180; //90;//0.2ms,
TimeForSend=0; //30<=>12ms
TCCR2=(1<<WGM21)|(1<<CS21); //8分频率 ,TCT比较输出MODE
}
// else SET_flag=0;
/*
if(Sbufx==CF[kr1]){kr1++; kr2+=2;}
else if(Sbufx==SET[kr1]){kr1++; kr2--;}
if((Sbufx=='C')||(Sbufx=='S'))
{
kr1=1;
krec=0;
ReceiveSbuf[0]=Sbufx;
kr2=100;
}
// if(krec>18)kcr=0;
if((Sbufx>9)&&(Sbufx<128))
{
if(krec<19) ReceiveSbuf[krec]=Sbufx;
krec++;
// UDR=Sbufx; ///把收到的马上发送给COMPUTER test only
}
*/
/*
if((Sbufx=='M')&&(kr2>101)) //--同步定时信号,T2
{
kr2=100;
TCNT2=0;
//--PTR2000 SEND MODE--//
// PTR2K_SEND(); //启动发送
}
*/
}
///====定时器0中断函数====//
#pragma interrupt_handler Timer0_interrupt:iv_TIMER0_OVF
void Timer0_interrupt(void)
{
TCNT0=238;//256-(baud/1024)/200; //定时0.005s
T0_Count++;
TimeForCall++;
if( TimeForWDG<5000)
WDR(); ///看门狗清零
}
//--定时器2精确定时用---//
void Timer2_initial()
{
OCR2=180;//90;//0.2ms--180=>0.4ms
//=x1;
TCNT2=0;
TIMSK|=(1<<OCIE2); //匹配中断使能
// TCCR2=(1<<WGM21)|(1<<CS21); //8分频率 ,TCT比较输出MODE
TimeForSend=0;
}
//---定时器2中断--//
#pragma interrupt_handler Timer2_interrupt:iv_TIMER2_COMP
void Timer2_interrupt(void)
{
TimeForSend++;
if(!(NowSend-TimeForSend)) //定时时间到
{
//
SendPoint=SendSbuf;
UDR=*SendPoint; //启动发送
SendPoint++;
}
/*
if(!(NowSend-(TimeForSend-400)))
{
PTR2K_RECEIVE(); //延时100ms启动接收
TimeForSend=0;
TCCR2=0; //关定时器2
}
*/
}
/*---***********************************
读EEPROM
***********************************
*/
void ReadEEPROM()
{
unsigned char jk,k,CRC,temp;
CLI();
EEPROMReadBytes(0, SendSbuf, 18);
CRC=0;
if(SendSbuf[0]=='S')
{
if(!(SendSbuf[12]-0x31)) //频率选择
{
PORTD|=(1<<PD4); //CS=1;
}
else
PORTD&=0XEF; //PD4=0;CS=0';
if(SendSbuf[14]=='G')SendSbuf[15]='G';//最后的
else SendSbuf[15]=0; //停止
//发送:T-001-015<CRC> /\: T-001-015<CRC>G --最后车发送
//--求车辆等待时间 ---
NowSend=SendSbuf[4]-0x30;
NowSend*=10;
NowSend+=(SendSbuf[5]-0x30);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -