📄 0zhu0011.c
字号:
#include<AT89X51.H>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define BN 16
uchar code table1[16]=
{0x4b,0x58,0x2d,0x37,0x35,0x30,0x32,0x4a,0x20,0x4d,0x6f,0x64,0x75,0x20,0x20,0x20};
uchar code table[4][16]={
{0x20,0x48,0x65,0x61,0x74,0x69,0x6e,0x67,0x20,0x20,0x20,0x20,0x20,0x41,0x20,0x20},
{0x20,0x20,0x42,0x69,0x61,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x41,0x20},
{0x20,0x20,0x54,0x65,0x6d,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xdf,0x43,0x20},
{0x20,0x20,0x50,0x6f,0x77,0x65,0x72,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x57,0x20}};
uchar code table2[16]=
{0x20,0x20,0x20,0x4e,0x4f,0x20,0x20,0x4d,0x6f,0x64,0x75,0x6c,0x65,0x20,0x20,0x20};
uchar code table3[16]=
{0x20,0x20,0x20,0x4f,0x76,0x65,0x72,0x20,0x20,0x54,0x69,0x6d,0x65,0x20,0x20,0x20};
uchar code table4[16]=
{0x20,0x20,0x50,0x72,0x65,0x73,0x73,0x20,0x4b,0x65,0x79,0x2e,0x2e,0x2e,0x20,0x20};
sbit ACC_0 = 0xE0;
sbit ACC_1 = 0xE1;
sbit ACC_2 = 0xE2;
sbit ACC_3 = 0xE3;
sbit ACC_4 = 0xE4;
sbit ACC_5 = 0xE5;
sbit ACC_6 = 0xE6;
sbit ACC_7 = 0xE7;
uchar (*pb)[16]=table;
uchar idata rbuf[16];
uchar data count=0,cancel_tag=0 ;
uchar bdata a=0x01;
uchar data b=1;
uchar data c=0;
uchar data y=0;
uchar data addr0;
sbit bflag=ACC^7;
//延时10ms子函数
void delay(void){
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++)
;
}
//出错处理子函数
void err(void){
P3_7=1; SBUF=0xff;
while(!TI);TI=0;
}
//超时控制中断服务子函数
void timer0_int() interrupt 1 using 1
{ count++;
if(count<60)
{TH0=0x4C;
TL0=0x1A;
return;
}
cancel_tag=1;
}
//485数据通信子函数
void master(uchar addr,uchar comand) {
uchar aa,i;
char p;
P3_7=1; TB8=1;
SBUF=addr; //发从机地址(1)
while(!TI);TI=0;
P3_7=0;TR0=1;
while(!RI) {
if(cancel_tag==1)
{
TR0=0;
count=0;
TH0=0x4C;
TL0=0x1A;
cancel_tag=0;
c=1;
return;
}
}
RI=0;
TR0=0;
count=0;
TH0=0x4C;
TL0=0x1A;
if(SBUF!=addr) err(); //接收比较地址(2)
else{ TB8=0;
P3_7=1;
SBUF=comand; //发送命令0x02 (3)
while(TI!=1);TI=0;
P3_7=0;
while(RI!=1);RI=0;
aa=SBUF;
if((aa&0x80)==0x80){TB8=1;err();} //如果命令未被接收发送复位信号(fu)
else{ if((aa&0x01)==0x01) { // 接收0x01 (5)
while(1) {SM2=0;p=0;
P3_7=0;
for(i=0;i<BN;i++) //接收数据及校验和(6)
{ while(RI!=1);RI=0;
rbuf[i]=SBUF;
p+=rbuf[i];
}
while(RI==0);RI=0;
if(SBUF==p){
P3_7=1;SBUF=0x00; //接收正确发送0x00 (7)
while(TI==0);TI=0;
break; }
else{P3_7=1;SBUF=0xff;
while(TI==0);TI=0;
}
}
TB8=1; return; }
}
}
}
//某一模块显示子函数(1~8)
void lcd3(void){
P1=0x8e;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=b+0x30;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
//显示器第二行固定部分和数据部分的显示"No Module"
void lcd4(void){
uint i;
uchar code *p=table2;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=0;i<16;i++){
P1=*p;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
p++;}
}
//第二行显示“Press Key ...”
void lcd6(void){
uchar k;
uchar code *p=table4;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(k=0;k<16;k++){
P1=*p;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
p++;}
}
//通讯函数
void toxin (void) {
P3_3=1;
if(P3_3==0) delay();
if(P3_3==0) {
delay();
delay();
P3_3=1;
while(P3_3==0);
lcd3(); //某一模块显示(1~8)
P0=0xff;
addr0=P0;
if((a&addr0)!=0)
{master(a,0x02);lcd6();} //通讯和显示二行“Press Key ...”
else lcd4(); //显示器第二行显示"No Module"
if(a==0x80) {a=0x01;b=1;}
else {a=a<<1;b++;}
}
P2_0=1;
if(P2_0==0) delay();
if(P2_0==0) {
delay();
delay();
P2_0=1;
while(P2_0==0);
lcd3(); //某一模块显示(1~8)
P0=0xff;
addr0=P0;
if((a&addr0)!=0)
{master(a,0x02); lcd6();} //通讯和显示二行“Press Key ...”
else lcd4(); //显示器第二行显示"No Module"
if(a==0x01) {a=0x80;b=8;}
else {a=a>>1;b--;}
}
}
//VFD模块初始化子函数
void lcd1(void){
P1=0x3b;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x06;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x0c;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x01;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
//显示器第一行显示”KX-7502J Modu " 子函数
void lcd2(void){
uchar i;
uchar code *p=table1;
P1=0x80;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=0;i<16;i++){
P1=*p;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
p++;}
}
//显示器第二行显示数据
void xianshi(uchar s){
uchar i,j;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(j=0;j<16;j++){
P1=*(*(pb+s)+j);
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
P1=0xc9;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=s*4;i<s*4+4;i++){
P1=*(rbuf+i);
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
}
//超时显示“Over Time"子函数
void lcd5(void){
uchar i;
uchar code *am=table3;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=0;i<16;i++){
P1=*am;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
am++;}
}
//显示器显示函数
void xis() {
P3_2=1;
if(P3_2==0) delay();
if(P3_2==0){
delay();
delay();
P3_2=1;
while(P3_2==0);
if(c==1){lcd5();c=0;}
else xianshi(y);
if(y==3) y=0;
else y++;
}
P2_1=1;
if(P2_1==0) delay();
if(P2_1==0){
delay();
delay();
P2_1=1;
while(P2_1==0);
if(c==1){lcd5();c=0;}
else xianshi(y);
if(y==0) y=3;
else y--; }
}
void main()
{
TMOD=0x21; /*定时器T1和T0初始化:T1定时工作方式2,T0定时工作方式1 */
TL1=0xfd;TH1=0xfd; /*设定T1的初值*/
TR1=1; /*启动T1定时*/
PCON=0x00; /*确定串口的波特率:SMOD=0*/
SCON=0xf0; /*串口工作在方式3,SM2=1,REN=1允许接收*/
TH0=0x4C; /*设定T0的初值*/
TL0=0x1A;
TR0=0; /*关闭定时器T0*/
ET0=1; /*允许T0溢出中断*/
ES=0; /*关串口中断*/
EA=1; /*开放CPU总中断*/
lcd1();
lcd2();
while(1){
toxin();
xis();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -