做一个ADC。P3.0,P3.1接一个方波。脉宽都在40us以上。我是想让p3.0和p3.1检测到1时,开始AD转换。使用P1.0作为ADC输入。p1.1-1.7接到数码管a b c d e f g。p3.2-p3.5。接到数码管位选。怎么就进不了中断显示呢? #include<reg52.h> #define uchar unsigned char #define uint unsigned int sfr P1M0=0x91; sfr P1M1=0x92; sfr P3M0=0xb1; sfr P3M1=0xb2; sfr P1ASF=0x9d;//P1口复用功能选择。=1为ad输入。=0为普通i/o sfr ADC_CONTR=0xbc; sfr ADC_RES=0xBD; sbit P10=P1^0; sbit P30=P3^0; sbit P31=P3^1; unsigned char a,num,gwei,swei,bwei,qwei,disloop; unsigned int cou,jishu,i; code uchar disTab[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09}; code uchar comTab[]={0xdf,0xef,0xf7,0xfb}; void mdelay(uint mdelay); void dis(); void main() { ADC_CONTR=0xe0;//0xe0=11100000。bit7=1ADC电源,bit6~5=ADC速度最快。bit0~2=000选择p1.0通道 P1ASF=0x01;//设置p1.0为ADC输入 cou=0x00;// jishu=0x00;// P1M0=0x01;// P1M1=0x00;// P3M0=0x83;// P3M1=0x00;// EA=1; //开总中断 ET1=1; //开定时器终端 ET0=0; // TMOD=0x10; //设置定时模式 TH1=(65536-1700)/256; //给初值20M晶振。得定时为1.2ms TL1=(65536-1700)%256; //给初值 TR1=1; //开定时器 while(1) //循环计数 {while((P31==1)&&(P30==1))// 判断Q4和光耦同时为1 P30接光耦。P31接Q4 {ADC_CONTR=ADC_CONTR|0xf0;//开始转换11100000|00001000=11101000 ,bit3=1开始转换。 //_nop_(); #pragma asm nop nop nop nop #pragma ENDasm while(1) { if((ADC_CONTR&0x10)!=0) //判断ADC_FLAG是否为1 { cou=ADC_RES; ADC_CONTR=0xe0;//0xe0=11100000 break; } } } } }
void time1() interrupt 3 using 1 { TR1=0; cou=jishu; TH1=(65536-1700)/256; //给初值 TL1=(65536-1700)%256; TF1=0; jishu=0; dis(); TR1=1; }
void dis() { //for(;disloop>0;disloop--) while(P30==0) { qwei=cou/1000; P1=disTab[qwei]; P3=comTab[0]; mdelay(255); bwei=cou%1000; bwei=bwei/100; P3=comTab[1]; P1=disTab[bwei]; mdelay(255); swei=cou%100; swei=swei/10; P3=comTab[2]; P1=disTab[swei]; mdelay(255); gwei=cou%10; P3=comTab[3]; P1=disTab[gwei]; mdelay(255); } } void mdelay(uint mdelay) { for(; mdelay>0;mdelay {;;} } |