51チップマシンにおけるデコーダおよびラッチの組み合わせ使用(問題あり、解決すべき)

9347 ワード

1つのプロジェクトでは、デコーダとラッチを組み合わせてGPIOポートP 0の多重化を実現します.
次のような問題が発生しました.
P 0ポートは4回多重化され、1回目はデジタルチューブの表示制御、2回目はデジタルチューブのビット選択制御、3回目は8個のLEDランプ、4回目は他のデバイス(ブザー)である.
デジタルチューブにタイマーを表示しながら、LEDに流水灯を作ってほしいです.
51チップマシンのタイマー0と1割り込みで実現しました.問題は、プログラムRUNの場合、while(1)に入ると、デジタルチューブと流水ランプが動作し始めるが、中断中に役に立たないブザーも鳴り始めることである.
デバッグ後、流水ランプが途切れている場合、LEDランプをオンにした後、デコーダを000状態にするとブザーは鳴らないが、デジタルチューブ表示69付近ではまた鳴ることが分かった.
デコーダの復号プロセスが段階的に影響することを初歩的に考慮したが,具体的にはまだ理解されていない.
最近の変更:16.2.1:デコーダの復号プロセスをビット操作で一歩実行に変更し、確かに異常を解消したが、そのメカニズムはまだ理解されていない.
  1 #include<reg52.h>
  2 #include<math.h>
  3 #define ROL(led) ((led)<<1|(led)>>7)//    1
  4 typedef unsigned char uchar;
  5 uchar code table[]={0xc0,0xf9,0xa4,0xb0,//0~3
  6 0x99,0x92,0x82,0xf8,//4~7
  7 0x80,0x90,0x88,0x83,//8~b
  8 0xc6,0xa1,0x86,0x8e //c~f
  9 };
 10 sbit A0 = P2^5;
 11 sbit A1 = P2^6;
 12 sbit A2 = P2^7;
 13 sbit NOISE = P0^6;
 14 int time;
 15 void decoder(char num);
 16 void delay(int num);
 17 void display(int num);
 18 void timer_initial();
 19 //===================================================
 20 int main()
 21 {
 22     unsigned char led = 0x01;
 23     char cnt,site;
 24     site = 0x01;
 25     decoder(5);
 26     WR = 0;
 27     NOISE = 0;//     
 28     decoder(4);
 29     WR = 0;
 30     for(cnt = 0;cnt < 7;cnt++)//    
 31     {
 32         P0 = ~led;
 33         led = ROL(led);
 34         delay(100);
 35     }
 36     EA = 1;
 37     timer_initial();
 38     while(1)
 39     {
 40         display(time);
 41     }   
 42     return 0;    
 43 }     
 44 //=================================================================
 45 void decoder(char num)//     
 46 {
 47         A0 = num%2;
 48         A1 = (num>>1)%2;
 49         A2 = num>>2;
 50 }
 51 void delay(int num)
 52 {
 53     int i,j;
 54     for(i = 0;i<100;i++)
 55         for(j = 0;j<3*num;j++);
 56 }
 57 void display(int num)
 58 {
 59     int number[4];
 60     int cnt;
 61     int site = 0x01;
 62     for(cnt = 0;cnt<4;cnt++)
 63     {
 64         number[3-cnt] =table[(num/((int)pow(10,cnt)))%10];
 65     }
 66     for(cnt = 0;cnt < 4;cnt++)
 67     {
 68         decoder(7);
 69         WR = 0;
 70         P0 = number[cnt];
 71         decoder(6);           
 72         P0 = site;
 73         site = site<<1;
 74         if(site == 0x10) site =0x01; 
 75         WR = 1;
 76         delay(1);           
 77     }
 78 }
 79 void timer_initial()
 80 {
 81     TMOD = 0x11;
 82     TH0 = (1<<16 -50000)/256;
 83     TL0 = (1<<16 -50000)%256;
 84     TH1 = (1<<16 -50000)/256;
 85     TL1 = (1<<16 -50000)%256;
 86     ET0 = 1;
 87     ET1 = 1;
 88     TR0 = 1;
 89     TR1 = 1;
 90 }
 91 //==============================================================
 92 void timer0() interrupt 1//   0
 93 {
 94     static int count =0;
 95     TH0 = (1<<16 -50000)/256;
 96     TL0 = (1<<16 -50000)%256;
 97     count++;
 98     if(count == 20)
 99     {
100         count =0;
101         time++;
102     }
103 }
104 void timer1() interrupt 3//   1
105 {   
106     static int count = 0;
107     static uchar ledx = 0x01;
108     count++;
109     TH1 = (1<<16 -50000)/256;
110     TL1 = (1<<16 -50000)%256;  
111     if(count ==2)
112     {
113         count = 0;
114         WR = 0;
115         decoder(4);
116         P0 = ~ledx;
117         ledx = ROL(ledx);
118         WR = 1;
119         decoder(0);//            
120     }
121 }