hl1200aa 发表于 2023-12-10 14:25:10

本帖最后由 hl1200aa 于 2023-12-10 14:28 编辑

再刷了一下陈老师的定时器和中断,把5秒超时关闭加了上去,基本完成了。

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

#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 timeout_ms 5000

#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)

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

//用一个变量记录时间
unsigned int time_count_ms = 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);
}

//初始化T0
void time_init_T0(void)
{
    AUXR &= 0x7f;//定时器时钟12T模式
        TMOD &= 0xf0;//设置定时器模式
       
}

//开启T0 50ms计时,并且开启中断
void time_start_T0(void)
{
    TL0=0x00;//设置定时器初始值
        TH0=0x4c;//设置定时器初始值
        TF0=0;   //清除TF位
        ET0=1;   //允许T0中断
        time_count_ms = 0;
        TR0=1;   //定时器0开始计数   
}

//关闭T0 50ms计时,并且开启中断
void time_stop_T0(void)
{
    ET0=1;   //禁止T0中断
        TF0=0;   //清除TF位
        TR0=0;   //禁止器0开始计数
        TL0=0x00;//设置定时器初始值
        TH0=0x4c;//设置定时器初始值
        time_count_ms = 0;          
}

//定时器0中断函数
void T0_ISR(void) interrupt 1
{
    TF0=0;   //清除TF位
        time_count_ms += 50;
}

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;

                //初始化计数器
                time_init_T0();

                //打开全局中断
                EA = 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(NO1_IN_ON)//      NO1 按下按键高电平
            {
                //如果G1, G2处于关闭状态
                                if (statu_g2 == 0)
                                {
                                  G1_ON;//点亮1号数码管
                                        statu_g1 = 1; //改g1状态
                                        IR_ON; //打开红外
                                        //启动定时器
                                        time_stop_T0();
                                        time_start_T0();
                                }
                               
            }
            if(NO2_IN_ON)//      NO2 按下按键高电平
            {
               //如果G1处于关闭状态
                           if (statu_g1 == 0)
                {
                                  G2_ON;//点亮2号数码管
                                        statu_g2 = 1;
                                        IR_ON; //打开红外
                                        //启动定时器
                                        time_stop_T0();
                                        time_start_T0();
                                }
            }

                        if(SENSOR_ON || (time_count_ms > timeout_ms))
                        {
                           //关闭计数器
                           time_stop_T0();
                           //关闭红外
                           IR_OFF;
                           //关闭数码管
                           G1_OFF;
                           G2_OFF;
                           //改状态
                           statu_g1 = 0;
                           statu_g2 = 0;
                        }
                                          
      }
}
/**********************************************/

hl1200aa 发表于 2023-12-10 14:45:39

其实搞这个原意并非和供应商夺食,只是这两年经历太多昨晚还推杯换盏,规划宏图,一觉醒来就科目三的事情,老板的消息比较灵通,他叫不要麻烦供应商实情可能是不久的将来麻烦不到供应商,只能凭自己的能力维护设备了,经历过的都懂。
在这个市场风雨飘摇的时局中,写一下与诸位共勉。

白开水1233 发表于 2023-12-10 16:09:14

D_Works 发表于 2023-12-13 08:17:23

楼主厉害了!修个设备马上就能开发了!

pangshijz 发表于 2023-12-13 09:11:04

买个芯片?不用写程序的吗

wpppmlah 发表于 2023-12-13 10:52:16

有钱赚,有兴趣,就有动力,加油楼主。

ydcsb 发表于 2023-12-13 11:03:57

加油,我们也是。以前设备上的驱动板也是买的,后来我们要更改一些功能,厂家这个不能改那个不能改,还涨价。后来干脆自已搞一个,经过差不多3个月的学习(听陈老师的课,边学边弄边测试,不懂的就在论坛内问问),竞然被我搞成了。{:4_174:}自已都不相信自已能够搞成功

hl1200aa 发表于 2023-12-17 20:48:17

掌握核心技术就是爽,星期四客户有个机器坏了,供应商说零件下周三才能到,客户则要星期一修好,最后修修改改这个板,通宵肝出来去打样,再修改一下代码,今天星期日打样到了,零件也到了,焊起来刷好hex一切正常,晚上给客户装起来ok了。

装前留念
attach://29994.mp4

shanmudadao 发表于 2023-12-18 07:56:00

hl1200aa 发表于 2023-12-17 20:48
掌握核心技术就是爽,星期四客户有个机器坏了,供应商说零件下周三才能到,客户则要星期一修好,最后修修改 ...

成就感爆棚{:4_245:}

小白 发表于 2023-12-18 09:42:25

hl1200aa 发表于 2023-11-12 21:37
看视频和站内的资料,整个流程应该是
1. keil写代码,编译出hex文件。
2. 用stc-isp通过TTL线连接STC8G1K08 ...

这个过分的要求,你都能说出口{:lol:}
页: 1 2 [3] 4 5
查看完整版本: 修个设备的电路板,持续更新。