切换到宽版
爱科技/爱创意/爱折腾;电子/数码爱好者的家!欢迎访问新版数码之家网站
  • 3054阅读
  • 29回复

需帮助,求一小程序,赠送话费20元 [复制链接]

上一主题 下一主题
离线drsd
 

发帖
276
M币
482
专家
0
粉丝
17
只看楼主 正序阅读 我要置顶 楼主  发表于: 2015-06-15
目前正学习单片机中,很多地方还迷糊着。求写一小程序,可直接回贴,程序测试正确充话费到手机,以表感谢。
手里有单片机型号是12C5A60S2
触发条件:外部输入12V200ma左右电流(这里需要用光耦隔离吗?)
触发条件下:
          I/O口 1输出低电平 (控制10A固态继电器,继电器控制端工作电压DV3-32V,电流3-25ma)
           2秒后
          I/O口  2输出低电平(开关信号,对地)
          约30秒后,1,2口输出高电平(相当于关闭)
        
           约80秒后

          I/O口  3输出低电平 (控制10A固态继电器,继电器控制端工作电压DV3-32V,电流3-25ma)
           2秒后
          I/O口  4输出低电平(开关信号,对地)
          5秒后
          I/O口  5输出低电平(开关信号,对地)
          约30秒后,3,4,5口输出高电平(相当于关闭)



           约80秒后

          I/O口  6输出低电平 (控制10A固态继电器,继电器控制端工作电压DV3-32V,电流3-25ma)           2秒后
          I/O口  7输出低电平(开关信号,对地)          5秒后
          I/O口  8输出低电平(开关信号,对地)          约30秒后,6,7,8口输出高电平(相当于关闭)

1.触发条件:外部输入12V200ma左右电流(这里需要用光耦隔离吗?)
2.用低电平方式控制继电器是否合理,3.程序单循环一次即可,运行期间再次触发无效。

本人初学,不懂的地方太多,谢谢大家指点,如果能提供线路图和PCB文件更好,短信私聊。




M币换购:工善必利器,您的拆机好伴侣~数码之家X22精密型螺丝刀套装(拆客必备系列)
 
离线mailshichao

发帖
119
M币
457
专家
0
粉丝
8
只看该作者 29楼 发表于: 2015-06-24
   楼主搞定了么,如果没有搞定,可以找我,我可以帮你,就当交个朋友。
离线elecfun

发帖
1331
M币
164
专家
12
粉丝
86
只看该作者 28楼 发表于: 2015-06-17
你说“程序单循环一次即可”,我还以为只运行一次。
可循环触发代码如下,你可以和之前的对比看下有什么区别。


/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC12C5Axx Series 16-bit Timer Demo -------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/

#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

/* define constants */
#define FOSC 12000000L
#define MODE1T                      //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode

#ifdef MODE1T
#define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode
#else
#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
#endif

/* define SFR */
sfr AUXR = 0x8e;                    //Auxiliary register

sbit TRIG   = P1^0;
sbit IO1    = P2^0;
sbit IO2    = P2^1;
sbit IO3    = P2^2;
sbit IO4    = P2^3;
sbit IO5    = P2^4;
sbit IO6    = P2^5;
sbit IO7    = P2^6;
sbit IO8    = P2^7;

/* define variables */
WORD count;                         //1000 times counter
WORD second;

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
    TL0 = T1MS;                     //reload timer0 low byte
    TH0 = T1MS >> 8;                //reload timer0 high byte
    if (count-- == 0)               //1ms * 1000 -> 1s
    {
        count = 1000;               //reset counter
        switch(++second)
        {
        case   2: IO2 = 0; break;
        case  32: IO1 = 1; IO2 = 1; break;
        case 112: IO3 = 0; break;
        case 114: IO4 = 0; break;
        case 119: IO5 = 0; break;
        case 149: IO3 = 1; IO4 = 1; IO5 = 1; break;
        case 229: IO6 = 0; break;
        case 231: IO7 = 0; break;
        case 236: IO8 = 0; break;
        case 266: IO6 = 1; IO7 = 1; IO8 = 1;  TR0 = 0; second = 0; count = 1000; break;
        }
    }
}

