痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 9649|回復: 34

野人獻曝: 十段定時器

  [複製鏈接]
發表於 2014-8-31 20:12:53 | 顯示全部樓層 |閱讀模式
本帖最後由 antlu 於 2014-9-1 07:41 PM 編輯

這個電路和相片很熟悉吧!! 因為都是黑晶爐的拆機品,只是多了下面的電路板,提供5V電源和 TRIAC 繼電器,此一電路目前沒使用到 ADC部分,因為計時器好像不需要溫度這一部分!!

步驟設定
DSC08016.JPG

ON 時間設定 10~90~99
DSC08017.JPG

OFF時間設定 10~90~99
DSC08018.JPG

輸出選擇 OFF 1~3 選其一(當初為了給電扇的風速選擇)
DSC08019.JPG

開始倒數計時
DSC08020.JPG

STX 步驟  ON 時間 或 OFF 時間 交互顯示  按下停止"暫停"會顯示 SPX 若再按 啟動 則繼續 若再按停止 則是停止並且回到初始SP0 ,若是再按一次 停止 則全部設定清除為零...

/*
20140826更新程式更為人性化
sw1 啟動計時器 sw2暫停計時器 停止計時器步驟從零開始 程式內容歸零
sw3 步驟更改
sw4 步驟內容更改+10
sw5 步驟內容更改-10

20140815新程式需求多組時間控制的定時器
  10組設定
        on/off 時間以10分為計數
        輸出分為 0 1 2 3 只選其一配合黑晶爐輸出
       
        按鍵 sw3 選定步驟(SW1 SW2 -/+步驟) --> on時間(SW1 SW2 -/+10分鐘內定30分)  --> OFF時間(SW1 SW2 -/+10分鐘) --> 輸出(SW1 SW2 -/+輸出內定3)
按鍵 sw4 start sw5 stop 按下兩次從頭開始,若sw5 連續按鍵3次則全部清除為0  輸出全部都off
       
        顯示 ST0~ST9 SP0~SP9  按下sw3進行步驟(輸出停止) 若在該步驟按下sw4則進行啟動(進行程序) 按下sw5 則停止(不再進行)
       
        顯示A -->S, B -->T, C -->P, D--> -,E--> O,F--> F
PB6--pin3 小TRIAC
PB7--pin4 大TRIAC
PA2--pin5 大TRIAC
PF4--pin6 繼電器

BUZZER FREQ 2khz ON 250uS OFF 250uS
0830增加警報功能以及按停時候停止輸出
*/

#include "stm8s.h"
#include "stm8s_tim1.h"
#include "stm8s_tim5.h"
#include "stm8s_tim6.h"
#include "stm8s_adc1.h"
#define S 10
#define T 11
#define P 12
#define D 13
#define O 14
#define F 15
#define BUZZER GPIO_PIN_0
u8 pcdis[]={0xd6,0x14,0xcc,0x5c,0x1e,0x5a,0xda,0x14,0xde,0x5e,0x52,0x82,0x8e,0x08,0xd8,0x8a};//定義pc port 顯示的值
u8 pedis[]={0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x01};//定義pe port 顯示的值對應于7段顯示
// 增加了stpdop等字段

u8 Hundreds,Tens,Units;//顯示百位十位個位
u16 Display_Data;//
u8 count6;//timer 6
u8 display_time;//interrupt for display
u8 Menu=0;//菜單選擇按鍵
u8 One_Sec_Flag;
u8 One_Tenth_Count;//1/10 second
u8 One_Sec_Count;
u8 One_Minute_Count;
u8 One_Tenth_Flag;
u8 One_Minute_Flag;
u8 One_Hour_Flag;
u8 Step_count;//record lamp on/off 次數
u8 rec_Step_On_Time[10];
u8 rec_Step_Off_Time[10];
u8 rec_Out_MOS[10];
//---------20140815-----------------
#define Out0PORT GPIOB
#define Out1PORT GPIOB
#define Out2PORT GPIOA
#define Out3PORT GPIOF
#define Out0 GPIO_PIN_6  //小TRIAC
#define Out1 GPIO_PIN_7  //大TRIAC
#define Out2 GPIO_PIN_2  //大TRIAC
#define Out3 GPIO_PIN_4  //繼電器

u8 Step_On_Time;//current step of on time
u8 Step_Off_Time;//current off time
u8 Out_MOS;//out put port define
u8 Start_Run_Flag;//start stop clear
u8 Step_On_Time_finish;//flag
u8 Step_Off_Time_finish;//flag
u8 Stop_Run_count=0;//for clear
u8 Running_Flag=0;//正在倒數
u8 Display_Change_Flag;//變換顯示步驟與時間
u8 Display_Change_count;
u8 Load_Data_flag;//first load data
u8 Alarm_flag;//alarm use
u8 Sec_alarm_flag;//alarm use
u8 Alarm_Time_count=0;//1 minutes
u8 Finish_flag=0;

void delay(unsigned int time);
void GPIOinit(void);
void tim1init(void);//匯總 TIM1
void tim1svc(void);//中斷服務程式 閃爍10倍
void KeyScan(void);
void delay(unsigned int time);
void Display(void);
void GPIOinit(void);
void tim1init(void);
void tim1svc(void);
void tim6init(void);
void tim6svc(void);
void Display_Step (u8 Step_count);//display and load data
void Display_Kyin_On_Step (void);
void Display_Kyin_Off_Step (void);
void Display_Out_MOS (void);
void Claer_All_rec(void);
void RUNning (void);
void Run_Display(void);
void Set_All_rec(void);
void Display_Step_0 (u8 Step_count);//display only
void Out_Control (void);
void Load_Data(void);
void tim5init(void);//BUZZER        only 2KHZ
void tim5svc(void);
void Alarm_Work(void);//計時結束執行alarm動作

@far @interrupt void TIM1_OVF_IRQ(void);
@far @interrupt void TIM5_OVF_IRQ(void);
@far @interrupt void TIM6_OVF_IRQ(void);


void main(void)
{
        GPIOinit();//顯示用
        tim1init();       
        tim5init();       
  tim6init();
        rim();       
        Start_Run_Flag=0;
  Set_All_rec();

        while(1)
        {
        switch(Menu)//顯示用
        {
                case 0: if(Start_Run_Flag==1) // Run_Display();//running mode display and start stop                                                       
                                                {
                                                if(Load_Data_flag==0)
                                                {
                                                        Load_Data_flag=1;
                                                        Load_Data();
                                                }
                                                RUNning ();
                                                }
                                        else
                                                {
                                                Run_Display();//--------0827
                                               
                                                }
                                                break;       
                case 1: Display_Step (Step_count);//Display_Data = Step_count;//display count number
                                                break;
                case 2:        Display_Kyin_On_Step ();//Display_Data = Step_On_Time[Step_count];
                                          break;       
                case 3:        Display_Kyin_Off_Step ();//Display_Data = Step_Off_Time[Step_count];
                                                break;
                case 4: Display_Out_MOS ();//Display_Data = Lamp_intensity_AD;//display CDS A/D value
                                          break;

                default:break;               
        }
        Out_Control ();
        Alarm_Work();
}
}

