1、中断定时1ms,那么一秒刷新一次应该是for(i<=1000)还是(i<999)?

2.

 

直接P1 等于一个值,P1^0对应的是这个值的二进制最低位还是最高位?

最低

 3、下边代码为何能使小灯和一个数码管同时亮

#include<reg52.h>
//控制数码亮还是小灯亮
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;

sbit ENLED = P1^1;

unsigned char T0RH = 0;
unsigned char T0RL = 0;

bit flagls =1;

unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

unsigned char LedBuff[7] = {
    0xFF, 0xFF,    0xFF, 0xFF, 0xFF, 0xFF ,0xff
    //0x11,0x12,0x14,0x24,0x12,0x44
}; //最后一位控制小灯


void ConfigTimer0(unsigned int ms);
void LedScan();
void TrafficLight();

void main()
{    int i;
    ENLED = 0;
    //EA = 1;

    P20 = 1;
    P21 = 0;
    P22 = 1;
    //P0 = 127;

    ConfigTimer0(1);
//    while(1)
//    {
//        //if(flagls == 1)
//        if(flagls)
//        {
//           flagls=0;
//           TrafficLight() ;
//        }
//    }

//测试代码
        i=0;
          P2 = (P2&0xF8)|(~(i+1));
        P0 = 0x00;//LedBuff[i];

}

 

 电路图如下

 

 

 找问题:

 1 #include<reg52.h>
 2 //控制数码亮还是小灯亮
 3 sbit P20 = P2^0;
 4 sbit P21 = P2^1;
 5 sbit P22 = P2^2;
 6 
 7 sbit ENLED = P1^1;
 8 
 9 //unsigned char T0RH = 0;    //////////////////
10 //unsigned char T0RL = 0;     /////////////
11 
12 //bit flagls =1;        ////////////////////
13 //
14 //unsigned char code LedChar[] = {
15 //    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
16 //    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
17 //};
18 //
19 //unsigned char LedBuff[7] = {
20 //    0xFF, 0xFF,    0xFF, 0xFF, 0xFF, 0xFF ,0xff
21 //    //0x11,0x12,0x14,0x24,0x12,0x44
22 //}; //最后一位控制小灯
23 
24 
25 //void ConfigTimer0(unsigned int ms);
26 //void LedScan();
27 //void TrafficLight();
28 
29 void main()
30 {    int i;
31     ENLED = 0;
32     //EA = 1;
33 
34 //    P20 = 1;
35 //    P21 = 0;
36 //    P22 = 1;
37     //P0 = 127;
38 
39     //ConfigTimer0(1);
40 //    while(1)
41 //    {
42 //        //if(flagls == 1)
43 //        if(flagls)
44 //        {
45 //           flagls=0;
46 //           TrafficLight() ;
47 //        }
48 //    }
49 
50 //测试代码
51         i=0;
52           P2 = (P2&0xF8)|(~(i+1));
53         P0 = 0x00;//LedBuff[i];
54 
55 }

此时只有小灯亮;

如若不讲34、35、36代码注释,则小灯和一个数码管亮。

但是不管只有小灯亮还是数码管和小灯一起亮,显示亮度都比较暗,为了方便观看代码,下边将注释删掉

 1 #include<reg52.h>
 2 //控制数码亮还是小灯亮
 3 sbit P20 = P2^0;
 4 sbit P21 = P2^1;
 5 sbit P22 = P2^2;
 6 
 7 sbit ENLED = P1^1;
 8 
 9 
10 
11 void main()
12 {    int i;
13     ENLED = 0;
14 
15 
16     P20 = 1;
17     P21 = 0;
18     P22 = 1;
19 
20         i=0;
21           P2 = (P2&0xF8)|(~(i+1));
22         P0 = 0x00;//LedBuff[i];
23 
24 }

接下来查找是那行代码影响了数码管,经测试是第17行,P21不注释则小灯和一个数码管亮。注释则只有小灯亮;

接下来分析代码

P2 = (P2&0xF8)|(~(i+1));

0xF8二进制为1111 1000

与P2进行与操作,高五位不变,低三位置零

i=0,则i+1=1,二进制为0x0000 0001

进行非运算得二进制1111 1110

1111 1000与1111 1110进行或运算得

1111 1110,低三维为110,即P2^0 = 0, P2^1 = 1, P2^2 = 1.

查询三八译码器转换值

 

 只有Y6输出低电平,即正常情况只有小灯会亮

 

分析失败!!!!!!!!!!!!!!!!

----------------------------------------------------分割线-------------------------------------------------------

问题解决,大佬说因为没加while,百度了下

 

 不加的话,一直循环执行整个程序,所以会出现这种情况

 

posted on 2021-03-02 16:09  黑光夜中明  阅读(73)  评论(0编辑  收藏  举报