hl1200aa 发表于 2023-11-19 11:42:26

安装好keil4, 按照视频往keil添加MCU,写个点亮dp的文件。
这个板子设计得有点奇葩,明明可以用硬件led驱动数码管,但却选择了软驱,可能大神的想法和我们不同吧。

延时用isp工具算的,一秒闪一次。
attach://27286.png
attach://27287.jpg
/*********************************************************/

#define MAIN_Fosc        11059200L        //定义主时钟

#include        "STC8Gxxx.h"

/*************        功能说明        *************

点灯程序
板载一个两位8字共阳模块
G1 pin16 p3.5
G2 pin17 p3.6

a pin20 p1.1
b pin3p1.4
c pin5p1.6
d pin4p1.5
e pin1p1.2
f pin2p1.3
g pin6p1.7
dp pin7 p5.4

这次先点dp

G1 G2 设置为高电平        推挽输出    p3.5 p3.6 p3m1=00000000b      p3m0=01100000b                                                                                                                                                                                                                                                                                                         
dp设置为低电平       开漏输出        p5.4 p5m1=00010000b               p5m0=00010000b

按正常来说,应该用p1口做led驱动的com口,用p3口做led驱动的seg口
以利用单片机里面的led硬件驱动
这个电路板设计得有点奇葩       

******************************************/


/*************        本地常量声明        **************/

/*************        本地变量声明        **************/

/*************        本地函数声明        **************/



/****************外部函数声明和外部变量声明 *****************/

/**********************************************/

void Delay100ms(void)        //@11.0592MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void main(void)
{

        int time100ms = 0;

        P_SW2 |= 0x80;        //允许访问XSFR(扩展特殊功能寄存器)

        P3M1 = 0x00;
        P3M0 = 0x60;

        P5M1 = 0x10;               
        P5M0 = 0x10;

        P35 = 1;
        P54 = 0;
       
        while (1)
        {
          for(time100ms = 10; time100ms > 0; time100ms--)
                {
                     Delay100ms();   
                }
                P54 = 1;
                  for(time100ms = 10; time100ms > 0; time100ms--)
                {
                     Delay100ms();   
                }
                P54 = 0;                                  
        }
}

hl1200aa 发表于 2023-12-9 16:52:53

本帖最后由 hl1200aa 于 2023-12-9 17:25 编辑

根据电路图分配单片机资源

P10   传感器输入输入高阻
P11   seg_a输出开漏输出
P12   seg_e输出开漏输出   
P13   seg_f输出开漏输出   
P14   seg_b输出开漏输出   
P15   seg_d输出开漏输出   
P16   seg_c输出开漏输出   
P17   seg_g输出开漏输出   

P0M0 = 11111110B 0xfe
P0M1 = 11111110B 0xfe

P30   RX 不分配
P31   TX 不分配
P32   NO2输入 弱上拉
P33   1输出, 推挽输出,缺省高电平。
P34   2输出, 推挽输出,缺省高电平。
P35   数码管共阳G1, 推挽输出
P36   数码管共阳G2, 推挽输出
P37   红外管输出,推挽输出

P3M0 = 11111000B 0xf8
P3M1 = 00000100B 0x04

P54seg_dp输出开漏输出
P55   NO1输入 弱上拉

P5M0 = 00010000B 0x00
P5M1 = 00010000B 0x10


_奶咖君_ 发表于 2023-12-9 17:48:12

可真行,向人家要固件。。你怎么不发给人家让人家修呢。。

hl1200aa 发表于 2023-12-9 19:18:52

/*********************************************************/

#define MAIN_Fosc        11059200L        //定义主时钟

#include        "STC8Gxxx.h"

/*************        功能说明        *************

点灯程序
板载一个两位8字共阳模块
G1 pin16 p3.5
G2 pin17 p3.6

a pin20 p1.1
b pin3p1.4
c pin5p1.6
d pin4p1.5
e pin1p1.2
f pin2p1.3
g pin6p1.7
dp pin7 p5.4

这次先点 G1和dp

G1 G2 设置为高电平        推挽输出    p3.5 p3.6 p3m1=00000000b      p3m0=01100000b                                                                                                                                                                                                                                                                                                         
dp设置为低电平       开漏输出        p5.4 p5m1=00010000b               p5m0=00010000b

按正常来说,应该用p1口做led驱动的com口,用p3口做led驱动的seg口
以利用单片机里面的led硬件驱动
这个电路板设计得有点奇葩       

******************************************/


/*************        本地常量声明        **************/

/*************        本地变量声明        **************/

/*************        本地函数声明        **************/



/****************外部函数声明和外部变量声明 *****************/

/**********************************************/
/*
void Delay100ms(void)        //@11.0592MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
*/

void main(void)
{

        int time100ms = 0;

        P_SW2 |= 0x80;        //允许访问XSFR(扩展特殊功能寄存器)

        P1M1 = 0xff;
        P1M0 = 0xfe;

        P3M1 = 0x80;
        P3M0 = 0xf8;

        P5M1 = 0x10;               
        P5M0 = 0x10;

        P35 = 1;
        P35 = 0;

        P36 = 1;
        P36 = 0;

        P54 = 1;
        P54 = 0;

    P1 = P1 | 0xfe;
        P1 = P1 & 0x01;       

        P35 = 1;
        P36 = 1;
       
        P35 = 0;
        P36 = 0;

        //P37 = 0;
        //P37 = 1;

        while (1)
        {
        /*
          for(time100ms = 10; time100ms > 0; time100ms--)
                {
                     Delay100ms();   
                }
                P54 = 1;
                P1 = P1 | 0xfe;
                  for(time100ms = 10; time100ms > 0; time100ms--)
                {
                     Delay100ms();   
                }
                P54 = 0;
                P1 = P1 & 0x01;
        */
       
            if(P55 == 1)//        NO1 按下按键高电平
            {
                P35 = 1;//点亮1号数码管
            }
          else
          {
                P35 = 0;
          }
                if(P32 == 1)//        NO2 按下按键高电平
            {
                
                        P37 = 0;//启动红外管
                        if(P10 == 0)//传感器收到红外电平为底,关闭输出
                        {
                             P36 = 0;//   
                        }
                        else//否则点亮2号数码管
                        {
                          P36 = 1;
                        }
            }
          else
          {
                P37 = 1;//关闭红外管
                        P36 = 0;
          }
                                          
        }
}
/**********************************************/

xxkj2010 发表于 2023-12-9 19:47:21

gentleman 发表于 2023-11-15 12:10
你向厂家要/买几片 写好程序的芯片 不就行了。

当然,你有能力坚持学下去更好。


买几片写好程序的芯片?估计价格不便宜吧。

xxkj2010 发表于 2023-12-9 19:48:04

估计得自己摸索工作原理,自己编程烧录程序。

hl1200aa 发表于 2023-12-10 00:47:28

/*********************************************************/

#define MAIN_Fosc      11059200L      //定义主时钟

#include      "STC8Gxxx.h"

/*************      功能说明      *************
整体布局

功能      管脚      用途                 输入输出   类型      PXM1PXM0
P10         PIN19       传感器输入      输入         高阻           1   0
P11         PIN20       seg_a         输出         开漏输出1   1
P12         PIN1      seg_e         输出         开漏输出1   1
P13         PIN2      seg_f         输出         开漏输出1        1
P14         PIN3      seg_b         输出         开漏输出1        1
P15         PIN4      seg_d         输出         开漏输出1        1
P16         PIN5      seg_c         输出         开漏输出1        1
P17         PIN6      seg_g         输出         开漏输出1        1

P0M1 = 11111110B 0xff
P0M0 = 11111110B 0xfe

功能      管脚      用途                 输入输出   类型      PXM1PXM0
P30         PIN11       RX不分配                                                           0       0
P31         PIN12       TX不分配                                                           0       0
P32         PIN13       NO2输入         输入         准双口    0       0    设置为高电平
P33         PIN14       NO1输出         输出         推挽输出0   1    缺省高电平。
P34         PIN15       NO2输出         输出         推挽输出0   1    缺省高电平。
P35         PIN16       数码管共阳G1    输出         推挽输出0   1
P36         PIN17       数码管共阳G2    输出         推挽输出0   1
P37         PIN18       红外管输出      输出         开漏输出1       1    0发光,1灭光

P3M1 = 1000 0000B 0x80
P3M0 = 1111 1000B 0xf8

功能      管脚      用途                 输入输出   类型      PXM1PXM0
P54         PIN7      seg_dp          输出         开漏输出1       1
P55         PIN9      NO1输入         输入         准双口    0   0    设置为高电平

P5M0 = 0001 0000B 0x10
P5M1 = 0001 0000B 0x10
      

******************************************/


/*************      本地常量声明      **************/

#define NO1_IN_ON (P55 == 1)
#define NO2_IN_ON (P32 == 1)

#define NO1_OPEN   (P33 = 0)
#define NO1_CLOSE   (P33 = 1)

#define NO2_OPEN   (P34 = 0)
#define NO2_CLOSE   (P34 = 1)

#define IR_ON       (P37 = 0)
#define IR_OFF       (P37 = 1)

#define G1_ON    (P35 = 1)
#define G1_OFF    (P35 = 0)

#define G2_ON    (P36 = 1)
#define G2_OFF    (P36 = 0)

#define SENSOR_ON(P10 == 0)

/*************      本地变量声明      **************/

/*************      本地函数声明      **************/



/****************外部函数声明和外部变量声明 *****************/

/**********************************************/

void Delay100ms(void)      //@11.0592MHz
{
      unsigned char data i, j, k;

      _nop_();
      _nop_();
      i = 5;
      j = 52;
      k = 195;
      do
      {
                do
                {
                        while (--k);
                } while (--j);
      } while (--i);
}


void main(void)
{

      int time100ms = 0;
                char statu_g1 = 0;
                char statu_g2 = 0;

      P_SW2 |= 0x80;      //允许访问XSFR(扩展特殊功能寄存器)

      //设置管脚模式
      P1M1 = 0xff;
      P1M0 = 0xfe;

      P3M1 = 0x80;
      P3M0 = 0xf8;

      P5M1 = 0x10;               
      P5M0 = 0x10;

      //P32, P55设置上拉电阻
                P32 = 1;
                P55 = 1;

                //关闭开关
                NO1_CLOSE;
                NO2_CLOSE;

                //关闭IR
      IR_OFF;

                //关闭G1,G2
                G1_OFF;
                G2_OFF;

                //全部打开数码管的seg
                P1 &= 0x01;
                P54 = 0;

                G1_ON;
                G2_ON;

                for(time100ms = 10; time100ms > 0; time100ms--)
      {
             Delay100ms();   
      }

                G1_OFF;
                G2_OFF;

      while (1)
      {
      /*
            for(time100ms = 10; time100ms > 0; time100ms--)
                {
                     Delay100ms();   
                }
                P54 = 1;
                P1 = P1 | 0xfe;
                  for(time100ms = 10; time100ms > 0; time100ms--)
                {
                     Delay100ms();   
                }
                P54 = 0;
                P1 = P1 & 0x01;
      */
      
            if(NO1_IN_ON)//      NO1 按下按键高电平
            {
                //如果G2处于关闭状态
                                if (statu_g2 == 0)
                                {
                                  G1_ON;//点亮1号数码管
                                        statu_g1 = 1; //改g1状态
                                        IR_ON; //打开红外
                                }
                               
            }
            if(NO2_IN_ON)//      NO2 按下按键高电平
            {
               //如果G1处于关闭状态
                           if (statu_g1 == 0)
                {
                                  G2_ON;//点亮2号数码管
                                        statu_g2 = 1;
                                        IR_ON; //打开红外
                                }
            }

                        if(SENSOR_ON)
                        {
                           //关闭红外
                           IR_OFF;
                           //关闭数码管
                           G1_OFF;
                           G2_OFF;
                           //改状态
                           statu_g1 = 0;
                           statu_g2 = 0;
                        }
                                          
      }
}
/**********************************************/

hl1200aa 发表于 2023-12-10 00:53:18

效果
attach://29150.mp4

shanmudadao 发表于 2023-12-10 09:34:27

楼主也是个牛人啊

NTC 发表于 2023-12-10 11:32:21

牛人,修个件,搞成开发了。
页: 1 [2] 3 4 5
查看完整版本: 修个设备的电路板,持续更新。