|
仿真圖
GMIN stepping at time=0.251152錯(cuò)誤提示:
上位機(jī)程序
#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}; //顯示緩存區(qū)
unsigned char adc=0; //存放接收的數(shù)據(jù)
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() //計(jì)算延遲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; //開(kāi)啟串行口中斷
TR1=1;
IP=0x10; //設(shè)置串行口通斷為高優(yōu)先級(jí)
SCON=0x50; //設(shè)串口為方式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; //數(shù)碼管顯示轉(zhuǎn)換結(jié)果
LED1=0;
P1=tab[dat[3]]+0x80; //最高位加小數(shù)點(diǎn)
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;
}
}
下位機(jī)程序
#include<AT89X52.h>
#define DAC0832 P0
#define uint unsigned int
#define uchar unsigned char
//*********定義變量區(qū)*******************
sbit EOC=P2^5; //定義ADC0808/0809轉(zhuǎn)換結(jié)束信號(hào)
sbit START=P2^6; //定義ADC0808/0809啟動(dòng)轉(zhuǎn)換命令
sbit CLOCK=P3^7; //定義ADC0808/0809時(shí)鐘脈沖輸入位
sbit OE=P3^2; //定義ADC0808/0809數(shù)據(jù)輸出允許位
sbit RL1=P2^0;
sbit RL2=P2^1;
sbit cs=P2^7;
sbit wr=P3^6;
sbit SW=P2^3; //開(kāi)關(guān)量接入口
sbit zhongduan=P2^4; //外部中斷請(qǐng)求位
code uchar sintab[]={0x7f,0x89,0x94,0x9f,0xaa,0xb4,0xbe,0xc8,0xd1,0xd9,0xe0,0xe7,0xed,0xf2,0xf7,0xfa,0xfc,0xfe,0xff}; //正弦信號(hào)數(shù)組
uchar pt; //存放接收數(shù)據(jù)
uchar adc; //存放轉(zhuǎn)換后的數(shù)據(jù)
uchar data i=0,k;
uchar a=0;
void delay()
{
uchar j;
for(j=0;j<250;j++);//延時(shí)函數(shù)
}
void sbu(uchar S){
START=0;
START=1; //是否轉(zhuǎn)換
START=0;
while(EOC==0); //等待轉(zhuǎn)換結(jié)束
OE=1; //允許輸出
adc=P1; //取轉(zhuǎn)換結(jié)果
if(S==1) //開(kāi)關(guān)量未接入
{SBUF=adc;
} //發(fā)送采集的數(shù)據(jù)
else //開(kāi)關(guān)量接入
{SBUF=0;
}
while(!TI); //等待發(fā)送數(shù)據(jù)結(jié)束(數(shù)據(jù)發(fā)送完,T1由硬件置位)
TI=0; //T1復(fù)位
}
void main(void)
{
EA=0;
TMOD=0x22; //T0、T1工作方式2
TH0=0x14;
TL0=0x14;
TH1=0xE7; //波特率為625bps
TL1=0xE7;
IE=0x92; //開(kāi)放串行口,T0中斷
IP=0x10; //設(shè)置T0中斷方式為高優(yōu)先級(jí)
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;
}
}
/*定時(shí)計(jì)數(shù)T0的中斷服務(wù)子程序*/
void timer0(void) interrupt 1 using 1
{
CLOCK=~CLOCK; //產(chǎn)生ADC0808/0809時(shí)鐘脈沖信號(hào)
}
void serial(void) interrupt 4 using 0
{if(RI==1)
{ RI=0;
pt=SBUF;
a=pt;
}
}
|
|