|
本帖最後由 antlu 於 2014-9-1 07:41 PM 編輯
這個電路和相片很熟悉吧!! 因為都是黑晶爐的拆機品,只是多了下面的電路板,提供5V電源和 TRIAC 繼電器,此一電路目前沒使用到 ADC部分,因為計時器好像不需要溫度這一部分!!
步驟設定
ON 時間設定 10~90~99
OFF時間設定 10~90~99
輸出選擇 OFF 1~3 選其一(當初為了給電扇的風速選擇)
開始倒數計時
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
查看全部評分
-
|