//-----------------------------------------------

/* main program */
void main()
{
#ifdef MODE1T
    AUXR = 0x80;                    //timer0 work in 1T mode
#endif
    TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
    TL0 = T1MS;                     //initial timer0 low byte
    TH0 = T1MS >> 8;                //initial timer0 high byte
    TR0 = 0;                        //timer0 start running
    ET0 = 1;                        //enable timer0 interrupt
    EA = 1;                         //open global interrupt switch
    count = 1000;                      //initial counter
    second = 0;
    
    TRIG = 1;
    IO1  = 1;
    IO2  = 1;
    IO3  = 1;
    IO4  = 1;
    IO5  = 1;
    IO6  = 1;
    IO7  = 1;
    IO8  = 1;
    
    while(1)
    {
        while (~TRIG);                      //high triger
        TR0 = 1;
        IO1 = 0;
        while(TR0);
    }    
    
}
离线drsd

发帖
276
M币
482
专家
0
粉丝
17
只看该作者 27楼 发表于: 2015-06-17
好的,谢谢,再琢磨下
离线firstbird

发帖
6145
M币
236
专家
2
粉丝
18
只看该作者 26楼 发表于: 2015-06-17
回 drsd 的帖子
drsd:[表情] 太难堪了,触发脚居然接到电源脚去了,相当于每按键一次重启一次。
按照正确的脚接上又有问题了,程序执行完后,再次触发没反应,触发脚接到电源限流后按键直接对地的。
[图片] (2015-06-17 12:12) 回 drsd 的帖子

人家这不是按你要求的,只搞一次,搞完睡死。
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C5Axx Series 16-bit Timer Demo -------------------------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
  7. /* --- Web: www.STCMCU.com -----------------------------------------*/
  8. /* --- Web: www.GXWMCU.com -----------------------------------------*/
  9. /* If you want to use the program or the program referenced in the  */
  10. /* article, please specify in which data and procedures from STC    */
  11. /*------------------------------------------------------------------*/
  12. #include "reg51.h"
  13. #include <intrins.h>
  14. typedef unsigned char BYTE;
  15. typedef unsigned int WORD;
  16. //-----------------------------------------------
  17. /* define constants */
  18. #define FOSC 12000000L
  19. #define MODE1T                      //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
  20. #ifdef MODE1T
  21. #define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode
  22. #else
  23. #define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
  24. #endif
  25. /* define SFR */
  26. sfr AUXR = 0x8e;                    //Auxiliary register
  27. sbit TRIG   = P1^0;
  28. sbit IO1    = P2^0;
  29. sbit IO2    = P2^1;
  30. sbit IO3    = P2^2;
  31. sbit IO4    = P2^3;
  32. sbit IO5    = P2^4;
  33. sbit IO6    = P2^5;
  34. sbit IO7    = P2^6;
  35. sbit IO8    = P2^7;
  36. /* define variables */
  37. WORD count;                         //1000 times counter
  38. WORD second;
  39. unsigned char IN_PROGRESS;
  40. //-----------------------------------------------
  41. /* Timer0 interrupt routine */
  42. void tm0_isr() interrupt 1 using 1
  43. {
  44.     TL0 = T1MS;                     //reload timer0 low byte
  45.     TH0 = T1MS >> 8;                //reload timer0 high byte
  46.     if (count-- == 0)               //1ms * 1000 -> 1s
  47.     {
  48.         count = 1000;               //reset counter
  49.         switch(++second)
  50.         {
  51.         case   2: IO2 = 0; break;
  52.         case  32: IO1 = 1; IO2 = 1; break;
  53.         case 112: IO3 = 0; break;
  54.         case 114: IO4 = 0; break;
  55.         case 119: IO5 = 0; break;
  56.         case 149: IO3 = 1; IO4 = 1; IO5 = 1; break;
  57.         case 229: IO6 = 0; break;
  58.         case 231: IO7 = 0; break;
  59.         case 236: IO8 = 0; break;
  60.         case 266: IO6 = 1; IO7 = 1; IO8 = 1;  TR0 = 0; second = 0; IN_PROGRESS = 0; break;
  61.         }
  62.     }
  63. }
  64. //-----------------------------------------------
  65. /* main program */
  66. void main()
  67. {
  68. #ifdef MODE1T
  69.     AUXR = 0x80;                    //timer0 work in 1T mode
  70. #endif
  71.     TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
  72.     TL0 = T1MS;                     //initial timer0 low byte
  73.     TH0 = T1MS >> 8;                //initial timer0 high byte
  74.     TR0 = 0;                        //timer0 start running
  75.     ET0 = 1;                        //enable timer0 interrupt
  76.     EA = 1;                         //open global interrupt switch
  77.     for (;;) {
  78.         count = 1000;                      //initial counter
  79.         second = 0;
  80.         TRIG = 1;
  81.         IO1  = 1;
  82.         IO2  = 1;
  83.         IO3  = 1;
  84.         IO4  = 1;
  85.         IO5  = 1;
  86.         IO6  = 1;
  87.         IO7  = 1;
  88.         IO8  = 1;
  89.         _nop_();  
  90.         _nop_();
  91.         _nop_();
  92.         _nop_();
  93.         while (~TRIG);                      //high triger
  94.         IN_PROGRESS = 1;
  95.         TR0 = 1;
  96.         IO1 = 0;
  97.         while (~IN_PROGRESS);
  98.         _nop_();  
  99.         _nop_();
  100.         _nop_();
  101.         _nop_();
  102.     }
  103. }
