欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
如何增加這個按鍵和定時的程序的功能?求幫助
[打印本頁]
作者:
匯源科技
時間:
2019-6-15 19:48
標題:
如何增加這個按鍵和定時的程序的功能?求幫助
現在程序是上電默認開機并運行了的,但想增加一些功能
增加:上電默認不開機,長按鍵KEY約2秒再開機,并運行SRL(),短按切換到SR(),只要是短按就來回切換,但任何狀態下長按開與關機
啟動后,運行1小時自動關機
#include "stc15w.h"
#include <intrins.H> //函數運算頭文件
#define uint unsigned int //宏定義變量0-6553
#define uchar unsigned char //宏定義變量0-255
#define MAIN_Fosc 11059200L //定義主時鐘
/*定義ADC參數*/
#define ADC_POWER 0x80 //ADC power control dit (宏定義ADC電源控制位)1000 0000
#define ADC_FLAG 0x10 //ADC complete flag (宏定義ADC完成標志位) 0001 0000
#define ADC_START 0x08 //ADC start control dit (宏定義ADC啟動控制位)0000 1000
#define ADC_SPEEDLL 0x00 //420 clocks (宏定義420時鐘)速度控制 0000 0000
#define ADC_SPEEDL 0x20 //280 clocks (宏定義280時鐘)速度控制 0001 0000
#define ADC_SPEEDH 0x40 //140 clocks (宏定義140時鐘)速度控制 0010 0000
#define ADC_SPEEDHH 0x60 //070 clocks (宏定義70時鐘)速度控制 0011 0000
/*定義接口*/
sbit out=P1^1; //驅動端口定義
sbit key = P2^4; //定義KEY接口
sbit ledL = P4^2; //定義低檔位接口
sbit ledH = P4^3; //定義高檔位接口
void InitADC(); //初始化ADC子程序聲明
uchar zhADC(uchar ch); //ADC 轉換子程序聲明
void delayms(uint k); //1ms延時子程序聲明
void SR(); //執行AD轉換結果子程序聲明H
void SRL(); //執行AD轉換結果子程序聲明L
uchar n = 0; //按鍵初始化
/*接口模式初始化*/
void port_mode()
{
P2M1=0x00; P2M0=0x00; // P2 P4燈和按鍵端口模式, 準雙向口0x00
P4M1=0x00; P4M0=0x00;
P1M1 = 0x01; //P1.0高阻 P1.1強推挽:0000 0001 ADC輸入高阻、繼電器強上拉
P1M0 = 0x02; //P1.0高阻 P1.1強推挽:0000 0010 ADC輸入高阻、繼電器強上拉
out=0; //驅動初始化0
}
/*void delay() //延時函數1
{
uint i, j;
for(i = 0; i < 100; i++)
for(j = 0; j < 500; j++);
}
*/
void readkey(void) //按鍵讀取函數
{
uchar i, j;
if(!key)
{
for(i = 0; i < 10; i++)
for(j = 0; j < 120; j++); //延時消抖
if(!key)
{
while(!key); //等待按鍵釋放
n++;
n %= 2; //n = 0~2
}
}
}
/*----------------------------
初始化ADC
-----------------------------*/
void InitADC()
{
P1ASF=0x01; //設置P1.0端口作為模擬輸入
ADC_RES=0; //清除以前的結果
ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //開啟ACD電源、設置轉換速度420
delayms(1); //上電延時
}
/*----------------------------
獲取ADC結果
-----------------------------*/
uchar zhADC(uchar ch) //zhADC(獲取ADC結果)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START; //啟動轉換
_nop_(); //4個時鐘延時
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待完成標志
ADC_CONTR &=~ADC_FLAG; //Close ADC(關閉ADC)
return ADC_RES; //返回ADC結果
}
/*----------------------------
1ms延時子程序(12M晶振)
-----------------------------*/
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=747;j>0;j--);
}
/*----------------------------
執行ADC轉換結果子程序SR_高檔 SRL_低檔
-----------------------------*/
void SR()
{
uchar M;
M=0x22; //TEMP=55度
if (zhADC(0)>=M) //如果ADC_1通道檢測值大于等于M
out=1; //驅動輸出1
else
out=0; //否則驅動輸出0
}
/*低溫控制*/
void SRL()
{
uchar M;
M=0x30; //TEMP=45度
if (zhADC(0)>=M) //如果ADC_1通道檢測值大于等于M
out=1; //驅動輸出1
else
out=0; //否則驅動輸出0
}
void main() //主函數
{
port_mode(); //初始化IO口
InitADC(); //Init ADC sfr (初始化ADC SFR)
while(1)
{
switch(n) //開關選擇
{
case 0: ledL = 0;readkey(); SRL(); break; //LEDL亮并執行低檔控制45度
case 1: ledH = 0;ledL = 1;readkey();SR(); break; //LEDH亮并執行高檔控制55度
}
}
}
作者:
mahonkun
時間:
2019-6-15 22:08
可以根據記錄按鍵按下的次數,以及按下的時間來做區別。具體功能我沒有看的太明白的,希望能補充說明!
作者:
wulin
時間:
2019-6-16 09:11
給你增加了加電等待,長短按鍵控制開關和高低溫,運行1小時自動關機。如果樓主沒有使用ADC硬件濾波必須再增加軟件濾波,否則繼電器在溫度臨界點會抖動。
#include <STC15F2K60S2.H>
//#include "stc15w.h"
#include <intrins.H> //函數運算頭文件
#define uint unsigned int //宏定義變量0-6553
#define uchar unsigned char //宏定義變量0-255
#define MAIN_Fosc 11059200L //定義主時鐘
#define key_S 80 //宏定義短按(約20ms)
#define key_L key_S*50 //宏定義長按(約1s)
/*定義ADC參數*/
#define ADC_POWER 0x80 //ADC power control dit (宏定義ADC電源控制位)1000 0000
#define ADC_FLAG 0x10 //ADC complete flag (宏定義ADC完成標志位) 0001 0000
#define ADC_START 0x08 //ADC start control dit (宏定義ADC啟動控制位)0000 1000
#define ADC_SPEEDLL 0x00 //420 clocks (宏定義420時鐘)速度控制 0000 0000
#define ADC_SPEEDL 0x20 //280 clocks (宏定義280時鐘)速度控制 0001 0000
#define ADC_SPEEDH 0x40 //140 clocks (宏定義140時鐘)速度控制 0010 0000
#define ADC_SPEEDHH 0x60 //070 clocks (宏定義70時鐘)速度控制 0011 0000
/*定義接口*/
sbit out=P1^1; //驅動端口定義
sbit key = P2^4; //定義KEY接口
sbit ledL = P4^2; //定義低檔位接口
sbit ledH = P4^3; //定義高檔位接口
void InitADC(); //初始化ADC子程序聲明
uchar zhADC(uchar ch); //ADC 轉換子程序聲明
void delayms(uint k); //1ms延時子程序聲明
void SR(); //執行AD轉換結果子程序聲明H
void SRL(); //執行AD轉換結果子程序聲明L
//uchar n=0; //按鍵初始化
uint Cnt250us=0,Cnt1s;//定時變量
bit ON_OFF=0; //開關位變量
bit H_L=0; //高低溫位變量
/*接口模式初始化*/
void port_mode()
{
P1M1 = 0x01; //P1.0高阻 P1.1強推挽:0000 0001 ADC輸入高阻、繼電器強上拉
P1M0 = 0x02; //P1.0高阻 P1.1強推挽:0000 0010 ADC輸入高阻、繼電器強上拉
P2M0 = 0x00; //P2 P4燈和按鍵端口模式, 準雙向口0x00
P2M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
out=0; //驅動初始化0
}
void readkey(void) //按鍵讀取函數
{
static uint count=0; //計數變量
if(!key)
{
count++;
if(count==key_L) //長按
ON_OFF=~ON_OFF; //開關機選擇
if(count>key_L) //防止count溢出
count=key_L+1;
}
else //按鍵抬起
{
if(count>key_S && count<key_L)//短按
{
if(ON_OFF==1) //開機狀態有效
H_L=~H_L; //高低溫選擇
}
count=0; //count清0
}
}
/*----------------------------
初始化ADC
-----------------------------*/
void InitADC()
{
P1ASF=0x01; //設置P1.0端口作為模擬輸入
ADC_RES=0; //清除以前的結果
ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //開啟ACD電源、設置轉換速度420
delayms(1); //上電延時
}
/*----------------------------
獲取ADC結果
-----------------------------*/
uchar zhADC(uchar ch) //zhADC(獲取ADC結果)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START; //啟動轉換
_nop_(); //4個時鐘延時
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待完成標志
ADC_CONTR &=~ADC_FLAG; //Close ADC(關閉ADC)
return ADC_RES; //返回ADC結果
}
/*----------------------------
1ms延時子程序(12M晶振)
-----------------------------*/
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=747;j>0;j--);
}
/*----------------------------
執行ADC轉換結果子程序SR_高檔 SRL_低檔
-----------------------------*/
void SR()
{
uchar M;
M=0x22; //TEMP=55度
if(zhADC(0)>=M) //如果ADC_1通道檢測值大于等于M
out=1; //驅動輸出1
else
out=0; //否則驅動輸出0
}
/*低溫控制*/
void SRL()
{
uchar M;
M=0x30; //TEMP=45度
if(zhADC(0)>=M) //如果ADC_1通道檢測值大于等于M
out=1; //驅動輸出1
else
out=0; //否則驅動輸出0
}
void Timer0Init() //250微秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0x33; //設置定時初值
TH0 = 0xF5; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
void main() //主函數
{
port_mode(); //初始化IO口
InitADC(); //Init ADC sfr (初始化ADC SFR)
Timer0Init();//初始化定時器
while(1)
{
if(TF0==1)//查詢周期250us
{
TF0=0;
readkey();//讀按鍵
if(ON_OFF==1)
{
Cnt250us++;
if(Cnt250us>=4000)
{
Cnt250us=0;
Cnt1s++;
if(Cnt1s>=3600)
{
Cnt1s =0;
ON_OFF=0;
ledH = 1;
ledL = 1;
out = 0;
}
}
if(H_L==1)
{
ledH = 0;
ledL = 1;
SR();
}
else
{
ledH = 1;
ledL = 0;
SRL();
}
}
else
{
Cnt250us=0;
Cnt1s= 0;
ledH = 1;
ledL = 1;
out = 0;
}
}
}
}
復制代碼
作者:
匯源科技
時間:
2019-6-16 10:58
wulin 發表于 2019-6-16 09:11
給你增加了加電等待,長短按鍵控制開關和高低溫,運行1小時自動關機。如果樓主沒有使用ADC硬件濾波必須再增 ...
感謝大師啊!下載運行正常。我學習學習一下先,你寫的控制效果比我的好很多啊,控溫反饋很及時。我驅動的是MOS管,所以應不用擔心反復的問題。我要的就是這種效果,控溫才能準一些。不知道什么時候才能學到PID技術那一步
作者:
匯源科技
時間:
2019-6-17 23:56
wulin 發表于 2019-6-16 09:11
給你增加了加電等待,長短按鍵控制開關和高低溫,運行1小時自動關機。如果樓主沒有使用ADC硬件濾波必須再增 ...
大師,謝謝你的幫助。你的是充分利用if else。但和我原來想的用的switch區別還是滿大的。現在想自己增加多一道M檔,增加不進去了。能再幫我增加多一道SRM(); 嗎。麻煩你了。
作者:
匯源科技
時間:
2019-7-8 11:01
經過大半個月的抽空學習和償試,已實現想要的功能。
思路就是短按時,增加n++,通過switch(n),短按就可以選擇幾種模式了。終于實現長按開關,短按換子程序了。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1