|
現(xiàn)在程序是上電默認(rèn)開機(jī)并運(yùn)行了的,但想增加一些功能
增加:上電默認(rèn)不開機(jī),長(zhǎng)按鍵KEY約2秒再開機(jī),并運(yùn)行SRL(),短按切換到SR(),只要是短按就來回切換,但任何狀態(tài)下長(zhǎng)按開與關(guān)機(jī)
啟動(dòng)后,運(yùn)行1小時(shí)自動(dòng)關(guān)機(jī)
#include "stc15w.h"
#include <intrins.H> //函數(shù)運(yùn)算頭文件
#define uint unsigned int //宏定義變量0-6553
#define uchar unsigned char //宏定義變量0-255
#define MAIN_Fosc 11059200L //定義主時(shí)鐘
/*定義ADC參數(shù)*/
#define ADC_POWER 0x80 //ADC power control dit (宏定義ADC電源控制位)1000 0000
#define ADC_FLAG 0x10 //ADC complete flag (宏定義ADC完成標(biāo)志位) 0001 0000
#define ADC_START 0x08 //ADC start control dit (宏定義ADC啟動(dòng)控制位)0000 1000
#define ADC_SPEEDLL 0x00 //420 clocks (宏定義420時(shí)鐘)速度控制 0000 0000
#define ADC_SPEEDL 0x20 //280 clocks (宏定義280時(shí)鐘)速度控制 0001 0000
#define ADC_SPEEDH 0x40 //140 clocks (宏定義140時(shí)鐘)速度控制 0010 0000
#define ADC_SPEEDHH 0x60 //070 clocks (宏定義70時(shí)鐘)速度控制 0011 0000
/*定義接口*/
sbit out=P1^1; //驅(qū)動(dòng)端口定義
sbit key = P2^4; //定義KEY接口
sbit ledL = P4^2; //定義低檔位接口
sbit ledH = P4^3; //定義高檔位接口
void InitADC(); //初始化ADC子程序聲明
uchar zhADC(uchar ch); //ADC 轉(zhuǎn)換子程序聲明
void delayms(uint k); //1ms延時(shí)子程序聲明
void SR(); //執(zhí)行AD轉(zhuǎn)換結(jié)果子程序聲明H
void SRL(); //執(zhí)行AD轉(zhuǎn)換結(jié)果子程序聲明L
uchar n = 0; //按鍵初始化
/*接口模式初始化*/
void port_mode()
{
P2M1=0x00; P2M0=0x00; // P2 P4燈和按鍵端口模式, 準(zhǔn)雙向口0x00
P4M1=0x00; P4M0=0x00;
P1M1 = 0x01; //P1.0高阻 P1.1強(qiáng)推挽:0000 0001 ADC輸入高阻、繼電器強(qiáng)上拉
P1M0 = 0x02; //P1.0高阻 P1.1強(qiáng)推挽:0000 0010 ADC輸入高阻、繼電器強(qiáng)上拉
out=0; //驅(qū)動(dòng)初始化0
}
/*void delay() //延時(shí)函數(shù)1
{
uint i, j;
for(i = 0; i < 100; i++)
for(j = 0; j < 500; j++);
}
*/
void readkey(void) //按鍵讀取函數(shù)
{
uchar i, j;
if(!key)
{
for(i = 0; i < 10; i++)
for(j = 0; j < 120; j++); //延時(shí)消抖
if(!key)
{
while(!key); //等待按鍵釋放
n++;
n %= 2; //n = 0~2
}
}
}
/*----------------------------
初始化ADC
-----------------------------*/
void InitADC()
{
P1ASF=0x01; //設(shè)置P1.0端口作為模擬輸入
ADC_RES=0; //清除以前的結(jié)果
ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //開啟ACD電源、設(shè)置轉(zhuǎn)換速度420
delayms(1); //上電延時(shí)
}
/*----------------------------
獲取ADC結(jié)果
-----------------------------*/
uchar zhADC(uchar ch) //zhADC(獲取ADC結(jié)果)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START; //啟動(dòng)轉(zhuǎn)換
_nop_(); //4個(gè)時(shí)鐘延時(shí)
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待完成標(biāo)志
ADC_CONTR &=~ADC_FLAG; //Close ADC(關(guān)閉ADC)
return ADC_RES; //返回ADC結(jié)果
}
/*----------------------------
1ms延時(shí)子程序(12M晶振)
-----------------------------*/
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=747;j>0;j--);
}
/*----------------------------
執(zhí)行ADC轉(zhuǎn)換結(jié)果子程序SR_高檔 SRL_低檔
-----------------------------*/
void SR()
{
uchar M;
M=0x22; //TEMP=55度
if (zhADC(0)>=M) //如果ADC_1通道檢測(cè)值大于等于M
out=1; //驅(qū)動(dòng)輸出1
else
out=0; //否則驅(qū)動(dòng)輸出0
}
/*低溫控制*/
void SRL()
{
uchar M;
M=0x30; //TEMP=45度
if (zhADC(0)>=M) //如果ADC_1通道檢測(cè)值大于等于M
out=1; //驅(qū)動(dòng)輸出1
else
out=0; //否則驅(qū)動(dòng)輸出0
}
void main() //主函數(shù)
{
port_mode(); //初始化IO口
InitADC(); //Init ADC sfr (初始化ADC SFR)
while(1)
{
switch(n) //開關(guān)選擇
{
case 0: ledL = 0;readkey(); SRL(); break; //LEDL亮并執(zhí)行低檔控制45度
case 1: ledH = 0;ledL = 1;readkey();SR(); break; //LEDH亮并執(zhí)行高檔控制55度
}
}
}
|
|