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:デコーダの復号プロセスをビット操作で一歩実行に変更し、確かに異常を解消したが、そのメカニズムはまだ理解されていない.
次のような問題が発生しました.
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 }