📄 mainbd.c
字号:
/*
******************************************************************************
无线数字传送程序
v1.0
write by Mr. pan
All rights reversed
******************************************************************************
*/
#include<iom8v.h>
#include<macros.h>
#include<eeprom.h>
#define baud 9600
#define fosc 3579545
//--变量声明区---//
unsigned char Sbufx;
unsigned char SendSbuf[20]={"CFCFCFMMx"}; //中断发送用的缓冲,发送后清零
unsigned char krec,ReceiveSbuf[20]; //接收缓冲
unsigned char *SendPoint,Send_flag;
unsigned char TimeForCall;
unsigned int NowSend,TimeForSend;
unsigned char ICRead;
unsigned char const Call[]={"CFCFCFMMx"};
//--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 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;
};
/*============================================================
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;
DDRB=0XFF;
PORTB=0XFF;
//-----------
//--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);
//----------
NowSend=1200;
SEI();
while(1)
{
//DDRC=0XFF;
sdelay(250);
//PORTC=0;
SendString2("12345");
// ----------------------------------------
T0_Count=0;
sdelay(250);
//PORTC=0XFF;
sdelay(250);
}
}
/*==========================================================================//
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/1204
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(); //由发送改为接收
//---------选择PC232 发送---PB1=1;-----//
DDRB=0X03;
PORTB|=(1<<PB0)|(1<<PB1);
//------------------------------
}
}
//--不能超过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"
Sbufx=UDR;
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;
OCR2=180; //90;//0.2ms,
// TimeForSend=0; //30<=>12ms
// TCCR2=(1<<WGM21)|(1<<CS21); //8分频率 ,TCT比较输出MODE
//--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++;
}
//--定时器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-100)) PTR2K_SEND(); //启动发送
if(!(NowSend-TimeForSend)) //定时时间到
{
// TCCR2=0; //关定时器2
//---------选择PTR2000+ 发送---PB1=0;PB0=1
DDRB=0X03;
PORTB&=0XFD;
//---------------------------
SendPoint=SendSbuf;
UDR=*SendPoint; //启动发送
SendPoint++;
TimeForSend=0;
}
}
/*---***********************************
读EEPROM
***********************************
*/
void ReadEEPROM()
{
unsigned char jk,CRC;
CLI();
EEPROMReadBytes(0, SendSbuf, 18);
CRC=0;
if(SendSbuf[0]=='S')
{
if(!(SendSbuf[12]-0x30)) //频率选择
{
PORTD&=0XEF; //PD4=0;CS=0';
}
else
PORTD|=(1<<PD4); //CS=1;
if(SendSbuf[14]=='G')SendSbuf[15]='G';//最后的
else SendSbuf[15]=0; //停止
//发送:T-001-015<CRC> /\: T-001-015<CRC>G --最后车发送
for(jk=0;jk<9;jk++) //把要发送的放在发送上
{
SendSbuf[jk]=SendSbuf[jk+2];
CRC^=SendSbuf[jk];
}
SendSbuf[jk]=CRC; //jk=9;
SendSbuf[10]=SendSbuf[15];
SendSbuf[11]=0;
NowSend=SendSbuf[2]-0x30;
NowSend*=10;
NowSend+=(SendSbuf[3]-0x30);
NowSend*=10;
NowSend+=(SendSbuf[4]-0x30);
//===
NowSend*=36;
}//end if(SendSbuf[0]=='S')
else{ //没有时候的默认值SET-001-000-0,1号车
jk=0;
SendSbuf[jk++]='T';
SendSbuf[jk++]='-';
SendSbuf[jk++]='0';
SendSbuf[jk++]='0';
SendSbuf[jk++]='1';
SendSbuf[jk++]='-';
SendSbuf[jk++]='0';
SendSbuf[jk++]='0';
SendSbuf[jk++]='0';
SendSbuf[jk++]='-';
SendSbuf[jk++]='0';
SendSbuf[jk++]='N';
NowSend=36;///???????????????????????????
PORTD&=0XEF; //PD4=0;CS=0';
}
SEI();
}
void WRITEEEPROM()
{
unsigned char jk,CRC,IDX;
CLI();
EEPROMWriteBytes(0, ReceiveSbuf, 18);
EEPROMReadBytes(0, SendSbuf, 18);
CRC=0;
if(SendSbuf[0]=='S')
{
if(SendSbuf[12]-0x30) //频率选择
{
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 --最后车发送
for(jk=0;jk<9;jk++) //把要发送的放在发送上
{
SendSbuf[jk]=SendSbuf[jk+2];
CRC^=SendSbuf[jk];
}
//------------------写 IC 卡= 司机号--------
// I2C_Write(0,0X33); 12,14,16 IC卡存放处
if(!(PIND&0X08)) // IC IN
{
IDX=SendSbuf[6];
I2C_Write(12,IDX);
sdelay(200);
IDX=SendSbuf[7];
I2C_Write(14,IDX);
sdelay(200);
IDX=SendSbuf[8];
I2C_Write(16,IDX);
sdelay(200);
}
//-----------------------------------------
SendSbuf[jk]=CRC; //jk=9;
SendSbuf[++jk]=SendSbuf[15];
SendSbuf[++jk]=0;
NowSend=SendSbuf[2]-0x30;
NowSend*=10;
NowSend+=(SendSbuf[3]-0x30);
NowSend*=10;
NowSend+=(SendSbuf[4]-0x30);
NowSend*=36;
}//end if(SendSbuf[0]=='S')
SEI();
}
/************************************************************
PTR2000 SET FUNC
*******************************************************
*/
void PTR2K_SEND()
{
PORTD|=(1<<PD6)|(1<<PD5);
}
void PTR2K_RECEIVE()
{
PORTD|=(1<<PD6)|(1<<PD5);
PORTD&=0XBF;
//CS=0/1 在SET-后就设定好,以后不要动
}
/********************************
I2C 模拟
*************************************************************/
//--i2c \
//#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
//#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
//#define Wait() {while(!(TWCR&(1<<TWINT)));}
void sdelay(unsigned char k)
{
while(k--);
}
void I2C_Reset()
{
CSL();
RSTL();
SCLL();
sdelay(100);
RSTH();
sdelay(100);
SCLH();
sdelay(100);
SCLL();
sdelay(100);
RSTL();
}
void I2C_Start() //9
{
DDRC=0Xff;
SDAH();
// sdelay(10);
SCLH();
//---------
sdelay(100);
SDAL();
sdelay(100);
//----
SCLL();
sdelay(10);
}
void I2C_Stop() //8
{
//DDRC=0Xff;
SDAL();
SCLH();
sdelay(100);
SDAH();
sdelay(100);
SCLL();
SDAL();
sdelay(10);
}
void I2C_ACK() //7
{
SDAL();
SCLH();
sdelay(100);
SCLL();
SDAH();
sdelay(10);
}
void I2C_NACK() //66
{
SDAH();
SCLH();
sdelay(100);
SCLL();
SDAL();
sdelay(10);
}
void I2C_CACK() //55
{
//SDAH();
SCLH();
sdelay(10);
SDAIN();//----
sdelay(10);
SCLH();
sdelay(100);
SCLL();
sdelay(10);
SDAOUT();
sdelay(10);
}
void I2C_WriteByte(unsigned char WByte) //44
{
unsigned char i,j,k;
DDRC=0XFF;
for(i=0;i<8;i++)
{
if(WByte&0x80) SDAH();
else SDAL();
sdelay(10);
SCLH();
sdelay(100);
SCLL();
sdelay(100);
WByte<<=1;
}
}
unsigned char I2C_ReadByte() //33
{
unsigned char i,RDbyte;
SDAIN();
DDRC=0XFD;
RDbyte=0;
for(i=0;i<8;i++)
{
SCLH();
sdelay(100);
//SDA-->PC1
if(PINC&0X02) //??
{ RDbyte<<=1;
RDbyte|=0x01;
}
else
{
RDbyte<<=1;
RDbyte&=0xfe;
}
sdelay(10);
SCLL();
}
//SDAOUT();
DDRC=0XFF;
return RDbyte;
}
unsigned char I2C_Read(unsigned char addr) //22
{
unsigned char i,k;
I2C_Start();
I2C_WriteByte(0xa0);//写 CONTRL
I2C_CACK();
sdelay(10);
I2C_WriteByte(addr);
I2C_CACK();
sdelay(10);
I2C_Start();
I2C_WriteByte(0xa1);//读控制字符 CONTRL
I2C_CACK();
sdelay(10);
k=I2C_ReadByte();
I2C_NACK();
I2C_Stop();
return k;
}
//---写I2C
void I2C_Write(unsigned char addr,unsigned char Wbyte) // 111
{
unsigned char i,k;
I2C_Start();
I2C_WriteByte(0xa0);//写 CONTRL
I2C_CACK();
sdelay(10);
I2C_WriteByte(addr);
I2C_CACK();
sdelay(10);
I2C_WriteByte(Wbyte);
I2C_CACK();
sdelay(10);
I2C_Stop();
}
//----------- IC 卡处理-----------//
void IC_Num_Read()
{
//老板,PD3=0,插卡了 ,卡座常闭合
unsigned char datax,j;
if(PIND!=0XA3) ICRead=1;
if((PIND==0XA3)&&(ICRead>0))
{
ICRead=0;
//IC卡:12,14,16 司机号保存处
//--写SendSbuf[];
sdelay(200);
CLI();
for(j=6;j<9;j++)
{
// datax=I2C_Read(j*2);
// if((datax>47)&&(datax<60)) //是ASCII CODE
// {//写发送
SendSbuf[j]=I2C_Read(j*2);//I2C_Write(0,0X33);
sdelay(200);
//}
//else j=15;
}
if(j==9) //写eeprom
{
EEPROMWriteBytes(8, &SendSbuf[8], 1);
sdelay(200);
EEPROMWriteBytes(9, &SendSbuf[9], 1);
sdelay(200);
EEPROMWriteBytes(10,&SendSbuf[10],1);
}
}//END OF:if((PIND==0XA3)&&(ICRead<3))
SEI();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -