野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20271|回复: 5

从机可控硅控制,三路输出,一路采样,供参考

[复制链接]
发表于 2014-10-24 12:19:30 | 显示全部楼层 |阅读模式
  1. #include<stc.h>
  2. #include<intrins.h>
  3. #include <string.h>

  4. //----------------------------------------------------------宏名替换---------------------------------
  5. //----------------------------------------------------------宏名替换---------------------------------
  6. //----------------------------------------------------------宏名替换---------------------------------
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define ulong unsigned long
  10. //---------------------------------------------------------IO口的位定义------------------------------
  11. //---------------------------------------------------------IO口的位定义------------------------------
  12. //---------------------------------------------------------IO口的位定义------------------------------
  13. //---------------------------------------------------------IO口的位定义------------------------------
  14. //---------------------------------------------------------IO口的位定义------------------------------

  15. sbit one=P3^4;//风温
  16. sbit two=P3^5;//座温
  17. sbit three=P3^6;//水温

  18. sbit zerocheck=P3^7;

  19. sbit p26=P2^6;
  20. sbit p35=P3^5;
  21. //------------------------------------------------------------定义全局变量----------------------------
  22. //------------------------------------------------------------定义全局变量----------------------------
  23. //------------------------------------------------------------定义全局变量----------------------------
  24. //------------------------------------------------------------定义全局变量----------------------------
  25. //------------------------------------------------------------定义全局变量----------------------------
  26. uchar         comdflag,
  27.                 workflag_one,workflag_two,workflag_three,
  28.                 one_num,two_num,three_num,
  29.                 key,
  30.                 up,down,
  31. //                *p,
  32.                 i,
  33.                 uart_i,
  34.                 up1,up2,up3,
  35.                 down1,down2,down3;
  36.                
  37. ulong timer_flag=0;               

  38. uchar comdof_host[9]={0};

  39. //------------------------------------------------------子函数声明----------------------------------
  40. //------------------------------------------------------子函数声明----------------------------------
  41. //------------------------------------------------------子函数声明----------------------------------
  42. //------------------------------------------------------子函数声明----------------------------------


  43. void initio();
  44. void uartinit();
  45. void intinit();
  46. void initflag();

  47. //=====================================================主程序======================================
  48. //=====================================================主程序======================================
  49. //=====================================================主程序======================================
  50. //=====================================================主程序======================================
  51. //=====================================================主程序======================================



  52. void main()
  53. {
  54.         initflag();  //                  初始化标志
  55.          initio();         //                  初始化io口
  56.         uartinit();         //                  初始化串口        
  57.         intinit();         //                  初始化中断

  58.         PS=1;                 //                  串口优先级最高




  59.    while(1)
  60.    {

  61.            //====================================//急停开关==============================================
  62.                  if(key==1)                 
  63.                         {
  64.         
  65.                                 workflag_one=0;
  66.                                 workflag_two=0;
  67.                                 workflag_three=0;

  68.                                 
  69.                                 up=0;down=0;
  70.                                    up1=0;up2=0;up3=0;
  71.                                 down1=0;down2=0;down3=0;
  72.                                 one=0;
  73.                                 two=0;
  74.                                 three=0;
  75.                         
  76.                         }

  77.            
  78.            //========================================//正常停止==========================================        

  79.                 if(workflag_one==0 && zerocheck==0)  
  80.                         {                                                        
  81.                                 up1=0;
  82.                                  down1=0;
  83.                                  one=0;        
  84.                                 
  85.                         }
  86.                 if(workflag_two==0 && zerocheck==0)  
  87.                         {                                                        
  88.                                 up2=0;
  89.                                  down2=0;
  90.                                  two=0;        
  91.                                 
  92.                         }
  93.                 if(workflag_three==0 && zerocheck==0)  
  94.                         {                                                        
  95.                                 up3=0;
  96.                                  down3=0;
  97.                                  three=0;        
  98.                                 
  99.                         }        


  100.         //====================================启动可控硅====================================////////////////////////////


  101.                      
  102.                    // ---------------------------------------------------------------------------风温
  103.                    if(workflag_one==1 && key==0)        
  104.                    {
  105.                                    if(zerocheck==0 && up1==0)//正半周期
  106.                                 {
  107.                                   up1=1;
  108.                                   down1=0;

  109.                                 }
  110.                                 if(zerocheck!=0 && down1==0)//负半周期
  111.                                 {
  112.                                   down1=1;
  113.                                   up1=0;        
  114.                                 
  115.                                 }

  116.                    }

  117.                    //-----------------------------------------------------------------------------座温
  118.                    if(workflag_two==1 && key==0)
  119.                    {
  120.                                 if(zerocheck==0 && up2==0)//正半周期
  121.                                 {
  122.                                   up2=1;
  123.                                   down2=0;
  124.                                 
  125.                                 }
  126.                                 if(zerocheck!=0 && down2==0)//负半周期
  127.                                 {
  128.                                    down2=1;
  129.                                    up2=0;
  130.                                 
  131.                                 }
  132.                         }


  133.                    //-------------------------------------------------------------------------------水温
  134.                         if(workflag_three==1 && key==0)
  135.                    {
  136.                                 if(zerocheck==0 && up3==0)//正半周期
  137.                                 {
  138.                                         up3=1;
  139.                                         down3=0;
  140.                                 
  141.                                 }
  142.                                 if(zerocheck!=0 && down3==0)//负半周期
  143.                                 {
  144.                                         down3=1;
  145.                                         up3=0;
  146.                                 
  147.                                 }
  148.                   
  149.                    }
  150.                    //-------------------------------------------------------------------------------


  151.    }

  152. }

  153. //=====================================================中断入口程序======================================
  154. //=====================================================中断入口程序======================================
  155. //=====================================================中断入口程序======================================
  156. //=====================================================中断入口程序======================================
  157. //=====================================================中断入口程序======================================



  158. //==========================================================================////外部中断 0
  159. void TOUCH_int(void) interrupt 0                 
  160. {

  161.         comdflag=1;                                //外部中断0提示一个标志,说明有触摸屏操作

  162. }



  163. //==========================================================================////定时器0
  164. void intserv1(void) interrupt 1                //50us
  165. {
  166. //====================
  167. TH0=(65536-50)/256;
  168. TL0=(65536-50)%256;
  169. //====================


  170. if(up1>0) up1++;
  171. if(up2>0) up2++;
  172. if(up3>0) up3++;

  173. if(down1>0) down1++;
  174. if(down2>0) down2++;           
  175. if(down3>0) down3++;


  176. if(up1>250) up1=0;
  177. if(up2>250) up2=0;
  178. if(up3>250) up3=0;

  179. if(down1>250) down1=0;
  180. if(down2>250) down2=0;
  181. if(down3>250) down3=0;

  182.         

  183.          if(one_num<160 && workflag_one==1)
  184.         {
  185.                 if(one_num==0) {one=0;goto loop1;}
  186.                 if(up1==160-one_num && zerocheck==0)                one=1;         if(up1>160-one_num)                one=0;
  187.                 if(down1==190-one_num && zerocheck!=0)        one=1; if(down1>190-one_num)        one=0;
  188.                                        
  189.         }
  190. loop1: ;

  191.         if(two_num<160 && workflag_two==1)
  192.         {
  193.                 if(two_num==0) {two=0;goto loop2;}
  194.                  if(up2==160-two_num && zerocheck==0)        two=1;         if(up2>160-two_num && zerocheck==0)        two=0;
  195.                 if(down2==190-two_num && zerocheck!=0)        two=1;         if(down2>190-two_num && zerocheck!=0)        two=0;               
  196.         }
  197. loop2: ;

  198.         if(three_num<160 && workflag_three==1)
  199.         {
  200.                 if(three_num==0) {three=0;goto loop3;}
  201.                 if(up3==160-three_num && zerocheck==0)        three=1;         if(up3>160-three_num && zerocheck==0)        three=0;
  202.                 if(down3==190-three_num && zerocheck!=0)three=1;         if(down3>190-three_num && zerocheck!=0)three=0;               
  203.         }
  204. loop3: ;



  205. }



  206. //==========================================================================//串口中断
  207. //----数据帧格式----------9个字节
  208. //-----------------------------------------------------------------------------------
  209. //【0xc0】-----------------------------帧头
  210. //【总开关】
  211. //【开启风温】【风温档位】
  212. //【开启座温】【座温档位】
  213. //【开启水温】【水温档位】
  214. //【0x0c】-----------------------------帧尾
  215. //-----------------------------------------------------------------------------------
  216. void UART_receive(void) interrupt 4         
  217. {
  218.             
  219.          
  220.                           if(RI==1)
  221.                                   {  
  222.                                  
  223.                                          if(comdflag==1)         
  224.                                         {                                                                                                
  225.                                                 comdof_host[uart_i]=SBUF;
  226.                                                 uart_i++;

  227.                                                 if(uart_i==9 && comdof_host[0]==0xc0 && comdof_host[8]==0x0c )
  228.                                                 {
  229.                                                         key=comdof_host[1];

  230.                                                         workflag_one=comdof_host[2];
  231.                                                         one_num=comdof_host[3];

  232.                                                         workflag_two=comdof_host[4];
  233.                                                         two_num=comdof_host[5];

  234.                                                         workflag_three=comdof_host[6];
  235.                                                         three_num=comdof_host[7];

  236.                                                         
  237.                                                    
  238.                                                         uart_i=0;                        
  239.                                                         comdflag=0;
  240.                                                         p26=!p26;
  241.         
  242.                                                 }
  243.                                         }
  244.                                                 
  245.                                            RI=0;                                       
  246.                                 }
  247.                         else   
  248.                                 TI=0;


  249. }



  250. //=====================================================子函数======================================




  251. void initio()
  252. {
  253. P3M1=0x01;                  // 0000.0001                3.0输入
  254. P3M0=0x72;                  // 0111.0010

  255. P1M1=0x00;                  // 0000.0000                1.1  1.1  1.3  输出
  256. P1M0=0x0e;                  // 0000.1110

  257. P2M1=0x00;                  
  258. P2M0=0x0f;
  259. }
  260. void uartinit()           //波特率115200
  261. {


  262.         SCON = 0x50;                //8位数据,可变波特率
  263.         AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
  264.         T2L = 0xE6;                //设定定时初值
  265.         T2H = 0xFF;                //设定定时初值
  266.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  267.         AUXR |= 0x10;                //启动定时器2

  268.         
  269.         ES=1;                        //允许串口中断程序
  270.         EA=1;                        //开总中断

  271. }
  272. void intinit()        //中断0 中断1 定时器0 开启
  273. {
  274.            IT0=1;

  275.         EX0=1;


  276.         TMOD|=0x01;
  277.         ET0=1;
  278.         TR0=1;
  279.         TH0=(65536-50)/256;
  280.         TL0=(65536-50)%256;
  281.         EA=1;

  282. }
  283. void initflag()
  284. {
  285. //                p=comdof_host;

  286.                 one=0;
  287.                    two=0;
  288.                    three=0;
  289.                 comdflag=0;

  290.                 workflag_one=0;
  291.                 workflag_two=0;
  292.                 workflag_three=0;
  293.                 one_num=0;
  294.                 two_num=0;
  295.                 three_num=0;

  296.                 key=1;
  297.                 up=0;
  298.                 down=0;
  299.                
  300.                
  301.                 uart_i=0;
  302.                 up1=0;
  303.                 up2=0;
  304.                 up3=0;
  305.                 down1=0;
  306.                 down2=0;
  307.                 down3=0;

  308. }

复制代码
回复

使用道具 举报

发表于 2014-10-24 13:06:17 | 显示全部楼层
看不懂啊比雷公还雷人哦~
回复 支持 反对

使用道具 举报

发表于 2014-10-24 13:25:52 | 显示全部楼层
似乎好像差不多不是STM32单片机,无电路图,俺看不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-24 13:29:18 | 显示全部楼层
随便写的,我的代码估计也就我看得懂。。看下思路吧:主机发送一个脉冲+9个字节数据。
从机定时器50us,三路可控硅。每个可控硅各有2个标志,上升沿下降沿各自一个标志。

上升沿到来,up置1,down置0;下降沿到来down置1,up置0.
上升沿up1,up2,up3,,,,,,,上升沿时可控硅1,2,3,的计时标志
下降沿down1,down2,down3,,,,下降沿时可控硅1,2,3,的计时标志

定时器内判断若是上升沿则上升沿标志自加,计算时间,时间到就斩波。可控硅开通时间50us。
定时器内判断若是下降沿则下降沿标志自加,计算时间,时间到就斩波。可控硅开通时间50us。

串口数据【帧头】+【7个字节】+【帧尾】

【帧头】
【总开关】---------------------------------key
【可控硅1开关】【可控硅1档位】-------------wokflag_one,one_num
【可控硅2开关】【可控硅2档位】-------------wokflag_two,one_two
【可控硅3开关】【可控硅3档位】-------------wokflag_theree,one_three
【帧尾】
回复 支持 反对

使用道具 举报

发表于 2014-10-24 13:39:13 | 显示全部楼层
可以贴一下原理图吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-24 14:16:31 | 显示全部楼层
参考。。。。。。。。。。。。。。。。。。。。。。
aa.jpg
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 16:45 , Processed in 0.039907 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表