void KeyScan(void)
{
        GPIO_WriteLow(GPIOD,GPIO_PIN_2);
        GPIO_WriteLow(GPIOD,GPIO_PIN_3);
        GPIO_WriteLow(GPIOD,GPIO_PIN_4);
        GPIO_WriteLow(GPIOD,GPIO_PIN_5);       
        GPIO_Init(GPIOC,(GPIO_PIN_6|GPIO_PIN_7),GPIO_MODE_IN_PU_NO_IT);//變更 sw4 sw5 成為 input

        if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)//sw3 for step
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)
        {
                while(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0);
                Menu ++;
                if (Menu > 4)
                {
                Menu=1;//------------20140826--------- 0>>1
                Step_count+=1;
                if(Step_count > 9)//0812 10data set
                Step_count=0;               
          }
  }
}       
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)//sw1 for START KEY ----20140826----
        {
                while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0);       
        {
                Menu=0;//display to this page ----20140826----
                Start_Run_Flag=1;
                Stop_Run_count=0;
        //         Alarm_flag = 1;//----------------------alarm on
        }               
        }
}
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)//sw2 for STOP KEY ----20140826----
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)
         {
                while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0);
        {
                Menu=0;//display to this page ----20140826----
                Start_Run_Flag=0;
                Stop_Run_count++;
                 Alarm_flag =0;//----------------------alarm on
                if(Stop_Run_count==2)
                {
                                Start_Run_Flag=0;////for reload program data----0827
                                Step_count=0;//
                                Step_On_Time=rec_Step_On_Time[Step_count];//-----------
                                Step_Off_Time=rec_Step_Off_Time[Step_count];//---------
                                Out_MOS=rec_Out_MOS[Step_count];//--------0827       
                        {
                        Alarm_Time_count =0;
                        Alarm_flag=0;
                        Finish_flag=0;
                        }

                }
                if(Stop_Run_count==3)
                {
                        Claer_All_rec();
                }
        }                                       
        }
  }
//PC7 press sw4
        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)
        {
                while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0);
if(Menu==1)//----20140826----
                {               
                Step_count-=1;
                if(Step_count ==255)//0812 10data set
                Step_count=0;
                }               
               
               
                if(Menu==2)
                {
                //        Step_On_Time=Step_On_Time[Step_count];
                Step_On_Time -=10;
                if(Step_On_Time > 200)//0803
                Step_On_Time=0;
                rec_Step_On_Time[Step_count] = Step_On_Time;
                }
                if(Menu==3)
                {
                //        Step_On_Time=Step_On_Time[Step_count];
                Step_Off_Time -=10;
                if(Step_Off_Time > 200)//0803
                Step_Off_Time=0;
                rec_Step_Off_Time[Step_count] = Step_Off_Time;
                }
                if(Menu==4)
                {
                //        Step_On_Time=Step_On_Time[Step_count];
                Out_MOS --;
                if(Out_MOS > 3)//0803
                Out_MOS=3;
                rec_Out_MOS[Step_count] = Out_MOS;
                }
        }       
  }       
//PC6 press sw5
        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)
        {
        delay(50);
        if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)
        {
                while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0);
  if(Menu==1)//----20140826----
                {
                Step_count+=1;
                if(Step_count > 9)//0812 10data set
                Step_count=0;
                }               
               
               
                if(Menu==2)
                {
                //        Step_On_Time=Step_On_Time[Step_count];
                Step_On_Time +=10;
                if(Step_On_Time > 99)//0803
                Step_On_Time=99;
                rec_Step_On_Time[Step_count] = Step_On_Time;
                }
                if(Menu==3)
                {
                //        Step_On_Time=Step_On_Time[Step_count];
                Step_Off_Time +=10;
                if(Step_Off_Time > 99)//0803
                Step_Off_Time=99;
                rec_Step_Off_Time[Step_count] = Step_Off_Time;
                }
                        if(Menu==4)
                {
                //        Step_On_Time=Step_On_Time[Step_count];
                Out_MOS ++;
                if(Out_MOS > 3)//0803
                Out_MOS=0;
                rec_Out_MOS[Step_count] = Out_MOS;
                }
        }       
  }
}


void delay(unsigned int time)
{
        while(time--);
}


void Display(void)
{       
        GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
        GPIO_WriteLow(GPIOE,GPIO_PIN_5);
        if(Hundreds>0)
        {
                GPIO_Write(GPIOC,pcdis[Hundreds]);
                        if(pedis[Hundreds])
                                GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
                                else
                                GPIO_WriteLow(GPIOE,GPIO_PIN_5);
                        }
                else
                {
                GPIO_Write(GPIOC,0x00);//百位消零
                GPIO_WriteLow(GPIOE,GPIO_PIN_5);//去除A節
    }
                        GPIO_Write(GPIOD,0x10);//趨動百位數
//  if(Menu==0)//電流加上小數點
//            GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//加上小數點
                        delay(500);               
                        GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
                        delay(5);

        GPIO_Write(GPIOC,pcdis[Tens]);
        if(pedis[Tens])
        GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
        else
         GPIO_WriteLow(GPIOE,GPIO_PIN_5);
                        GPIO_Write(GPIOD,0x08);//趨動十位數
//  if((Menu==1)||(Menu==2))//溫度加上小數點
//            GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//加上小數點
                        delay(500);
                        GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
                        delay(5);       

        GPIO_Write(GPIOC,pcdis[Units]);
        if(pedis[Units])//消除a節問題
        GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
        else
         GPIO_WriteLow(GPIOE,GPIO_PIN_5);
                        GPIO_Write(GPIOD,0x04);//趨動個位數
                        delay(500);
                        GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);//消除殘影
                        delay(5);       
}


void GPIOinit(void)
{
        GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
        GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 3DIGIT
        GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY SEGMENT A
        GPIO_WriteLow(GPIOE,GPIO_PIN_5);
        GPIO_Init(GPIOA,GPIO_PIN_1|GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT +/- TIME SW1 SW2
        GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT + FIRE POWER SW3
        GPIO_Init(Out0PORT,Out0,GPIO_MODE_OUT_PP_HIGH_FAST);//小TRIAC
        GPIO_Init(Out1PORT,Out1,GPIO_MODE_OUT_PP_HIGH_FAST);//大TRIAC
        GPIO_Init(Out2PORT,Out2,GPIO_MODE_OUT_PP_HIGH_FAST);//大TRIAC
        GPIO_Init(Out3PORT,Out3,GPIO_MODE_OUT_PP_HIGH_FAST);//繼電器
       
        GPIO_Init(GPIOD,BUZZER,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
        }


void tim1init(void)//1秒1計數
{
TIM1_TimeBaseInit(19,TIM1_COUNTERMODE_UP,10000,0);//2M/20=100khz 除10000次=10hz
TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);
TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE);
TIM1_Cmd(ENABLE);
}

void tim1svc(void)//1/10秒1計數
{
        //-------1/10 秒 作一次的工作 One_Tenth_Flag --> AD轉換
  //-------1秒 作一次的工作 One_Sec_Flag --> 計秒 PWM 開關
        //-------1分鐘作一次的工作 One_Minute_Flag --> 倒數計時關 斷MOS_OUTPUT        檢查日落
        //-------1小時作一次的工作 One_Hour_Flag  --> 計時
One_Tenth_Flag=1;
One_Tenth_Count++;
if(One_Tenth_Count == 10)
{
         One_Sec_Flag=1;
         Sec_alarm_flag=1;
         One_Tenth_Count=0;
         One_Sec_Count++;
         if(One_Sec_Count<3)
                {
                        Display_Change_Flag=1;
                }
         else
                {
                        Display_Change_Flag=0;         
                }
         if(One_Sec_Count == 60)//----------------60
         {
                 One_Sec_Count=0;
               
                 One_Minute_Flag=1;
                 One_Minute_Count++;
                 if(One_Minute_Count==60)
                 {
                         One_Minute_Count=0;
                         One_Hour_Flag=1;
                 }
         }
}
        TIM1_ClearFlag(TIM1_FLAG_UPDATE);
}

void tim5init(void)//BUZZER        only 2KHZ
{
TIM5_TimeBaseInit(TIM5_PRESCALER_32,250);//2M/32 count30
TIM5_SetCounter(250);
TIM5_ITConfig(TIM5_IT_UPDATE,ENABLE);
TIM5_Cmd(ENABLE);
}

void tim5svc(void)
{
//#define BUZZER GPIO_PIN_0
/*
if(Alarm_flag!=0)
{
GPIO_WriteHigh(GPIOD,BUZZER);
delay(20);
GPIO_WriteLow(GPIOD,BUZZER);
delay(1);
}

*/
        TIM5_ClearITPendingBit(TIM6_IT_UPDATE);
}


void tim6init(void)
{
        TIM6_TimeBaseInit(TIM6_PRESCALER_32,250);//TIM6_PRESCALER_8 TIM6_TimeBaseInit
        TIM6_SetCounter(250);
        TIM6_ITConfig(TIM6_IT_UPDATE,ENABLE);//2Mhz/8/250
        TIM6_Cmd(ENABLE);
}

