现在的问题是我的8251单独调试时,用中断完全正确,但是当加上了adc0816时,用中断就不行了,采集不到数值,ad[0]仍为原来赋的初值.但是不用中断,把原来中断中的内容写入main()函数中却可以正确采集,为什么?百思不得其解,请大虾们指导!<br />#define _TEST_C_<br />#include "reg52.h"<br />#include "stdlib.h"<br />#include "absacc.h"<br />#include "intrins.h"<br />#include "test.h"<br />#include "math.h"<br />#define uchar unsigned char<br />#define uint unsigned int<br />#define COM8251 XBYTE[0x8701]<br />#define DAT8251 XBYTE[0x8700]<br />#define IN0 XBYTE[0x8000]<br /><br />uchar data data_temp[6]={0x52,0x53,0x54,0x55,0x00,0x58};<br />uchar temp[6]={52,0x53,0x54,0x55,0x00,0x58};<br />uchar k; <br />uchar data a;<br />static uchar idata ad[16]={0x52,0x53,0x54,0x55,0x00,0x58,0x52,0x53,0x54,0x55,0x00,0x58,0x52,0x53,0x54,0x55};<br /><br />void initmcu(void);<br />void wait(uchar p,uchar q);<br />void init8251();<br /><br />void ad0816(uchar idata *x);<br /><br />void Trans8251(void) interrupt 1 using 1<br />{ <br /> TH0 = 0XFF;<br /> TL0 = 0XFF;<br /> <br /> do<br /> { ad0816(ad);//采集信号<br /> DAT8251=ad[0];//得到第0通道的转换值<br /> }while((COM8251&0x01)==0);<br /> <br /> <br /> for(k=0;k<6;k++)<br /> {<br /> while((COM8251&0x02)==0)<br /> {<br /> temp[k]=DAT8251;//串口调试助手不能写成0x54样式,否则收不到 <br /> }<br /> <br /> }<br /> <br />}<br /><br />void main(void) <br />{ <br /> EA = 0;<br /> initmcu();<br /> EA = 1;<br /> init8251();<br />}<br /><br /><br />void init8251()<br />{<br /> //wait(11,82);//8251工作速度慢,每送一个控制字,等待一会儿延时2ms<br /> COM8251 = 0x00;<br /> DAT8251 = 0x00;<br /> DAT8251 = 0x00;<br /> COM8251 = 0x40;//以上为8251复位部分<br /> wait(11,82);<br /> COM8251 = 0x4e;//9600baud,1停止位,无校验,8位数据,X16<br /> wait(11,82);<br /> COM8251 = 0x35; <br /> wait(11,82);<br />}<br /><br /><br />void initmcu(void)<br />{<br /> TMOD = 0x06; //9600波特11.0592MHz,方式2<br /> TL0 = 0XFF; TH0 = 0XFF; <br /> IP = 0x02; ET0 = 1;TR0 = 1;<br />}<br /><br /><br />//adc0816 function...........................................................//<br />void ad0816(uchar idata *x)<br />{<br /> uchar i;<br /> uchar xdata *ad_adr;<br /> ad_adr=&IN0;<br /> for(i=0;i<16;i++)<br /> {<br /> *ad_adr=0; //启动转换从0通道开始<br /> wait(2,28);<br /> <br /> x=*ad_adr;<br /> ad_adr++;<br /> }<br />}<br /><br />void wait(uchar p,uchar q)<br />{<br /> uchar i,j; //(2*j+3)*i+4<br /> for (i=p;i>0;i--)<br /> for (j=q;j>0;j--);<br />} <br /> |
|