//*********************************************************
/* 文件名: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
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
//********************************************************
//**************中断处理**********************************
void interrupt ISR(void) //PIC_HI-TECH使用
{
//定时器2的中断处理**********************
if(TMR2IE && TMR2IF) //100us中断一次 = 5KHz
{
TMR2IF = 0;
//DemoPortOut = ~DemoPortOut; //翻转电平
}
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//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时钟来自系统时钟,PWM1连续模式
//BIT4: PWM模式选择 0:连续模式;1:单脉冲模式
//BIT3: 0:PWM模式;1:蜂鸣器模式
//Timer2时钟源选择:000:指令时钟;001:系统时钟;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死区时间设置
//P1DCn = 预定MPWM信号应转变为有效与PWM信号实际转为有效之间的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%
}
}
}
/*----------------------------------------------------
系统时钟
------------------------------------------------------*/
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;
}
}
}
}
/*-------------------------------------------------------------
*电源状态
----------------------------------------------------------------*/
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(); //系统初始化
flga=0x00;
WDTCON=0X0b;
while(1)
{
CLRWDT(); //清看门狗
NOP();
SLEEP();
sys_timer();
Key ();
power ();
}
}
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|