void tim6svc(void)
{
display_time++;
if(display_time==3)
{
        if((Menu==0)&&(Running_Flag==0))
        {
        Hundreds=S;
        if(Start_Run_Flag==1)
        {
        Tens=T;
                                                GPIO_WriteHigh(Out3PORT,Out3);//RELAY OFF        ----0830---
  }
        else
        {
                Tens=P;
                                                        GPIO_WriteLow(Out3PORT,Out3);//RELAY OFF        ----0830---
        }
        Units= Step_count;
        Display();        
        }
        else
        {
        Display();
  }
  display_time=0;
  }         
count6++;
if (count6==50)//250>>25
{
KeyScan();
count6=0;
}
        TIM6_ClearITPendingBit(TIM6_IT_UPDATE);
}


void Display_Step_0 (u8 Step_count)
{
        Hundreds=S;
        if(Running_Flag==1)//-----------0826-------------
        Tens=T;
        else
        Tens=P;       
        Units= Step_count;
}
void Display_Step (u8 Step_count)
{
        Hundreds=S;
        Tens=D;
        Units= Step_count;
        Step_On_Time=rec_Step_On_Time[Step_count];
        Step_Off_Time=rec_Step_Off_Time[Step_count];
        Out_MOS=rec_Out_MOS[Step_count];
}
void Display_Kyin_On_Step (void)
{
        Hundreds= O;
        Display_Data=Step_On_Time;
        Tens=(Display_Data%100)/10;
        Units=Display_Data%10;
}

void Display_Kyin_Off_Step (void)
{
        Hundreds= F;
        Display_Data=Step_Off_Time;
        Tens=(Display_Data%100)/10;
        Units=Display_Data%10;
}
void Display_Out_MOS (void)
{
        Hundreds=O;
        Tens=D;
        Units= Out_MOS;
}

void Claer_All_rec(void)
{
        u8 k;
        for (k=0;k<10;k++)
        {
        rec_Step_On_Time[k]=0;
        rec_Step_Off_Time[k]=0;
        rec_Out_MOS[k]=0;
        }
}

void RUNning (void)
{
                if(Start_Run_Flag==1)
        {
        if(One_Sec_Flag==1)
        {
        if(Step_On_Time!=0)
                {
                 Running_Flag=1;//---------------------
                 One_Sec_Flag=0;
                if(One_Minute_Flag==1)
                 {
                 One_Minute_Flag=0;
                 Step_On_Time--;       
           }
                                Display_Change_count++;
                                if(Display_Change_count>4)
                                Display_Change_count=0;       
                                if(        Display_Change_count<3)
                                        Display_Kyin_On_Step();
                                else                               
                                        Display_Step_0 (Step_count);       
                }
        else if(Step_Off_Time!=0)//Step_On_Time=0
                {
                        One_Sec_Flag=0;       
                        Out_MOS=0;//output off
                if(One_Minute_Flag==1)
                  {
                   One_Minute_Flag=0;
                   Step_Off_Time--;       
            }                               
                        Display_Change_count++;
                 if(Display_Change_count>4)
                          Display_Change_count=0;       
                 if(Display_Change_count<3)
                   Display_Kyin_Off_Step();
                 else
                                {
                                        Display_Step_0 (Step_count);
                                }                               
                }
        else//(Step_Off_Time & Step_On_Time)==0
                                {       
                                Step_count++;
                                Display_Step (Step_count);//--------------------------------
                                if(Step_count >9)
                                {
                                Start_Run_Flag=0;
                                Step_count=0;
                                Step_On_Time=rec_Step_On_Time[Step_count];//-----------
                                Step_Off_Time=rec_Step_Off_Time[Step_count];//---------
                                Out_MOS=rec_Out_MOS[Step_count];//--------0827       
                                        GPIO_WriteLow(Out3PORT,Out3);//RELAY OFF        ----0830---                       
                                Finish_flag=1;
                                }
                                else
                                {
                                Step_On_Time=rec_Step_On_Time[Step_count];
                                Step_Off_Time=rec_Step_Off_Time[Step_count];
                                Out_MOS=rec_Out_MOS[Step_count];        //
                                }
                          }
                }
        }
}
//        }

void Run_Display(void)
{
        if(Start_Run_Flag ==1)
        {
        Hundreds=S;
        Tens=T;
        Units= Step_count;
  }
        else
        {
        Hundreds=S;
        Tens=P;
        Units= Step_count;
        }
}

void Set_All_rec(void)
{
        u8 k;
        for (k=0;k<10;k++)
        {
        rec_Step_On_Time[k]=30;
        rec_Step_Off_Time[k]=20;
        rec_Out_MOS[k]=0;
        }
}

void Out_Control (void)
{
        switch(Out_MOS)
        {
                case 0: GPIO_WriteLow(Out0PORT,Out0);
                                                GPIO_WriteLow(Out1PORT,Out1);
                                                GPIO_WriteLow(Out2PORT,Out2);
                                          GPIO_WriteLow(Out3PORT,Out3);//RELAY OFF
                                                break;
                case 1: GPIO_WriteHigh(Out0PORT,Out0);
                                                GPIO_WriteLow(Out1PORT,Out1);
                                                GPIO_WriteLow(Out2PORT,Out2);
                                    GPIO_WriteHigh(Out3PORT,Out3);
                                                break;
                case 2: GPIO_WriteLow(Out0PORT,Out0);
                                                GPIO_WriteHigh(Out1PORT,Out1);
                                                GPIO_WriteLow(Out2PORT,Out2);
                                          GPIO_WriteHigh(Out3PORT,Out3);
                                                break;
                case 3: GPIO_WriteLow(Out0PORT,Out0);
                                                GPIO_WriteLow(Out1PORT,Out1);
                                                GPIO_WriteHigh(Out2PORT,Out2);
                                          GPIO_WriteHigh(Out3PORT,Out3);
                                                break;
                default: break;
        }
}

void Load_Data(void)
{
//        u8 z;
//        for(z=0;z<10;Z++)
        {
                Step_count=0;
                                Step_On_Time=rec_Step_On_Time[Step_count];
                                Step_Off_Time=rec_Step_Off_Time[Step_count];
                                Out_MOS=rec_Out_MOS[Step_count];        //
        }
       
}
void Alarm_Work(void)
{
                if(Finish_flag==1)//alarm function
        {
                Alarm_flag=1;
                if(Sec_alarm_flag==1)
                {
                        Sec_alarm_flag=0;                       
                 Alarm_Time_count++;
          }
                if(Alarm_Time_count ==20)
                {
                        Alarm_Time_count =0;
                        Alarm_flag=0;
                        Finish_flag=0;
                }
        }
        if(Alarm_flag!=0)
{
GPIO_WriteLow(GPIOD,BUZZER);
delay(30);
GPIO_WriteHigh(GPIOD,BUZZER);
delay(30);
}
}


//--------------------------------------------------------------------------
@far @interrupt void TIM1_OVF_IRQ(void)
{
        tim1svc();
}

@far @interrupt void TIM5_OVF_IRQ(void)
{
        tim5svc();
}



@far @interrupt void TIM6_OVF_IRQ(void)
{
        tim6svc();
}



#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

評分

13

查看全部評分

發表於 2014-8-31 20:19:01 | 顯示全部樓層
強大Rn_127|
發表於 2014-8-31 20:33:36 | 顯示全部樓層
雖然看不懂, 學不會, 但還是要給滿分. 感謝分享.
發表於 2014-8-31 21:14:07 | 顯示全部樓層
阿乾大:
沒有飯,只有菜,是米變貴了嗎?
發表於 2014-9-1 00:29:53 | 顯示全部樓層
這種定時的裝置,總是令我想到電影的情節。~倒時計時拆彈~
 樓主| 發表於 2014-9-1 01:30:17 | 顯示全部樓層
scottwang 發表於 2014-8-31 09:14 PM static/image/common/back.gif
阿乾大:
沒有飯,只有菜,是米變貴了嗎?

scottwang大:
   小弟魯鈍 無法體會!! 外殼還沒完全做好!!
 樓主| 發表於 2014-9-1 01:37:12 | 顯示全部樓層
單晶片微電腦 發表於 2014-9-1 12:29 AM static/image/common/back.gif
這種定時的裝置,總是令我想到電影的情節。~倒時計時拆彈~

單晶片微電腦大:
   我沒這麼高竿啦!! 幾年前那時候剛學C語言,只會作單一計時器,一值想做一個多段計時器給電扇,吹半小時停十分鐘,再吹半小時然後停20分鐘...這樣就不會半夜熱醒來,也不會吹久了感冒... 有需求就會有創作!!
發表於 2014-9-1 01:46:19 | 顯示全部樓層
這個太高深了!!
發表於 2014-9-1 07:08:50 | 顯示全部樓層
antlu 發表於 2014-9-1 01:30 AM static/image/common/back.gif
scottwang大:
   小弟魯鈍 無法體會!! 外殼還沒完全做好!!

談到uC,不能只說單一種,它們是連體嬰.
沒有看到硬體電路或連結啦.

7SegDspNumAndEng-01.gif

評分

2

查看全部評分

發表於 2014-9-1 11:51:17 | 顯示全部樓層
報告~

建議程式 PO上來時,利用底下的設定,讓程式與文字分開~

2014-09-01_114858.png
  1. Code Blcok
複製代碼
發表於 2014-9-1 16:00:14 | 顯示全部樓層
antlu大我看到您這一長串的程式,本來想敗Arduino來玩,又怯步了n_071|
發表於 2014-9-1 16:22:11 | 顯示全部樓層
Dave 發表於 2014-9-1 04:00 PM static/image/common/back.gif
antlu大我看到您這一長串的程式,本來想敗Arduino來玩,又怯步了

阿乾兄這個是stm8不是arduino喔!
發表於 2014-9-1 16:36:00 | 顯示全部樓層
Dave 發表於 2014-9-1 04:00 PM static/image/common/back.gif
antlu大我看到您這一長串的程式,本來想敗Arduino來玩,又怯步了

報告 Dave大 ,

不要怕,antlu寫的東西,會讓人覺得天馬行空無限的............不知如何下手,不要讓他影響了你。
另外,歡迎加入 Arduino 玩玩,先敗一塊 Arduino UNO 來玩玩~很有趣的。
大胖跟阿舍等你加入一起玩喔  ^^
發表於 2014-9-1 17:14:56 | 顯示全部樓層
Dave 發表於 2014-9-1 04:00 PM static/image/common/back.gif
antlu大我看到您這一長串的程式,本來想敗Arduino來玩,又怯步了

Dave大大:

Arduino....簡單多了....
本來我是跟著阿乾師傅的腳步...學8051.....但是老灰狼太笨了....程式看不懂....

後來jojoling老師來了....教我改玩Arduino.....
您看看....jojoling老師才來多久....我就做出一個...cube4光立方(雖然只是個套件)....
我連去年那個3D RGB LED ---PART 1....都給它玩出來了.....
趕快加入吧!!!.....有jojoling老師在.....不怕沒人可請教.....


發表於 2014-9-1 17:25:20 | 顯示全部樓層
其實寫程式都跟作者的思緒有關。
就像大家在看 wish大寫的維修文簡單易懂,但同樣的事情在不同人身上就會是不同的感覺。
如果你是一個事事都用最簡單的方法解決的話,我相信寫出來的程式,也會變成簡單又易懂。

發表於 2014-9-1 18:37:25 | 顯示全部樓層
Dave 發表於 2014-9-1 04:00 PM static/image/common/back.gif
antlu大我看到您這一長串的程式,本來想敗Arduino來玩,又怯步了

你曾經也不會走路,不認識路.
你曾經也不會注音,不會寫字.
你曾經也不會發音,不會講話.
你曾經也不會讀書,不懂英文.
你曾經也不會電腦,不會網路.
你曾經也不會電子,不懂論壇.

你曾經也不會聊天,現在卻常看到你的身影.
那麼多的曾經你不會的,現在都會了,說 ... 你還有什麼好怕的.

 樓主| 發表於 2014-9-1 19:51:35 | 顯示全部樓層
scottwang 發表於 2014-9-1 07:08 AM static/image/common/back.gif
談到uC,不能只說單一種,它們是連體嬰.
沒有看到硬體電路或連結啦.

scottwang大:
  我的電路圖先前已經PO過了!!就是黑晶爐的全部線路!!
 樓主| 發表於 2014-9-1 19:53:13 | 顯示全部樓層
jojoling 發表於 2014-9-1 11:51 AM static/image/common/back.gif
報告~

建議程式 PO上來時,利用底下的設定,讓程式與文字分開~

JOJOLING大:
   抱歉!沒用過!! 要向您請教了!!
 樓主| 發表於 2014-9-1 19:55:39 | 顯示全部樓層
本帖最後由 antlu 於 2014-9-1 07:56 PM 編輯

感謝JOJOLING大的教導!!
  1. /*
  2. 20140826更新程式更為人性化
  3. sw1 啟動計時器 sw2暫停計時器 停止計時器步驟從零開始 程式內容歸零
  4. sw3 步驟更改
  5. sw4 步驟內容更改+10
  6. sw5 步驟內容更改-10

  7. 20140815新程式需求多組時間控制的定時器
  8.   10組設定
  9.         on/off 時間以10分為計數
  10.         輸出分為 0 1 2 3 只選其一配合黑晶爐輸出
  11.        
  12.         按鍵 sw3 選定步驟(SW1 SW2 -/+步驟) --> on時間(SW1 SW2 -/+10分鐘內定30分)  --> OFF時間(SW1 SW2 -/+10分鐘) --> 輸出(SW1 SW2 -/+輸出內定3)
  13. 按鍵 sw4 start sw5 stop 按下兩次從頭開始,若sw5 連續按鍵3次則全部清除為0  輸出全部都off
  14.        
  15.         顯示 ST0~ST9 SP0~SP9  按下sw3進行步驟(輸出停止) 若在該步驟按下sw4則進行啟動(進行程序) 按下sw5 則停止(不再進行)
  16.        
  17.         顯示A -->S, B -->T, C -->P, D--> -,E--> O,F--> F
  18. PB6--pin3 小TRIAC
  19. PB7--pin4 大TRIAC
  20. PA2--pin5 大TRIAC
  21. PF4--pin6 繼電器

  22. BUZZER FREQ 2khz ON 250uS OFF 250uS
  23. 0830增加警報功能以及按停時候停止輸出
  24. */

  25. #include "stm8s.h"
  26. #include "stm8s_tim1.h"
  27. #include "stm8s_tim5.h"
  28. #include "stm8s_tim6.h"
  29. #include "stm8s_adc1.h"
  30. #define S 10
  31. #define T 11
  32. #define P 12
  33. #define D 13
  34. #define O 14
  35. #define F 15
  36. #define BUZZER GPIO_PIN_0
  37. u8 pcdis[]={0xd6,0x14,0xcc,0x5c,0x1e,0x5a,0xda,0x14,0xde,0x5e,0x52,0xca,0x8e,0x08,0xd8,0x8a};//定義pc port 顯示的值
  38. u8 pedis[]={0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x00,0x01};//定義pe port 顯示的值對應于7段顯示
  39. // 增加了stpdop等字段

  40. u8 Hundreds,Tens,Units;//顯示百位十位個位
  41. u16 Display_Data;//
  42. u8 count6;//timer 6
  43. u8 display_time;//interrupt for display
  44. u8 Menu=0;//菜單選擇按鍵
  45. u8 One_Sec_Flag;
  46. u8 One_Tenth_Count;//1/10 second
  47. u8 One_Sec_Count;
  48. u8 One_Minute_Count;
  49. u8 One_Tenth_Flag;
  50. u8 One_Minute_Flag;
  51. u8 One_Hour_Flag;
  52. u8 Step_count;//record lamp on/off 次數
  53. u8 rec_Step_On_Time[10];
  54. u8 rec_Step_Off_Time[10];
  55. u8 rec_Out_MOS[10];
  56. //---------20140815-----------------
  57. #define Out0PORT GPIOB
  58. #define Out1PORT GPIOB
  59. #define Out2PORT GPIOA
  60. #define Out3PORT GPIOF
  61. #define Out0 GPIO_PIN_6  //小TRIAC
  62. #define Out1 GPIO_PIN_7  //大TRIAC
  63. #define Out2 GPIO_PIN_2  //大TRIAC
  64. #define Out3 GPIO_PIN_4  //繼電器

  65. u8 Step_On_Time;//current step of on time
  66. u8 Step_Off_Time;//current off time
  67. u8 Out_MOS;//out put port define
  68. u8 Start_Run_Flag;//start stop clear
  69. u8 Step_On_Time_finish;//flag
  70. u8 Step_Off_Time_finish;//flag
  71. u8 Stop_Run_count=0;//for clear
  72. u8 Running_Flag=0;//正在倒數
  73. u8 Display_Change_Flag;//變換顯示步驟與時間
  74. u8 Display_Change_count;
  75. u8 Load_Data_flag;//first load data
  76. u8 Alarm_flag;//alarm use
  77. u8 Sec_alarm_flag;//alarm use
  78. u8 Alarm_Time_count=0;//1 minutes
  79. u8 Finish_flag=0;

  80. void delay(unsigned int time);
  81. void GPIOinit(void);
  82. void tim1init(void);//匯總 TIM1
  83. void tim1svc(void);//中斷服務程式 閃爍10倍
  84. void KeyScan(void);
  85. void delay(unsigned int time);
  86. void Display(void);
  87. void GPIOinit(void);
  88. void tim1init(void);
  89. void tim1svc(void);
  90. void tim6init(void);
  91. void tim6svc(void);
  92. void Display_Step (u8 Step_count);//display and load data
  93. void Display_Kyin_On_Step (void);
  94. void Display_Kyin_Off_Step (void);
  95. void Display_Out_MOS (void);
  96. void Claer_All_rec(void);
  97. void RUNning (void);
  98. void Run_Display(void);
  99. void Set_All_rec(void);
  100. void Display_Step_0 (u8 Step_count);//display only
  101. void Out_Control (void);
  102. void Load_Data(void);
  103. void tim5init(void);//BUZZER        only 2KHZ
  104. void tim5svc(void);
  105. void Alarm_Work(void);//計時結束執行alarm動作

  106. @far @interrupt void TIM1_OVF_IRQ(void);
  107. @far @interrupt void TIM5_OVF_IRQ(void);
  108. @far @interrupt void TIM6_OVF_IRQ(void);


  109. void main(void)
  110. {
  111.         GPIOinit();//顯示用
  112.         tim1init();       
  113.         tim5init();       
  114.   tim6init();
  115.         rim();       
  116.         Start_Run_Flag=0;
  117.   Set_All_rec();

  118.         while(1)
  119.         {
  120.         switch(Menu)//顯示用
  121.         {
  122.                 case 0: if(Start_Run_Flag==1) // Run_Display();//running mode display and start stop                                                       
  123.                                                 {
  124.                                                 if(Load_Data_flag==0)
  125.                                                 {
  126.                                                         Load_Data_flag=1;
  127.                                                         Load_Data();
  128.                                                 }
  129.                                                 RUNning ();
  130.                                                 }
  131.                                         else
  132.                                                 {
  133.                                                 Run_Display();//--------0827
  134.                                                
  135.                                                 }
  136.                                                 break;       
  137.                 case 1: Display_Step (Step_count);//Display_Data = Step_count;//display count number
  138.                                                 break;
  139.                 case 2:        Display_Kyin_On_Step ();//Display_Data = Step_On_Time[Step_count];
  140.                                           break;       
  141.                 case 3:        Display_Kyin_Off_Step ();//Display_Data = Step_Off_Time[Step_count];
  142.                                                 break;
  143.                 case 4: Display_Out_MOS ();//Display_Data = Lamp_intensity_AD;//display CDS A/D value
  144.                                           break;

  145.                 default:break;               
  146.         }
  147.         Out_Control ();
  148.         Alarm_Work();
  149. }
  150. }

  151. void KeyScan(void)
  152. {
  153.         GPIO_WriteLow(GPIOD,GPIO_PIN_2);
  154.         GPIO_WriteLow(GPIOD,GPIO_PIN_3);
  155.         GPIO_WriteLow(GPIOD,GPIO_PIN_4);
  156.         GPIO_WriteLow(GPIOD,GPIO_PIN_5);       
  157.         GPIO_Init(GPIOC,(GPIO_PIN_6|GPIO_PIN_7),GPIO_MODE_IN_PU_NO_IT);//變更 sw4 sw5 成為 input

  158.         if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)//sw3 for step
  159.         {
  160.         delay(50);
  161.         if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)
  162.         {
  163.                 while(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0);
  164.                 Menu ++;
  165.                 if (Menu > 4)
  166.                 {
  167.                 Menu=1;//------------20140826--------- 0>>1
  168.                 Step_count+=1;
  169.                 if(Step_count > 9)//0812 10data set
  170.                 Step_count=0;               
  171.           }
  172.   }
  173. }       
  174.         if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)
  175.         {
  176.         delay(50);
  177.         if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)//sw1 for START KEY ----20140826----
  178.         {
  179.                 while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0);       
  180.         {
  181.                 Menu=0;//display to this page ----20140826----
  182.                 Start_Run_Flag=1;
  183.                 Stop_Run_count=0;
  184.         //         Alarm_flag = 1;//----------------------alarm on
  185.         }               
  186.         }
  187. }
  188.         if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)//sw2 for STOP KEY ----20140826----
  189.         {
  190.         delay(50);
  191.         if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)
  192.          {
  193.                 while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0);
  194.         {
  195.                 Menu=0;//display to this page ----20140826----
  196.                 Start_Run_Flag=0;
  197.                 Stop_Run_count++;
  198.                  Alarm_flag =0;//----------------------alarm on
  199.                 if(Stop_Run_count==2)
  200.                 {
  201.                                 Start_Run_Flag=0;////for reload program data----0827
  202.                                 Step_count=0;//
  203.                                 Step_On_Time=rec_Step_On_Time[Step_count];//-----------
  204.                                 Step_Off_Time=rec_Step_Off_Time[Step_count];//---------
  205.                                 Out_MOS=rec_Out_MOS[Step_count];//--------0827       
  206.                         {
  207.                         Alarm_Time_count =0;
  208.                         Alarm_flag=0;
  209.                         Finish_flag=0;
  210.                         }

  211.                 }
  212.                 if(Stop_Run_count==3)
  213.                 {
  214.                         Claer_All_rec();
  215.                 }
  216.         }                                       
  217.         }
  218.   }
  219. //PC7 press sw4
  220.         if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)
  221.         {
  222.         delay(50);
  223.         if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)
  224.         {
  225.                 while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0);
  226. if(Menu==1)//----20140826----
  227.                 {               
  228.                 Step_count-=1;
  229.                 if(Step_count ==255)//0812 10data set
  230.                 Step_count=0;
  231.                 }               
  232.                
  233.                
  234.                 if(Menu==2)
  235.                 {
  236.                 //        Step_On_Time=Step_On_Time[Step_count];
  237.                 Step_On_Time -=10;
  238.                 if(Step_On_Time > 200)//0803
  239.                 Step_On_Time=0;
  240.                 rec_Step_On_Time[Step_count] = Step_On_Time;
  241.                 }
  242.                 if(Menu==3)
  243.                 {
  244.                 //        Step_On_Time=Step_On_Time[Step_count];
  245.                 Step_Off_Time -=10;
  246.                 if(Step_Off_Time > 200)//0803
  247.                 Step_Off_Time=0;
  248.                 rec_Step_Off_Time[Step_count] = Step_Off_Time;
  249.                 }
  250.                 if(Menu==4)
  251.                 {
  252.                 //        Step_On_Time=Step_On_Time[Step_count];
  253.                 Out_MOS --;
  254.                 if(Out_MOS > 3)//0803
  255.                 Out_MOS=3;
  256.                 rec_Out_MOS[Step_count] = Out_MOS;
  257.                 }
  258.         }       
  259.   }       
  260. //PC6 press sw5
  261.         if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)
  262.         {
  263.         delay(50);
  264.         if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)
  265.         {
  266.                 while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0);
  267.   if(Menu==1)//----20140826----
  268.                 {
  269.                 Step_count+=1;
  270.                 if(Step_count > 9)//0812 10data set
  271.                 Step_count=0;
  272.                 }               
  273.                
  274.                
  275.                 if(Menu==2)
  276.                 {
  277.                 //        Step_On_Time=Step_On_Time[Step_count];
  278.                 Step_On_Time +=10;
  279.                 if(Step_On_Time > 99)//0803
  280.                 Step_On_Time=99;
  281.                 rec_Step_On_Time[Step_count] = Step_On_Time;
  282.                 }
  283.                 if(Menu==3)
  284.                 {
  285.                 //        Step_On_Time=Step_On_Time[Step_count];
  286.                 Step_Off_Time +=10;
  287.                 if(Step_Off_Time > 99)//0803
  288.                 Step_Off_Time=99;
  289.                 rec_Step_Off_Time[Step_count] = Step_Off_Time;
  290.                 }
  291.                         if(Menu==4)
  292.                 {
  293.                 //        Step_On_Time=Step_On_Time[Step_count];
  294.                 Out_MOS ++;
  295.                 if(Out_MOS > 3)//0803
  296.                 Out_MOS=0;
  297.                 rec_Out_MOS[Step_count] = Out_MOS;
  298.                 }
  299.         }       
  300.   }
  301. }


  302. void delay(unsigned int time)
  303. {
  304.         while(time--);
  305. }


  306. void Display(void)
  307. {       
  308.         GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
  309.         GPIO_WriteLow(GPIOE,GPIO_PIN_5);
  310.         if(Hundreds>0)
  311.         {
  312.                 GPIO_Write(GPIOC,pcdis[Hundreds]);
  313.                         if(pedis[Hundreds])
  314.                                 GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
  315.                                 else
  316.                                 GPIO_WriteLow(GPIOE,GPIO_PIN_5);
  317.                         }
  318.                 else
  319.                 {
  320.                 GPIO_Write(GPIOC,0x00);//百位消零
  321.                 GPIO_WriteLow(GPIOE,GPIO_PIN_5);//去除A節
  322.     }
  323.                         GPIO_Write(GPIOD,0x10);//趨動百位數
  324. //  if(Menu==0)//電流加上小數點
  325. //            GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//加上小數點
  326.                         delay(500);               
  327.                         GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
  328.                         delay(5);

  329.         GPIO_Write(GPIOC,pcdis[Tens]);
  330.         if(pedis[Tens])
  331.         GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
  332.         else
  333.          GPIO_WriteLow(GPIOE,GPIO_PIN_5);
  334.                         GPIO_Write(GPIOD,0x08);//趨動十位數
  335. //  if((Menu==1)||(Menu==2))//溫度加上小數點
  336. //            GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//加上小數點
  337.                         delay(500);
  338.                         GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
  339.                         delay(5);       

  340.         GPIO_Write(GPIOC,pcdis[Units]);
  341.         if(pedis[Units])//消除a節問題
  342.         GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
  343.         else
  344.          GPIO_WriteLow(GPIOE,GPIO_PIN_5);
  345.                         GPIO_Write(GPIOD,0x04);//趨動個位數
  346.                         delay(500);
  347.                         GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);//消除殘影
  348.                         delay(5);       
  349. }


  350. void GPIOinit(void)
  351. {
  352.         GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
  353.         GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 3DIGIT
  354.         GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY SEGMENT A
  355.         GPIO_WriteLow(GPIOE,GPIO_PIN_5);
  356.         GPIO_Init(GPIOA,GPIO_PIN_1|GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT +/- TIME SW1 SW2
  357.         GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT + FIRE POWER SW3
  358.         GPIO_Init(Out0PORT,Out0,GPIO_MODE_OUT_PP_HIGH_FAST);//小TRIAC
  359.         GPIO_Init(Out1PORT,Out1,GPIO_MODE_OUT_PP_HIGH_FAST);//大TRIAC
  360.         GPIO_Init(Out2PORT,Out2,GPIO_MODE_OUT_PP_HIGH_FAST);//大TRIAC
  361.         GPIO_Init(Out3PORT,Out3,GPIO_MODE_OUT_PP_HIGH_FAST);//繼電器
  362.        
  363.         GPIO_Init(GPIOD,BUZZER,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY 7SEGMENT
  364.         }


  365. void tim1init(void)//1秒1計數
  366. {
  367. TIM1_TimeBaseInit(19,TIM1_COUNTERMODE_UP,10000,0);//2M/20=100khz 除10000次=10hz
  368. TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);
  369. TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE);
  370. TIM1_Cmd(ENABLE);
  371. }

  372. void tim1svc(void)//1/10秒1計數
  373. {
  374.         //-------1/10 秒 作一次的工作 One_Tenth_Flag --> AD轉換
  375.   //-------1秒 作一次的工作 One_Sec_Flag --> 計秒 PWM 開關
  376.         //-------1分鐘作一次的工作 One_Minute_Flag --> 倒數計時關 斷MOS_OUTPUT        檢查日落
  377.         //-------1小時作一次的工作 One_Hour_Flag  --> 計時
  378. One_Tenth_Flag=1;
  379. One_Tenth_Count++;
  380. if(One_Tenth_Count == 10)
  381. {
  382.          One_Sec_Flag=1;
  383.          Sec_alarm_flag=1;
  384.          One_Tenth_Count=0;
  385.          One_Sec_Count++;
  386.          if(One_Sec_Count<3)
  387.                 {
  388.                         Display_Change_Flag=1;
  389.                 }
  390.          else
  391.                 {
  392.                         Display_Change_Flag=0;         
  393.                 }
  394.          if(One_Sec_Count == 60)//----------------60
  395.          {
  396.                  One_Sec_Count=0;
  397.                
  398.                  One_Minute_Flag=1;
  399.                  One_Minute_Count++;
  400.                  if(One_Minute_Count==60)
  401.                  {
  402.                          One_Minute_Count=0;
  403.                          One_Hour_Flag=1;
  404.                  }
  405.          }
  406. }
  407.         TIM1_ClearFlag(TIM1_FLAG_UPDATE);
  408. }

  409. void tim5init(void)//BUZZER        only 2KHZ
  410. {
  411. TIM5_TimeBaseInit(TIM5_PRESCALER_32,250);//2M/32 count30
  412. TIM5_SetCounter(250);
  413. TIM5_ITConfig(TIM5_IT_UPDATE,ENABLE);
  414. TIM5_Cmd(ENABLE);
  415. }

  416. void tim5svc(void)
  417. {
  418. //#define BUZZER GPIO_PIN_0
  419. /*
  420. if(Alarm_flag!=0)
  421. {
  422. GPIO_WriteHigh(GPIOD,BUZZER);
  423. delay(20);
  424. GPIO_WriteLow(GPIOD,BUZZER);
  425. delay(1);
  426. }

  427. */
  428.         TIM5_ClearITPendingBit(TIM6_IT_UPDATE);
  429. }


  430. void tim6init(void)
  431. {
  432.         TIM6_TimeBaseInit(TIM6_PRESCALER_32,250);//TIM6_PRESCALER_8 TIM6_TimeBaseInit
  433.         TIM6_SetCounter(250);
  434.         TIM6_ITConfig(TIM6_IT_UPDATE,ENABLE);//2Mhz/8/250
  435.         TIM6_Cmd(ENABLE);
  436. }

  437. void tim6svc(void)
  438. {
  439. display_time++;
  440. if(display_time==3)
  441. {
  442.         if((Menu==0)&&(Running_Flag==0))
  443.         {
  444.         Hundreds=S;
  445.         if(Start_Run_Flag==1)
  446.         {
  447.         Tens=T;
  448.                                                 GPIO_WriteHigh(Out3PORT,Out3);//RELAY OFF        ----0830---
  449.   }
  450.         else
  451.         {
  452.                 Tens=P;
  453.                                                         GPIO_WriteLow(Out3PORT,Out3);//RELAY OFF        ----0830---
  454.         }
  455.         Units= Step_count;
  456.         Display();        
  457.         }
  458.         else
  459.         {
  460.         Display();
  461.   }
  462.   display_time=0;
  463.   }         
  464. count6++;
  465. if (count6==50)//250>>25
  466. {
  467. KeyScan();
  468. count6=0;
  469. }
  470.         TIM6_ClearITPendingBit(TIM6_IT_UPDATE);
  471. }


  472. void Display_Step_0 (u8 Step_count)
  473. {
  474.         Hundreds=S;
  475.         if(Running_Flag==1)//-----------0826-------------
  476.         Tens=T;
  477.         else
  478.         Tens=P;       
  479.         Units= Step_count;
  480. }
  481. void Display_Step (u8 Step_count)
  482. {
  483.         Hundreds=S;
  484.         Tens=D;
  485.         Units= Step_count;
  486.         Step_On_Time=rec_Step_On_Time[Step_count];
  487.         Step_Off_Time=rec_Step_Off_Time[Step_count];
  488.         Out_MOS=rec_Out_MOS[Step_count];
  489. }
  490. void Display_Kyin_On_Step (void)
  491. {
  492.         Hundreds= O;
  493.         Display_Data=Step_On_Time;
  494.         Tens=(Display_Data%100)/10;
  495.         Units=Display_Data%10;
  496. }

  497. void Display_Kyin_Off_Step (void)
  498. {
  499.         Hundreds= F;
  500.         Display_Data=Step_Off_Time;
  501.         Tens=(Display_Data%100)/10;
  502.         Units=Display_Data%10;
  503. }
  504. void Display_Out_MOS (void)
  505. {
  506.         Hundreds=O;
  507.         Tens=D;
  508.         Units= Out_MOS;
  509. }

  510. void Claer_All_rec(void)
  511. {
  512.         u8 k;
  513.         for (k=0;k<10;k++)
  514.         {
  515.         rec_Step_On_Time[k]=0;
  516.         rec_Step_Off_Time[k]=0;
  517.         rec_Out_MOS[k]=0;
  518.         }
  519. }

  520. void RUNning (void)
  521. {
  522.                 if(Start_Run_Flag==1)
  523.         {
  524.         if(One_Sec_Flag==1)
  525.         {
  526.         if(Step_On_Time!=0)
  527.                 {
  528.                  Running_Flag=1;//---------------------
  529.                  One_Sec_Flag=0;
  530.                 if(One_Minute_Flag==1)
  531.                  {
  532.                  One_Minute_Flag=0;
  533.                  Step_On_Time--;       
  534.            }
  535.                                 Display_Change_count++;
  536.                                 if(Display_Change_count>4)
  537.                                 Display_Change_count=0;       
  538.                                 if(        Display_Change_count<3)
  539.                                         Display_Kyin_On_Step();
  540.                                 else                               
  541.                                         Display_Step_0 (Step_count);       
  542.                 }
  543.         else if(Step_Off_Time!=0)//Step_On_Time=0
  544.                 {
  545.                         One_Sec_Flag=0;       
  546.                         Out_MOS=0;//output off
  547.                 if(One_Minute_Flag==1)
  548.                   {
  549.                    One_Minute_Flag=0;
  550.                    Step_Off_Time--;       
  551.             }                               
  552.                         Display_Change_count++;
  553.                  if(Display_Change_count>4)
  554.                           Display_Change_count=0;       
  555.                  if(Display_Change_count<3)
  556.                    Display_Kyin_Off_Step();
  557.                  else
  558.                                 {
  559.                                         Display_Step_0 (Step_count);
  560.                                 }                               
  561.                 }
  562.         else//(Step_Off_Time & Step_On_Time)==0
  563.                                 {       
  564.                                 Step_count++;
  565.                                 Display_Step (Step_count);//--------------------------------
  566.                                 if(Step_count >9)
  567.                                 {
  568.                                 Start_Run_Flag=0;
  569.                                 Step_count=0;
  570.                                 Step_On_Time=rec_Step_On_Time[Step_count];//-----------
  571.                                 Step_Off_Time=rec_Step_Off_Time[Step_count];//---------
  572.                                 Out_MOS=rec_Out_MOS[Step_count];//--------0827       
  573.                                         GPIO_WriteLow(Out3PORT,Out3);//RELAY OFF        ----0830---                       
  574.                                 Finish_flag=1;
  575.                                 }
  576.                                 else
  577.                                 {
  578.                                 Step_On_Time=rec_Step_On_Time[Step_count];
  579.                                 Step_Off_Time=rec_Step_Off_Time[Step_count];
  580.                                 Out_MOS=rec_Out_MOS[Step_count];        //
  581.                                 }
  582.                           }
  583.                 }
  584.         }
  585. }
  586. //        }

  587. void Run_Display(void)
  588. {
  589.         if(Start_Run_Flag ==1)
  590.         {
  591.         Hundreds=S;
  592.         Tens=T;
  593.         Units= Step_count;
  594.   }
  595.         else
  596.         {
  597.         Hundreds=S;
  598.         Tens=P;
  599.         Units= Step_count;
  600.         }
  601. }

  602. void Set_All_rec(void)
  603. {
  604.         u8 k;
  605.         for (k=0;k<10;k++)
  606.         {
  607.         rec_Step_On_Time[k]=30;
  608.         rec_Step_Off_Time[k]=20;
  609.         rec_Out_MOS[k]=0;
  610.         }
  611. }

  612. void Out_Control (void)
  613. {
  614.         switch(Out_MOS)
  615.         {
  616.                 case 0: GPIO_WriteLow(Out0PORT,Out0);
  617.                                                 GPIO_WriteLow(Out1PORT,Out1);
  618.                                                 GPIO_WriteLow(Out2PORT,Out2);
  619.                                           GPIO_WriteLow(Out3PORT,Out3);//RELAY OFF
  620.                                                 break;
  621.                 case 1: GPIO_WriteHigh(Out0PORT,Out0);
  622.                                                 GPIO_WriteLow(Out1PORT,Out1);
  623.                                                 GPIO_WriteLow(Out2PORT,Out2);
  624.                                     GPIO_WriteHigh(Out3PORT,Out3);
  625.                                                 break;
  626.                 case 2: GPIO_WriteLow(Out0PORT,Out0);
  627.                                                 GPIO_WriteHigh(Out1PORT,Out1);
  628.                                                 GPIO_WriteLow(Out2PORT,Out2);
  629.                                           GPIO_WriteHigh(Out3PORT,Out3);
  630.                                                 break;
  631.                 case 3: GPIO_WriteLow(Out0PORT,Out0);
  632.                                                 GPIO_WriteLow(Out1PORT,Out1);
  633.                                                 GPIO_WriteHigh(Out2PORT,Out2);
  634.                                           GPIO_WriteHigh(Out3PORT,Out3);
  635.                                                 break;
  636.                 default: break;
  637.         }
  638. }

  639. void Load_Data(void)
  640. {
  641. //        u8 z;
  642. //        for(z=0;z<10;Z++)
  643.         {
  644.                 Step_count=0;
  645.                                 Step_On_Time=rec_Step_On_Time[Step_count];
  646.                                 Step_Off_Time=rec_Step_Off_Time[Step_count];
  647.                                 Out_MOS=rec_Out_MOS[Step_count];        //
  648.         }
  649.        
  650. }
  651. void Alarm_Work(void)
  652. {
  653.                 if(Finish_flag==1)//alarm function
  654.         {
  655.                 Alarm_flag=1;
  656.                 if(Sec_alarm_flag==1)
  657.                 {
  658.                         Sec_alarm_flag=0;                       
  659.                  Alarm_Time_count++;
  660.           }
  661.                 if(Alarm_Time_count ==20)
  662.                 {
  663.                         Alarm_Time_count =0;
  664.                         Alarm_flag=0;
  665.                         Finish_flag=0;
  666.                 }
  667.         }
  668.         if(Alarm_flag!=0)
  669. {
  670. GPIO_WriteLow(GPIOD,BUZZER);
  671. delay(30);
  672. GPIO_WriteHigh(GPIOD,BUZZER);
  673. delay(30);
  674. }
  675. }


  676. //--------------------------------------------------------------------------
  677. @far @interrupt void TIM1_OVF_IRQ(void)
  678. {
  679.         tim1svc();
  680. }

  681. @far @interrupt void TIM5_OVF_IRQ(void)
  682. {
  683.         tim5svc();
  684. }



  685. @far @interrupt void TIM6_OVF_IRQ(void)
  686. {
  687.         tim6svc();
  688. }



  689. #ifdef USE_FULL_ASSERT

  690. /**
  691.   * @brief  Reports the name of the source file and the source line number
  692.   *   where the assert_param error has occurred.
  693.   * @param file: pointer to the source file name
  694.   * @param line: assert_param error line source number
  695.   * @retval : None
  696.   */
  697. void assert_failed(u8* file, u32 line)
  698. {
  699.   /* User can add his own implementation to report the file name and line number,
  700.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  701.   /* Infinite loop */
  702.   while (1)
  703.   {
  704.   }
  705. }
  706. #endif

  707. /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
複製代碼

評分

1

查看全部評分

發表於 2014-9-1 20:21:11 | 顯示全部樓層
antlu 發表於 2014-9-1 07:51 PM static/image/common/back.gif
scottwang大:
  我的電路圖先前已經PO過了!!就是黑晶爐的全部線路!!

貼過就用連結就好了,不然大家得找老半天.
 樓主| 發表於 2014-9-1 20:47:33 | 顯示全部樓層
Dave 發表於 2014-9-1 04:00 PM static/image/common/back.gif
antlu大我看到您這一長串的程式,本來想敗Arduino來玩,又怯步了

Dave大:
   我的程式跟老態婆的裹腳布一樣,又臭又長!! 還有以前的包袱!! 大家看看參考!!
  我的經驗是 一個變數用在時間計數上面可以用 u8 a; 也可以用 u8 Down_Time_count; 雖然程式會覺得很長,但是容易看,日後要修改也容易"回顧"... 一步一步慢慢來也還不錯!! 當然最好是有人"指點"有人"教導",正規軍馬步紮穩很重要,我是土八路要改變真的不容易!!
發表於 2014-9-1 23:57:04 | 顯示全部樓層
給你幾點建議...

1. 寫在單支檔裏的,如你現在這樣的話,請務必儘可能讓你程式開頭每隻routine 宣告的片段消失。
底下這些,都讓它消失吧,只要你把副程式重新排列一遍,它就會消失了。
  1. void delay(unsigned int time);
  2. void GPIOinit(void);
  3. void tim1init(void);//匯總 TIM1
  4. .....
  5. void Alarm_Work(void);//計時結束執行alarm動作
複製代碼
這也是你看外面的程式,常常會看到 main() 的主程式是在整個檔案的最下面。

2.你開始會學習怎麼切割程式,把所有的東西分門別類放到不同的檔案(.c)去,然後用 project 的方式來建構。
同時學會把程式的原型宣告放到 header file (.h) 去。
(1) ASSERT 移到專門的檔案去,這個對大家在讀程式時,相對印的程式,並不是特別的重要。
(2) Alarm_Work() 移去專屬檔案去,整個主程式只要知道什麼條件產生 alarm 及可,除非想去了解 alarm 的處理機制。
(3) delay()也如同(2)
(4) keyscan()也如同(2)並重新設計,重新設計成2個 routine ~
     1.  int test_key(void) => 沒按鍵回 0 or false, 有任何鍵被按,回 1 or true
     2.  int get_key(void) =>  一般程式在  test_key() 取得 1 or true,再用這個 routine 去取得目前是何種按鍵~

切到這,你會發現你的主程式自動變的簡潔了。


評分

3

查看全部評分

發表於 2014-9-2 01:08:19 | 顯示全部樓層
jojoling 發表於 2014-9-1 11:57 PM static/image/common/back.gif
給你幾點建議...

1. 寫在單支檔裏的,如你現在這樣的話,請務必儘可能讓你程式開頭每隻routine 宣告的片段 ...

變積木,開始疊疊樂.
發表於 2014-9-2 18:44:11 | 顯示全部樓層
jojoling 發表於 2014-9-1 11:57 PM static/image/common/back.gif
給你幾點建議...

1. 寫在單支檔裏的,如你現在這樣的話,請務必儘可能讓你程式開頭每隻routine 宣告的片段 ...

太強了~~~
才剛開始試著用 C 做一些基本操作~~~程式雜亂無章落落長,要多跟您學習了~~~
發表於 2014-9-2 18:47:40 | 顯示全部樓層
antlu 發表於 2014-9-1 08:47 PM static/image/common/back.gif
Dave大:
   我的程式跟老態婆的裹腳布一樣,又臭又長!! 還有以前的包袱!! 大家看看參考!!
  我的經驗是 一 ...

程式好長看的都怕了,會害我不敢碰 C 語言~~~ C 語言正在摸索中 ~~~
 樓主| 發表於 2014-9-2 19:43:53 | 顯示全部樓層
jojoling 發表於 2014-9-1 11:57 PM static/image/common/back.gif
給你幾點建議...

1. 寫在單支檔裏的,如你現在這樣的話,請務必儘可能讓你程式開頭每隻routine 宣告的片段 ...

jojoling 大:
   非常非常感謝!! 我會繼續修改!! 讓他更簡潔!!
發表於 2014-9-2 19:57:50 | 顯示全部樓層
chlu 發表於 2014-9-2 06:47 PM static/image/common/back.gif
程式好長看的都怕了,會害我不敢碰 C 語言~~~ C 語言正在摸索中 ~~~

模組化就不會了,增減程式,檢查程式都方便.
模組化就像自己在造積木一樣.
 樓主| 發表於 2014-9-2 20:03:16 | 顯示全部樓層
chlu 發表於 2014-9-2 06:44 PM static/image/common/back.gif
太強了~~~
才剛開始試著用 C 做一些基本操作~~~程式雜亂無章落落長,要多跟您學習了~~~ ...

chlu大:
   拜讀過您的大作,PIC MCU很流行,可惜我不會!! 您的無私分享是我敬佩與追求的目標,只是我底子較弱!!
  會學C 是因為對 組合語言有夢魘,也是想學個高階語言看看!! 我是一路跌跌撞撞,只是初生之犢...哈哈哈!!
   網內有很多高手可以給我們指導, JOJOLING大就很願意指導,無私分享!! LEGION大是我的啟蒙老師,還有許多網友都幫助過我,希望 C 可以讓大家對 MCU 更容易上手!!
發表於 2014-9-2 21:22:47 | 顯示全部樓層
antlu 發表於 2014-9-2 08:03 PM static/image/common/back.gif
chlu大:
   拜讀過您的大作,PIC MCU很流行,可惜我不會!! 您的無私分享是我敬佩與追求的目標,只是我底子較 ...

C不是高階的語言,算中階啦.Tiny Basic For 8051才是高階.
 樓主| 發表於 2014-9-3 00:12:36 | 顯示全部樓層
jojoling 發表於 2014-9-1 11:57 PM static/image/common/back.gif
給你幾點建議...

1. 寫在單支檔裏的,如你現在這樣的話,請務必儘可能讓你程式開頭每隻routine 宣告的片段 ...

jojoling大;

   主程式與副程式(ALARM_WORK())都使用相同的變數,這時編譯會出問題,可以解決嗎? 他會說重複定義變數...
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-12-23 01:05 PM , Processed in 0.115042 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.