程序问题,中断触发不了,ad转换一运行便卡主了,求大神解答

2019-07-15 09:03发布

这个程序是单片机控制晶闸管整流,采集负载电流,同步信号,并显示相控角和负载电流。P1口控制字形,P2口控制字位,P0与P3连接ADC0809,剩下的端口发出脉冲信号。程序运行之后,只有0809运行,显示程序和中断都不工作。不知道哪里要改,求大神解答。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
code uchar code seg7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar  wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uint  q,w,e;
sbit si1=P3^4;
sbit si2=P3^6;
sbit eoc=P3^5;
sbit oe=P3^1;
sbit st=P3^0;
sbit clk=P3^3;
uint getdata=0;
#define _3ms_ 1866
        延时程序
void delay(int t)
{
        uchar i,j;
        for(i=0;i<t;i++)
         {
                 for(j=13;j>0;j--);
                 {
                 }
         }
}
显示程序

void display(uchar d)
{
         uint x,c,v;
         x=d/100;
         c=d%100/10;
         v=d%10;
         P2=0xff;
         P1=seg7[x];
         P2=wei[0];
         delay(200);
         P2=0xff;
         P1=seg7[c];
         P2=wei[1];
         delay(200);
         P2=0xff;
         P1=seg7[v];
         P2=wei[2];
         delay(200);
         P2=0xff;
         P1=0xc0;
         P2=wei[3];
         delay(200);
         P2=0xff;
         P1=0x92;
         P2=wei[4];
         delay(200);
         P2=0xff;
         P1=0xff;
         P2=wei[5];
         delay(200);
}
ADC0809转换

void adc0809()
{
         float temp=0.0;
         st=0;
         st=1;
         st=0;
         while(eoc==0)
         {
                 oe=1;
                 getdata=P0;
                 oe=0;
         }
}
定时器0给0809时钟

void timer0() interrupt 1
{
    TH0=(65536-2)/256;
          TL0=(65536-2)%256;
         clk=!clk;
}
定时器1控制相控角
void timer1() interrupt 3
{
         q=0;
         w=5;
         e=0xff;
         TR1=0;
         TL1=(65536-_3ms_)/256;
   TH1=(65536-_3ms_)%256;
         TR1=1;
}
外部中断0接受同步信号,并发出触发脉冲

void mac() interrupt 0
{
         uint i=0,j=0;
         si1=1;
         for(i=0;i<100;i++)
         {_nop_();
         _nop_();
         _nop_();}
         si1=0;
         j++;
         if(j>=4)
         {
                 si2=1;
                 for(i=0;i<100;i++)
         {_nop_();
         _nop_();
         _nop_();}
         si2=0;
         j=0;
   }
}

void main()
{
         clk=0;
         st=1;
         TMOD|=0x01;
         IT0=1;
         EX0=1;
         ET0=1;
         TH0=(65536-2)/256;
         TL0=(65536-2)%256;
         TMOD&=0xf0;
         TL1=(65536-_3ms_)/256;
   TH1=(65536-_3ms_)%256;
         IT1=1;
         EX1=1;
         ET1=1;
         EA=1;
         si1=1;
         si2=1;
         while(1)
         {
                 adc0809();
                 display(getdata);
         }         
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
langzitianya
1楼-- · 2019-07-15 17:54
楼上正解,建议显示程序改为定时器定时显示,不然很容卡死,特别遇到等待语句,卡死了。
houjue
2楼-- · 2019-07-15 21:58
 精彩回答 2  元偷偷看……
stm9527
3楼-- · 2019-07-15 22:37
人中狼 发表于 2018-1-8 11:05
while(eoc==0)这里查查eoc的状态吧,如果eoc不为高电平,那就退不出来了

谢谢,0809已解决
stm9527
4楼-- · 2019-07-16 00:00
wulinwl 发表于 2018-1-8 14:23
除了楼上指出的问题外,你的定时器初始化也有问题,TL1=(65536-_3ms_)/256;TH1=(65536-_3ms_)%256;高低位设置颠倒。特别是T1,你把TR1=1;放在定时器1中断里,不可能有此中断产生。sbit eoc=P3^5;也有疑问,P3.5是T1计数器外部输入端。

谢谢指出,其他都改过来了,但是我把TR=1发在main函数里后,定时器1中断还是触发不了,这可能是什么原因?
wulinwl
5楼-- · 2019-07-16 05:50
stm9527 发表于 2018-1-8 22:30
谢谢指出,其他都改过来了,但是我把TR=1发在main函数里后,定时器1中断还是触发不了,这可能是什么原因?

你原来的定时器初始化设置本身就是错的,如果没有处理好,只改TR=1的位置有什么用?

一周热门 更多>