📄 text1
字号:
#include <hn.h>
void main(void)
{
unsigned char i,j,m;//,/*ssb,*/addcode[4][2];
unsigned int xdata zongzhong,zhouzhong[8];//,zongzhong2;
unsigned int xdata maintemp;
unsigned char xdata zhouxing[8];
unsigned int xdata chaoxianlv;
initial();/*51的初始化*/
lcdinit();/*液晶界面的初始化*/
init554();/*554的初始化*/
if(key==0X66)modifyclk();//系统设置
if(key==0xF1)modchedaohao();//系统设置
P10=0;
while(1)
{
dispclk();
if(k_x_jishi==0){ k_x_jishi=5;
ST554A;;;;/*发送到上位机得空闲码*/
ACC=ST05;
while(!ACC5){ST554A;ACC=ST05;}
RBR=0xAA;
}
CS256;
lcddisp(22,90,0XA2,0XA2);
lcddisp(24,90,0XA2,0XA2);
lcddisp(26,90,0XA2,0XA2);
lcddisp(28,90,0XA2,0XA2);
lcddisp(16,0,0XA3,cheshu+0XB0);/*排队车数*/
lcddisp(14,0,0XA3,cheing+0XB0);/*正在处理车的序号*/
gunping();
if(cheing<cheshu)shishi=1;
if(cheing==0)tongbudata();
if(shishi) { zongzhong=0;
i=subcom[cheing][16];
for(j=0;j<i;j++) zongzhong+=subcom[cheing][17+2*j]*2560+subcom[cheing][17+2*j+1]*10;
//////////////////////////////////////////////////////////////////////////////
for(i=0;i<8;i++) zhouzhong[i]=0;
i=subcom[cheing][16];
for(j=0;j<i;j++) zhouzhong[j]=subcom[cheing][17+2*j]*2560+subcom[cheing][17+2*j+1]*10;
for(j=0;j<i;j++) zhouxing[j]=subcom[cheing][17+2*i+j];
ch_x_l_m=0;
for(i=0;i<subcom[cheing][16];i++){
switch(zhouxing[i])
{ case 0: chaoxianlv=0;break;
case 1: chaoxianlv=(zhouzhong[i]/ezai1); break;
case 2: chaoxianlv=(zhouzhong[i]/ezai2);break;
case 3: chaoxianlv=(zhouzhong[i]/ezai3);break;
case 4: chaoxianlv=(zhouzhong[i]/ezai4);break;
case 5: chaoxianlv=(zhouzhong[i]/ezai5);break;
case 6: chaoxianlv=(zhouzhong[i]/ezai6);break;
case 7: chaoxianlv=(zhouzhong[i]/ezai7);break;
case 8: chaoxianlv=(zhouzhong[i]/ezai8);break;
}
if(zhouxing[i]>8)chaoxianlv=0;
if(chaoxianlv>ch_x_l_m)ch_x_l_m=chaoxianlv;
}
if(ch_x_l_m>100)ch_x_l_m=ch_x_l_m-100;
else ch_x_l_m=0;
/********************清除显示费额***************/
lcddisp(10,90,0XA2,0XA2);
lcddisp(12,90,0XA2,0XA2);
lcddisp(14,90,0XA2,0XA2);
/********************end of清除 显示飞蛾***************/
lcddisp(10,112,0XA2,0XA2);
/***********************end of 清除下半部屏幕************************************/
todaping[2]=(((ch_x_l_m%100)/10)<<4)+(ch_x_l_m%10);
todaping[3]=(ch_x_l_m%1000)/100;
for(i=0;i<8;i++){ST554C;;;;/*发送到室外大屏*/
ACC=ST05;
while(!ACC5){ST554C;ACC=ST05;}
RBR=todaping[i];
}
CS256;
/***********************把数据发送到上位机*************/
shishi=0;
tempa=0xff; //发送完成
m=5;//发送次数
while((tempa!=0xf0)&(m>0)){
m--;
toupcom[0]=0xF0;/*起始标志*/
i=xuhao/10;
j=xuhao%10;
toupcom[1]=(i<<4)+j;/*车辆通过的序号*/
toupcom[2]=chedaoh;/*车道号*/
toupcom[3]=0;/*超载标志*/
if(ch_x_l_m>50) toupcom[3]=1;
toupcom[4]=(subcom[cheing][16]<<4)+1;/*车型*/
toupcom[5]=((zongzhong%100)/10)*16+(zongzhong%10); /*总重*/
toupcom[6]=((zongzhong%10000)/1000)*16+(zongzhong%1000)/100;/*总重*/
toupcom[7]=zongzhong/10000; /*总重*/
toupcom[8]=(((ch_x_l_m%100)/10)<<4)+(ch_x_l_m%10);/*超载率*/
toupcom[9]=((ch_x_l_m/1000)<<4)+((ch_x_l_m%1000)/100);/*超载率*/
maintemp=subcom[cheing][12]*256+subcom[cheing][13];
toupcom[10]=(((maintemp%1000)/100)<<4)+(maintemp%100)/10;/*车速*/
toupcom[11]=((maintemp/10000)<<4)+((maintemp%10000)/1000);/*车速*/
j=subcom[cheing][16];
for(i=0;i<j-1;i++)maintemp=subcom[cheing][17+j*3+i]*256+subcom[cheing][17+j*3+i+1];
toupcom[12]=((maintemp%100)/10<<4)+(maintemp%10);/*总轴距*/;
toupcom[13]=(((maintemp%10000)/1000)<<4)+(maintemp%1000)/100;/*总轴距*/;
toupcom[14]=((maintemp/100000)<<4)+(maintemp%100000)/10000;/*总轴距*/;
toupcom[15]=subcom[cheing][16];/*轴数*/
j=2*subcom[cheing][16];
for(i=0;i<subcom[cheing][16];i++)toupcom[16+i*4]=subcom[cheing][17+(2*(subcom[cheing][16]))+i];/*轴型1*/
for(i=0;i<subcom[cheing][16];i++){
toupcom[17+i*4]=((((subcom[cheing][17+2*i]*2560+subcom[cheing][17+2*i+1]*10)%100)/10)<<4)+(subcom[cheing][17+2*i]*2560+subcom[cheing][17+2*i+1]*10)%10;/*轴重1*/
toupcom[17+i*4+1]=((((subcom[cheing][17+2*i]*2560+subcom[cheing][17+2*i+1]*10)%10000)/1000)<<4)+((subcom[cheing][17+2*i]*2560+subcom[cheing][17+2*i+1]*10)%1000)/100;/*轴重1*/
toupcom[17+i*4+2]=(((subcom[cheing][17+2*i]*2560+subcom[cheing][17+2*i+1]*10)/100000)<<4)+((subcom[cheing][17+2*i]*2560+subcom[cheing][17+2*i+1]*10)%100000)/10000;/*轴重1*/
}/*end of 计算轴重*/
for(i=0;i<(16+subcom[cheing][16]*4);i++) toupcom[16+subcom[cheing][16]*4]+=subcom[cheing][i];/*校验和*/
toupcom[17+subcom[cheing][16]*4]=0xE0;/*结束标志*/
for(i=0;i<(18+subcom[cheing][16]*4);i++)
{
j=toupcom[i];
ST554A;;;;/*发送到上位机*/
ACC=ST05;
while(!ACC5){ST554A;ACC=ST05;}
RBR=j;
// F29040write(i+0xff,j);
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CS256;
}
/***********************end of 把数据发送到上位机*************/
delay_time(500);
}// end of while((shishi==0)&(m>0))发送五次
if(m==0)bendichuli();//指m==0时为通讯中断
xuhao++;
if(xuhao>99)xuhao=0;
cheing++;
if(cheing==cheshu){cheing=0;cheshu=0;}
}//end of if(shishi)
if(key==0xF2){ key=0xFF; lcddisp(0,0,0Xfd,0Xff);}//背光切换
}//end while(1)
}
/////////////////////////////end of main////////////////////////////////////////////////
void ct0() interrupt 1 using 0 /*每1ms采集一次传感器数据*/
{
TH0=0x00;
TL0=0x01;
time++;if(time>10){count=0;time=0;
P14=~P14;
if(k_x_jishi)k_x_jishi--;
}
void int0() interrupt 0 using 1 /*外部中断0 用来接受键盘发来的数据*/
{
time=0;
dat>>=1; /*接受数据 低->高*/
if(sda) dat|=0x80;
count++;
if(count==9 ) dat2=dat;
if(count>35){count=0;
switch(dat2)
{
case 0x45: key0=key;key=0;keyfinish=1;break;//0
case 0x16: key0=key;key=1;keyfinish=1;break;//1
case 0x1E: key0=key;key=2;keyfinish=1;break;//2
case 0x26: key0=key;key=3;keyfinish=1;break;//3
case 0x25: key0=key;key=4;keyfinish=1;break;//4
case 0x2E: key0=key;key=5;keyfinish=1;break;//5
case 0x36: key0=key;key=6;keyfinish=1;break;//6
case 0x3D: key0=key;key=7;keyfinish=1;break;//7
case 0x3E: key0=key;key=8;keyfinish=1;break;//8
case 0x46: key0=key;key=9;keyfinish=1;break;//9
case 0x49: key0=key;key=0xa;keyfinish=1;break; //.
case 0x5a: key0=0;key=0;feefinish=1;break; //enter
case 0x04: key=0XF3;break;/*校验用*/
case 0x06: key=0XF2;break;/*开关背光*/
case 0x66: key=0X66;break;/*更改时间*/
case 0x05: key=0xF1;break;/*更改车道号*/
}
}
}//end of void int0() interrupt 0 using 1
void interrupt1() interrupt 2 using 3
{
ST554A;
ACC=ST05;
if(ACC0){tempa=RBR;if(tempa==0xf0){P10=~P10;}}
ST554D;
ACC=ST05;
if(ACC0){tempd=RBR; modifytime();} /*以后接收传来的时钟修正信息信息*/
ST554C;
ACC=ST05;
if(ACC0)tempc=RBR;
ST554B;
ACC=ST05;
if(ACC0){tempb=RBR;jieshou();}
CS256;
}// end of void interrupt1() interrupt 2 using 3
void serial() interrupt 4 using 2 /* 串行口接收中断服务子程序 */
{
if(TI)TI=0;
if(txtolcd&(txtolcdnum<5)){SBUF=tolcd[txtolcdnum];txtolcdnum++;}
else {txtolcdnum=0; txtolcd=0;}
if(RI){RI=0;if(SBUF==0x66)lcdok=1;}
}//end of void serial() interrupt 4 using 2
void init554(void)
{
delay_time(500);
ST554D;
ST03=0X83; RBR=0x30; ST01=0; /*得到2400的波特率*/
ST03=0x03; ST01=0X01;ST04=0X08;
ST554C;
ST03=0X83; RBR=0x30; ST01=0; /*得到2400的波特率*/
ST03=0x03; ST01=0X0;ST04=0X08;
ST554B;
ST03=0X83; RBR=0X0C; ST01=0;
ST03=0x03; ST01=0X01;ST04=0X08;
ST554A;
ST03=0X83; RBR=0x0c; ST01=0;
ST03=0x03; ST01=0X01;ST04=0X08;
EX1=1;/*打开来自554的中断*/
}//end of void init554(void)
void initial(void) /* 初始化子程序 */
{
RCAP2L=0xDC; /*0MHz 计数初值F7dd可得到300的波特率*/
RCAP2H=0xFF;
TL2=0xDC;
TH2=0xFF;
T2CON=52;
SCON=0x50;
REN=1;
ES=1;
TH0=0x00;
TL0=0x01;
TR0=1;
TMOD=0X01;
ET0=1;
IT0=1;
EX0=1;
IP=0X0;
IT1=1; /*不使用*/
EX1=0; /*554初始化之前关掉来自554的中断*/
EA=1;
}
void delay_time(unsigned int delay) /* 延时子程序,基本延时单元为1ms */
{ /* 该程序段能完成延时delay个ms */
unsigned int j;
unsigned char i;
for (j=0;j<delay;j++)
for (i=0;i<125;i++); /* 一个基本延时单元 */
}
void jieshou(void)
{
unsigned int crc=0;
unsigned char i;
CS256;
if(subnum==0){if(tempb==0xff){subcom[cheshu][0]=tempb;subnum=subnum+1;}}
else
{ subcom[cheshu][subnum]=tempb;/*如果接收缓存不空,写入缓存*/
subnum=subnum+1;
if(subnum==subcom[cheshu][03])/*缓存字节=5*/
{ /*crc校验*/
for( i=0; i<subcom[cheshu][03]-2;i++) crc = xcrc(crc,subcom[cheshu][i]);
if(crc==(subcom[cheshu][subcom[cheshu][03]-2]<<8)+subcom[cheshu][subcom[cheshu][03]-1]) {subrecok=1; cheshu++;}/*校验成功*/
else subrecok=0;
if(subrecok){receipt[0]=0xff;receipt[1]=0x00;receipt[2]=0x00;receipt[03]=0X00;receipt[04]=0x4B;receipt[05]=0xA3;}
else {receipt[0]=0xff;receipt[1]=0x00;receipt[2]=0x00;receipt[03]=0X01;receipt[04]=0x5B;receipt[05]=0x82;}
ST554B;
delay_time(5);
for(i=0;i<6;i++){ACC=ST05;
while(!ACC5)ACC=ST05;
RBR=receipt[i];
}
subnum=0;
}//end of if(subnum==subcom[cheshu][03])
}///end of else
CS256;
}
void lcdinit(void)
{unsigned char i;
delay_time(800);
lcddisp(0xff,0xff,0xff,0xff);//cls
lcddisp(0x0,0x0,0xd7,0xdc);//总
lcddisp(10,0,0xd6,0xd8);/*重*/
lcddisp(22,0x0,0xb3,0xac);/*超*/
lcddisp(24,0x0,0xcf,0xde);/*限*/
lcddisp(26,0x0,0xc2,0xca);/*率*/
lcddisp(0,90,0xd3,0xA6);/*应*/
lcddisp(2,90,0xBd,0xc9);/*缴*/
lcddisp(4,90,0xB7,0xd1);/*费*/
lcddisp(6,90,0xB6,0xEE);/*额*/
lcddisp(0,112,0xB3,0xB5);/*车*/
lcddisp(6,112,0xD0,0xCd);/*型*/
lcddisp(8,112,0xA3,0xBA);/*:*/
lcddisp(12,112,0xD0,0xCd);/*型*/
lcddisp(17,112,0xCA,0xB1);/*时*/
lcddisp(19,112,0xBC,0xE4);/*间*/
lcddisp(21,112,0xA3,0xBA);/*:*/
lcddisp(8,90,0xA3,0xBA);/*:*/
lcddisp(17,90,0xD4,0xAA);/*:*/
for(i=0x1E;i>0;i--)/*-----------*///
{
while(!lcdok); lcdok=0;
while(txtolcd);
tolcd[1]=i-1;//
tolcd[2]=2;
tolcd[3]=0xFF;
tolcd[4]=0x0D;
txtolcd=1;
TI=1;
// while(!lcdok); lcdok=0;
// while(txtolcd);
// tolcd[1]=i-1;
// tolcd[2]=11;
// tolcd[3]=0xFF;
// tolcd[4]=0x0D;
// txtolcd=1;
// TI=1;
}
}
/********************************************
内部函数,延时1uS
********************************************/
void In1uSDelay()
{
_nop_();
}
/********************************************
内部函数,I2C开始
********************************************/
void InI2C_Start()
{
I2C_SDA=1;
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SDA=0;
In1uSDelay();
I2C_SCK=0;
}
/********************************************
内部函数,I2C结束
********************************************/
void InI2C_Stop()
{
I2C_SCK=1;
In1uSDelay();
In1uSDelay();
In1uSDelay();
In1uSDelay();
I2C_SDA=0;
In1uSDelay();
I2C_SDA=1;
In1uSDelay();
}
/********************************************
内部函数,输入ACK
********************************************/
void InI2C_ReadACK()
{
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SCK=0;
In1uSDelay();
}
/********************************************
内部函数,输出ACK=1
********************************************/
void InI2C_WriteACK()
{
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SDA=1;
In1uSDelay();
I2C_SCK=0;
In1uSDelay();
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void InI2C_Write()
{
unsigned char i=8;
do{
ACC=B;
I2C_SDA=ACC7;
ACC+=ACC;
B=ACC;
_nop_();
_nop_();
I2C_SCK=1;
In1uSDelay();
I2C_SCK=0;
}while(--i);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -