//*********************************************************
/* 文件名:TEST_60F11x_PWM1.c
* 功能: 超聲波霧化器
* IC: FT60F211 SOP8
* 晶振: 16M/2T
* 說明: PWM1~PWM6輸出10KHz占空比50%的波形
*
* FT60F211 SOP8
* ----------------
* VDD-----------|1(VDD) (VSS)16|------------VSS
* NC------------|2(PA7) (PA0)15|------------NC
* NC------------|3(PA6) (PA1)14|------------NC
* NC------------|4(PA5) (PA2)13|------------NC
* NC------------|5(PA4) (PA3)12|------------NC
* PWM1----------|6(PC5) (PC0)11|------------PWM6
* PWM2----------|7(PC4) (PC1)10|------------PWM5
* PWM3----------|8(PC3) (PC2)09|------------PWM4
* ----------------
*/
//*********************************************************
#include "SYSCFG.h"
//*********************************************************
//***********************宏定義*****************************
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define key PA0
#define led1 PA4
#define led2 PC5
#define bth PA5
#define vin PA1
volatile unsigned char flga @ 0x040;
volatile bit f_key @ ((unsigned)&flga*8)+0;
volatile bit f_clos @ ((unsigned)&flga*8)+1;
volatile bit f_1s @ ((unsigned)&flga*8)+2;
volatile bit f_5s @ ((unsigned)&flga*8)+3;
//volatile bit f_run @ ((unsigned)&flga*8)+4;
#ifndef _LIB_BUILD
volatile union
{
struct
{
unsigned f_key : 1;
unsigned f_clos : 1;
unsigned f_1s : 1;
unsigned f_5s : 1;
// unsigned f_run : 1;
};
}flgabits @ 0x40;
#endif
unchar timer_data,timer_data1;
/*-------------------------------------------------
* 函數名:POWER_INITIAL
* 功能: 上電系統(tǒng)初始化
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
//********************************************************
//**************中斷處理**********************************
void interrupt ISR(void) //PIC_HI-TECH使用
{
//定時器2的中斷處理**********************
if(TMR2IE && TMR2IF) //100us中斷一次 = 5KHz
{
TMR2IF = 0;
//DemoPortOut = ~DemoPortOut; //翻轉電平
}
}
/*-------------------------------------------------
* 函數名:POWER_INITIAL
* 功能: 上電系統(tǒng)初始化
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系統(tǒng)時鐘為內部振蕩器
//Bit0=0,時鐘源由FOSC<2:0>決定即編譯選項時選擇
INTCON = 0; //暫禁止所有中斷
PORTA = 0B00000001;
TRISA = 0B00000011; //PA輸入輸出 0-輸出 1-輸入
//PA4->輸出
PORTC = 0B00000000;
TRISC = 0B00000000; //PC輸入輸出 0-輸出 1-輸入
WPUA = 0B00000001; //PA端口上拉控制 1-開上拉 0-關上拉
//開PA6上拉
WPUC = 0B0000000; //PC端口上拉控制 1-開上拉 0-關上拉
//60系列PC口無上拉
WDTCON = 0B00010001;
PCON=0x51;
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
// PSRCA = 0B11111111; //源電流設置最大
// PSRCC = 0B11111111;
// PSINKA = 0B11111111; //灌電流設置最大
// PSINKC = 0B11111111;
MSCON = 0B00110001;
//BIT5:PSRCAH4和PSRCA[4]共同決定源電流。00:4mA; 11: 33mA; 01、10:8mA
//BIT4:PSRCAH3和PSRCA[3]共同決定源電流。00:4mA; 11: 33mA; 01、10:8mA
//BIT3:UCFG1<1:0>為01時此位有意義。0:禁止LVR;1:打開LVR
//BIT2:快時鐘測量慢周期的平均模式。0:關閉平均模式;1:打開平均模式
//BIT1:0:關閉快時鐘測量慢周期;1:打開快時鐘測量慢周期
//BIT0:0:睡眠時停止工作:1: 睡眠時保持工作。當T2時鐘不是選擇指令時鐘的時候
}
/*-------------------------------------------------
* 函數名稱: TIMER2_INITIAL
* 功能: 初始化設置定時器2
* 相關寄存器: T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
-------------------------------------------------*/
void PWM1_INITIAL (void)
{
T2CON0 = 0B00000000; //T2預分頻1:1,后分頻1:4
//BIT7: 0:無意義; 1:把PR2/P1xDTy緩沖值分別更新到PR2寄存器和P1xDTy_ACT
//BIT6~BIT3: 定時器2輸出后分頻比選擇 0000:1:1;0001:1:2;……1:16
//BIT2:0:關閉定時器2;1:打開定時器2
//BIT1~0:定時器2預分頻選擇 00:1;01:4;1x:16
T2CON1 = 0B00000001; //T2時鐘來自系統(tǒng)時鐘,PWM1連續(xù)模式
//BIT4: PWM模式選擇 0:連續(xù)模式;1:單脈沖模式
//BIT3: 0:PWM模式;1:蜂鳴器模式
//Timer2時鐘源選擇:000:指令時鐘;001:系統(tǒng)時鐘;010:HIRC的2倍頻;100:HIRC;101:LIRC
TMR2H = 0; //定時器2計數寄存器
TMR2L = 140;
PR2H = 0; //周期=(PR+1)*Tt2ck*TMR2預分頻(蜂鳴器模式周期*2)
PR2L = 140;
P1CDTH = 0; //脈寬=P1xDT*Tt2ck*TMR2預分頻(蜂鳴器模式沒用到)
P1CDTL = 50;
P1AUX =0x00;
P1BR1 =0x08;
P1OE = 0B10000000; //充許P1A0輸出PWM(配置成timer定時器時這位清零)
//BIT7: 0:禁止P1C輸出到管腳;1:充許P1C輸出到管腳
//BIT6: 0:禁止P1B輸出到管腳;1:充許P1B輸出到管腳
//BIT5~BIT0: 0:禁止P1Ax輸出到管腳;1:充許P1Ax輸出到管腳
P1POL = 0B00000000; //高電平有效
//BIT7: 0:P1C高電平有效;1:P1C低電平有效
//BIT6: 0:P1B高電平有效;1:P1B低電平有效
//BIT5~BIT0: 0:P1Ax高電平有效;1:P1Ax低電平有效
P1CON = 0B00000000;
//BIT7:PWM1 重啟使能位
//1 = 故障剎車時,P1BEVT位在退出關閉事件時自動清零,PWM1自動重啟
//0 = 故障剎車時,必須用軟件將P1BEVT清零以重啟PWM1
//BIT6~0:PWM1死區(qū)時間設置
//P1DCn = 預定MPWM信號應轉變?yōu)橛行cPWM信號實際轉為有效之間的T2CK周期數
MSCON = 0B00110001; //bit0: 0:T2睡眠時停止工作
//BIT5:PSRCAH4和PSRCA[4]共同決定源電流。00:4mA; 11: 33mA; 01、10:8mA
//BIT4:PSRCAH3和PSRCA[3]共同決定源電流。00:4mA; 11: 33mA; 01、10:8mA
//BIT3:UCFG1<1:0>為01時此位有意義。0:禁止LVR;1:打開LVR
//BIT2:快時鐘測量慢周期的平均模式。0:關閉平均模式;1:打開平均模式
//BIT1:0:關閉快時鐘測量慢周期;1:打開快時鐘測量慢周期
//BIT0:0:睡眠時停止工作:1: 睡眠時保持工作。當T2時鐘不是選擇指令時鐘的時候
//設置TMR2輸出比較值定時15us=(1/4000000)*60(PR2)
TMR2IF = 0; //清TMER2中斷標志
//TMR2IE = 1; //使能TMER2的中斷(配置成timer定時器時不注釋)
TMR2ON = 1; //使能TMER2啟動
PEIE = 1; //使能外設中斷
GIE = 1; //使能全局中斷
}
/*-----------------------------------------------------------------------------
*PWM復位
------------------------------------------------------------------------------*/
void PWM_clos(void)
{
MSCON = 0x00;
P1OE = 0x00;
P1BR1 =0x00;
T2CON1 = 0x00;
TMR2ON = 0; //關閉TMER2
PEIE = 0;
GIE = 0; //關全局中斷
PA2=0;
led1=led2=0;
f_key=0;
f_clos=0;
}
/*-------------------------------------------------
* 函數名稱:DelayUs
-------------------------------------------------*/
void DelayUs(unsigned char Time)
{
/* 功能: 短延時函數 --16M-4T--大概快1%左右.
* 輸入參數:Time 延時時間長度 延時時長Time*2 Us
* 返回參數:無 */
unchar a;
for(a=0;a<Time;a++)
{
NOP();
CLRWDT();
}
}
/*-------------------------------------------------
* 函數名稱: DelayMs
-------------------------------------------------*/
void DelayMs(unsigned char Time)
{
/* * 功能: 短延時函數
* 輸入參數:Time 延時時間長度 延時時長Time ms
* 返回參數:無 */
unsigned char a,b;
// CLRWDT();
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++)
{
DelayUs(98); //快1%
}
}
}
/*----------------------------------------------------
系統(tǒng)時鐘
------------------------------------------------------*/
void sys_timer(void)
{
timer_data++;
if(timer_data>=20)
{
timer_data=0x00;
f_1s=1;
timer_data1++;
if(timer_data1>=5)
{
timer_data1=0x00;
f_5s=1;
}
}
}
/*---------------------------------------------------
*
*按鍵開關
------------------------------------------------------*/
void Key (void)
{
if(f_key==1)
{
if (key==0)
{
DelayMs(60);
while (!key)
{
CLRWDT(); //清看門狗
PWM_clos();
}
}
}
else
{
if (key ==0)
{
DelayMs(60);
if (key ==0)
{
while (!key)
{
CLRWDT(); //清看門狗
}
led1=led2=1;
PWM1_INITIAL(); //初始化T2
f_key=1;
f_clos=1;
}
}
}
}
/*-------------------------------------------------------------
*電源狀態(tài)
----------------------------------------------------------------*/
void power (void)
{
if(vin==1)
{
DelayUs(50);
if(vin==1)
{
PORTA|= 0X20;
TRISA|=0x20;
WPUA|=0x20;
if (bth==1)
{
// if(f_key==1){led1=led2=1;}
led1=1;
}
else if (bth==0)
{
if(f_1s==1)
{
f_1s=0;
led1=~led1;
}
}
}
}
else
{
if(vin==0)
{
if(f_key==0){led1=led2=0;}
PORTA&= 0XDF;
TRISA&= 0XDF;
WPUA&=0xDF;
LVDEN=1;
DelayUs(20);
if (LVDW==1)
{
if(f_5s==1)
{
f_5s=0;
led1=led2=1;
DelayMs(20);
led1=led2=0;
}
}
LVDEN=0;
}
}
}
/*-------------------------------------------------
* 函數名: main
* 功能: 主函數
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void main()
{
POWER_INITIAL(); //系統(tǒng)初始化
flga=0x00;
WDTCON=0X0b;
while(1)
{
CLRWDT(); //清看門狗
NOP();
SLEEP();
sys_timer();
Key ();
power ();
}
}
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發(fā)內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業(yè)交易、轉載等行為,該內容只為學習所提供,使用后發(fā)生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|