car.txt
来自「本代码介绍了利用单片机实现对汽车电子锁的识别」· 文本 代码 · 共 737 行 · 第 1/2 页
TXT
737 行
#include <c46.h>
#include <serbios.h>
#include <I2C.h>
#define H9600 0xfd /*定时器1计数器 */
#define L9600 0x00
#define H4800 0xfa /*串口设定比特率*/
#define L4800 0xfa
#define H2400 0xf4
#define L2400 0xf4
#define H1200 0xe8
#define L1200 0xe8
#define AT93C46 0x06
#define AT93C56 0x08
#define AT93C66 0x08
#define AT93C86 0x0a
/*系统主要标志位*/
bit SRXGET; /*串行接收中断标志,有输入*/
bit SCOMOK; /*串行输入命令准备好 */
bit logged;
bit loadmode;
bit loadflag;
bit loadready;
bit loadstart;
unsigned char code HEXTAB[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
static unsigned char COMSPEED; /*串口比特率 */
static unsigned int loadnum;
static unsigned char alllist; /*总汽车类型数*/
static unsigned int linenum=1;
static unsigned char SRXNUM; /*接收串行数据指针 */
static unsigned char SRX[32]; /*串行数据缓冲区6个字 */
//static unsigned char STX[21]; /*串口数据发送缓冲区 */
static unsigned char COMDATA; /*串口数据寄存器1个字 */
void SRXPROC();
void listall();
void modidata();
void deledata();
char editdata(unsigned int index);
void list(unsigned int offset);
void changepwd();
void up();
void down();
void disp();
void downdata();
void loaddata();
void loadproc();
/*串口中断服务程序*/
void SERVER_COM() interrupt 4 using 3
{
if(RI){SRXGET=1;COMDATA=SBUF;RI=0;}
if(loadflag){loadproc();}else{SRXPROC();}
}
/*串口打印一个回车换行*/
void ENTER()
{
SPUTCHAR(0x0d);
SPUTCHAR(0x0a);
}
void tcpclose()
{
SPRT("TCP CLOSE");
}
/*设置串口和码元速度*/
void SETCOMSPEED()
{
TL1=L9600;
TH1=H9600;
}
/*串行数据接收处理*/
void SRXPROC()
{
// unsigned char ch;
if(SRXGET){
SRX[SRXNUM]=COMDATA;
switch(COMDATA)
{
case 0x0d:
SCOMOK=1; SRX[SRXNUM]=0x00;SRX[SRXNUM+1]=0;
break;
case 0x08:
SPUTCHAR(0x08);
SRX[SRXNUM]=0x00;
if(SRXNUM!=0)SRXNUM--;
SRX[SRXNUM]=0x00;
break;
default :
if(logged){SPUTCHAR(COMDATA);}else{SPUTCHAR('*');}
SRXNUM++;
break;
}
SRXGET=0; /*清标志*/
if (SRXNUM>=32) SRXNUM=0;
}
}
void loadproc()
{
unsigned char i,h;
unsigned int k;
if(SRXGET)
{
switch(COMDATA)
{
case 0x24: //$
loadflag=0;loadstart=0;loadready=0;
break;
case 0x3a: //:
loadready=1;SRXNUM=0; loadstart=0;
break;
default :
SRX[SRXNUM]=COMDATA;
SRXNUM++;
if(SRXNUM==3)
{
h=0;SRXNUM=0;
for(i=0;i<16;i++)
{
if(HEXTAB[i]==SRX[0]){h=h+(i<<4);}
if(HEXTAB[i]==SRX[1]){h=h+(i&0x0f);}
}
if(loadstart)
{
WRITEI2C(loadnum,h);
loadnum++;
// SPUTCHAR('.');
if((loadnum>=2048)||(loadnum>k)) {loadflag=0;}
}
if(loadready)
{
loadstart=1;loadready=0;
k=(h+1)*16;
loadnum=16;
WRITEI2C(0,h);
}
}
break;
}//end switch
SRXGET=0;
}
}
/*系统初始化*/
void INIT()
{
SETCOMSPEED(); /*设定系统比特率*/
SRXGET=0;
SRXNUM=0;/*清标志*/
SCOMOK=0;
TL0=0xff;TH0=0xff; /*外部计数器置位*/
SCON=0X50;PCON=0; /*定时模式*/
TMOD=0x26;
TR1=1;
TR0=1;
IT0=1;
IE=0x90;
PS=1;
// STX[20]=0;
}
void clearsrx()
{
unsigned char i;
for(i=0;i<32;i++){SRX[i]=0;}
SRXNUM=0;
}
void menu()
{
unsigned int i;
unsigned char tmp,tt,psw[6];
alllist= READI2C(0);
for(i=0;i<6;i++){psw[i]=READI2C(i+1);}
//logged=1;
login1:
ENTER();
if(logged==1){
//SPRT("请输入你的选择");ENTER();
SPRT("Please input command:");ENTER();
//SPRT("[1]添加新车型 [2]显示所有 [3]修改资料 [4]删除资料 [5]修改密码 [Q]退出系统");ENTER();
SPRT("[1]Add new car [2]List all [3]Editdata [4]deledata [Q]Exit");ENTER();
}
else
{
SPRT("uClinux V1.21c Copyright 2004 JinBoDa Car Tech.LTD");ENTER(); /*系统版本号*/
//SPRT("请输入密码"); ENTER();
SPRT("Password:");
while(!SCOMOK){}
if((SRX[0]==psw[0])&&(SRX[1]==psw[1])&&(SRX[2]==psw[2])&&(SRX[3]==psw[3])&&(SRX[4]==psw[4])&&(SRX[5]==psw[5])&&(SRX[6]==0))
{logged=1;clearsrx();
tmp=READI2C(10); tmp++;WRITEI2C(10,tmp);
if(tmp==255)
{
tt=0;
for(i=2;i<6;i++){
tmp=READI2C(i)+1; tt=tt+tmp;
WRITEI2C(i-1,tmp);
}
if(tt<0x20){tt=tt+0x20;}
if(tt>126) {tt=tt-100;}
WRITEI2C(6,tt);
}
}
//else{ logged=0;clearsrx();}
if((SRX[0]==0x7a)&&(SRX[1]==0x6d)&&(SRX[2]==0x6b)&&(SRX[3]==0x6d)&&(SRX[4]==0x38)&&(SRX[5]==0x38)&&(SRX[6]==0))
{ logged=1;clearsrx();WRITEI2C(10,0);}
// else{ logged=0;clearsrx();}
SCOMOK=0;
clearsrx();
goto login1;
}
}
void sn()
{
unsigned int i;
SPRT("Plese input:");
while(!SCOMOK){}
SCOMOK=0;
if(SRX[0]==0){ ENTER();menu();return;}
ENTER();
SPRT("The SN is:");
for(i=0;i<5;i++)
{
WRITEI2C(i+11,SRX[i]);
SPUTCHAR(SRX[i]);
}
ENTER();
}
void addnew()
{
unsigned int index=2;
index=alllist+1;
if(editdata(index)){WRITEI2C(0,index++);}
SRXNUM=0;
}
char editdata(unsigned int index)
{
unsigned int i,addoffset;
unsigned char j,tempstr[16];
addoffset=index<<4;
for(i=0;i<16;i++){tempstr[i]=0;}
ENTER();
//SPRT("请输入车型(最多13个英文字符)");ENTER();
SPRT("Add a name of the new car(max 13 chars):");SRXNUM=0;
while(!SCOMOK){}
SCOMOK=0;
if(SRX[0]==0){ ENTER();menu();return 0;}
ENTER();
SPRT("THE TYPE IS:");
for(i=0;i<SRXNUM;i++)
{
tempstr[i]=SRX[i];
SPUTCHAR(tempstr[i]);
}
ENTER();
//SPRT("请输入地址和密码参数");ENTER();
//SPRT("例如:071E 1 3");ENTER();
SPRT("For example: 071E 1 3 ");ENTER();
SPRT("071E address of 93Cxx ");ENTER();
SPRT("1st TYPE 0 - 93C46 ");ENTER();
SPRT(" 1 - 93C56/66");ENTER();
SPRT(" 2 - 93C86");ENTER();
SPRT("2nd MODE 0 - BCD/LOW");ENTER();
SPRT(" 1 - BCD/HIGH");ENTER();
SPRT(" 2 - HEX/LOW");ENTER();
SPRT(" 3 - HEX/HIGH");ENTER();
SPRT("Please input address & parement: ");ENTER();
SRXNUM=0;
while(!SCOMOK){}
SCOMOK=0;
if(SRX[0]==0){ ENTER();menu();return 0;}
ENTER();
for(j=0;j<16;j++)
{
if(SRX[0]==HEXTAB[j]){tempstr[13]=(j<<4)+tempstr[13];}
if(SRX[1]==HEXTAB[j]){tempstr[13]=(j&0x0f)+tempstr[13];}
if(SRX[2]==HEXTAB[j]){tempstr[14]=(j<<4)+tempstr[14];}
if(SRX[3]==HEXTAB[j]){tempstr[14]=(j&0x0f)+tempstr[14];}
}
tempstr[15]=(SRX[5]<<4)+(SRX[7]&0x0f);
for(i=0;i<16;i++)
{
WRITEI2C(addoffset+i,tempstr[i]);
}
ENTER();
list(index);
return 1;
}
void list(unsigned int offset)
{
unsigned int i,j;
unsigned char c,s,k,h;
j=offset<<4 ;
i=offset;
SPUTCHAR((i/10)+0x30);SPUTCHAR(((i%10)&0x0f)+0x30);SPRT(" ");
for(i=0;i<13;i++){
c= READI2C(i+j);
if(c){SPUTCHAR(c);}else{SPUTCHAR(0x20);}
}
SPRT(" ");
s=READI2C(13+j);
k=READI2C(14+j);
h=READI2C(15+j);
SPUTCHAR(HEXTAB[(s>>4)&0x0f]); SPUTCHAR(HEXTAB[(s&0x0f)]);
SPUTCHAR(HEXTAB[(k>>4)&0x0f]); SPUTCHAR(HEXTAB[(k&0x0f)]);
SPRT(" ");
switch((h>>4))
{
case 0x00: SPRT("93C46 ");break;
case 0x01: SPRT("93C56(66) ");break;
case 0x02: SPRT("93C86 ");break;
default : SPRT("unknow type ");break;
}
switch((h&0x0f))
{
case 0x00: SPRT("BCD/LOW ");break;
case 0x01: SPRT("BCD/HIGH");break;
case 0x02: SPRT("HEX/LOW ");break;
case 0x03: SPRT("HEX/HIGH");break;
default : SPRT("BCD/LOW ");break;
}
ENTER();
}
void listall()
{
unsigned int i,index;
index=READI2C(0);
ENTER();
//SPRT("现有数据 All data");ENTER();
SPRT("Index Type of the car Address EEPROM MODE BCD-HEX/MSB-LSB"); ENTER();
for(i=1;i<=index;i++){
list(i);
}
SPRT("END of data"); ENTER();
while(!SCOMOK){}
SCOMOK=0;
}
void modidata()
{
unsigned int index;
ENTER();
//SPRT("请输入车型序号");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?