哪位大虾帮指导一下其中原因,8251与adc0816的混合问题!

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

前后台程序,为什么没有一个while(1)或for(;;)

void&nbsp;main(void)&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EA&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;initmcu();<br />&nbsp;&nbsp;&nbsp;&nbsp;EA&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;init8251();<br />}
zgl7903 发表于 2007-4-20 21:19 | 显示全部楼层

中断里最不推荐使用while(……),

最好调整下结构,在中断里建立标志,在主程序循环粒操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部