离线drsd

发帖
276
M币
482
专家
0
粉丝
17
只看该作者 25楼 发表于: 2015-06-17
太难堪了,触发脚居然接到电源脚去了,相当于每按键一次重启一次。
按照正确的脚接上又有问题了,程序执行完后,再次触发没反应,触发脚接到电源限流后按键直接对地的。

本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线firstbird

发帖
6145
M币
236
专家
2
粉丝
18
只看该作者 24楼 发表于: 2015-06-17
上实物示意图,不会画pcb,画图软件总会用吧,这么简单的流程不可能重触发的,除非干扰特别严重。
离线drsd

发帖
276
M币
482
专家
0
粉丝
17
只看该作者 23楼 发表于: 2015-06-17
回 elecfun 的帖子
elecfun:1、建议用光耦隔离,如果共地的话可以电阻分压到5V触发,并加上稳压管。
2、STC单片机复位时IO为高电平,所以低电平控制是合理的。
以下代码在 STC-ISP(V6.85F)范例程序STC12C5Axx/STC12LE5Axx Series - 定时器0 - C 的基础上改写的,只是编译通过,未经验证。IO口配置请自行修改 .. (2015-06-15 12:47) 回 elecfun 的帖子

测试了几次,程序运行中再次触发会从头运行,程序中有些地方不明白,这个流程中,应该没有用到中断啊。
我是在面包板上接发光二极管做的测试,触发IO口通过微动开关直接对地的方式,谢谢!
在线18675537031

发帖
270
M币
446
专家
0
粉丝
16
只看该作者 22楼 发表于: 2015-06-15
我是鑫鑫:最近连生活费都还差一大截,没有资金了啊。 (2015-06-15 18:31) 

再接再厉

内容来自Android手机客户端

离线yituwu

发帖
339
M币
77
专家
6
粉丝
94
只看该作者 21楼 发表于: 2015-06-15
这个有点简单,貌似是PLC控制程序,用单片机也可以实现,但是你这个诱惑有点不够力
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个