GMIN stepping at time=0.251152错误提示:
上位机程序
#include<AT89X52.h>
#define uint unsigned int
#define uchar unsigned char
sbit GREEN=P0^0;
sbit YELLOW=P0^1;
sbit RED=P0^2;
sbit SPK=P0^3;
sbit LED1=P0^4;
sbit LED2=P0^5;
sbit LED3=P0^6;
sbit LED4=P0^7;
unsigned char code
tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char dat[]={0,0,0,0}; //显示缓存区
unsigned char adc=0; //存放接收的数据
unsigned char count;
unsigned int tmp;
unsigned char ssw;
unsigned char ad;
void delay10ms(void)
{
uchar i;
for(i=0;i<250;i++);
}
void delay() //计算延迟1ms
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++) ;
}
void main(void)
{
TMOD=0x20; //T1为方式2
TH1=0xE7; //波特率为625bps
TL1=0xE7;
PCON=0; //电源控制寄存器
IE=0x90; //开启串行口中断
TR1=1;
IP=0x10; //设置串行口通断为高优先级
SCON=0x50; //设串口为方式1、允许串行口接收
while(1)
{
tmp=adc*196; //乘以19.6mv
dat[3]=tmp/10000;
dat[2]=tmp/1000%10;
dat[1]=tmp/100%10;
dat[0]=tmp/10%10; //数码管显示转换结果
LED1=0;
P1=tab[dat[3]]+0x80; //最高位加小数点
delay();
LED1=1;
LED2=0;
P1=tab[dat[2]];
delay();
LED2=1;
LED3=0;
P1=tab[dat[1]];
delay();
LED3=1;
LED4=0;
P1=tab[dat[0]];
delay();
LED4=1;
if(ssw>45)
{
RED=0;
GREEN=1;
YELLOW=1;
SPK=~SPK;
SBUF=0xff;
}
else if(ssw<5)
{
YELLOW=0;
GREEN=1;
RED=1;
SPK=~SPK;
SBUF=0x00;
}
else
{
GREEN=0;
RED=1;
YELLOW=1;
SBUF=0x01;
}
while(!TI);
TI=0;
}
}
void serial(void) interrupt 4 using 1
{
if(RI==1)
{
RI=0;
ad=SBUF;
if(ad!=0)
{ adc=ad;}
else
{adc=adc; }
ssw=adc/5;
}
}
下位机程序
#include<AT89X52.h>
#define DAC0832 P0
#define uint unsigned int
#define uchar unsigned char
//*********定义变量区*******************
sbit EOC=P2^5; //定义ADC0808/0809转换结束信号
sbit START=P2^6; //定义ADC0808/0809启动转换命令
sbit CLOCK=P3^7; //定义ADC0808/0809时钟脉冲输入位
sbit OE=P3^2; //定义ADC0808/0809数据输出允许位
sbit RL1=P2^0;
sbit RL2=P2^1;
sbit cs=P2^7;
sbit wr=P3^6;
sbit SW=P2^3; //开关量接入口
sbit zhongduan=P2^4; //外部中断请求位
code uchar sintab[]={0x7f,0x89,0x94,0x9f,0xaa,0xb4,0xbe,0xc8,0xd1,0xd9,0xe0,0xe7,0xed,0xf2,0xf7,0xfa,0xfc,0xfe,0xff}; //正弦信号数组
uchar pt; //存放接收数据
uchar adc; //存放转换后的数据
uchar data i=0,k;
uchar a=0;
void delay()
{
uchar j;
for(j=0;j<250;j++);//延时函数
}
void sbu(uchar S){
START=0;
START=1; //是否转换
START=0;
while(EOC==0); //等待转换结束
OE=1; //允许输出
adc=P1; //取转换结果
if(S==1) //开关量未接入
{SBUF=adc;
} //发送采集的数据
else //开关量接入
{SBUF=0;
}
while(!TI); //等待发送数据结束(数据发送完,T1由硬件置位)
TI=0; //T1复位
}
void main(void)
{
EA=0;
TMOD=0x22; //T0、T1工作方式2
TH0=0x14;
TL0=0x14;
TH1=0xE7; //波特率为625bps
TL1=0xE7;
IE=0x92; //开放串行口,T0中断
IP=0x10; //设置T0中断方式为高优先级
SCON=0x50; //双工通信,串行口方式1
TR0=1;
TR1=1;
while(1)
{
kkk: sbu(SW);
wr=1;
if(a==0xff){RL1=1;RL2=1;goto k1;}
else{goto kkk;}
k1: while(1){
wr=0;
DAC0832=0xff;
delay();
DAC0832=0;
delay();
delay();
goto kkk;
}
DAC0832=0;
}
}
/*定时计数T0的中断服务子程序*/
void timer0(void) interrupt 1 using 1
{
CLOCK=~CLOCK; //产生ADC0808/0809时钟脉冲信号
}
void serial(void) interrupt 4 using 0
{if(RI==1)
{ RI=0;
pt=SBUF;
a=pt;
}
}
|