- UID
- 239979
- 阅读权限
- 35
- 推广
-
- 幽默
-
- 注册时间
- 2011-11-17
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
#include "SN8P2501B.h"
#define key_stop FP12 //按键
//*******************************************************
//led
#define led_r FP00 //三个灯的IO口
#define led_g FP25
#define led_b FP10
bit ft_r_wait_2s,ft_g_wait_2s,ft_b_wait_2s;
bit ft_r_2s,ft_g_2s,ft_b_2s;
bit ft_isr_on,ft_pwm_20ms,ft_key_20ms; //中断时间,pwm增加的基准时间
bit f_stop,f_key_on,ft_sleep_on;
//.......................................................;
unsigned int b_led_g_model,b_led_b_model; //pwm的模式
unsigned int b_led_r_model,b_led_r_tcor;
unsigned int b_led_g_tcor,b_led_b_tcor; //占空比
unsigned int t_r_10ms,t_g_10ms,t_b_10ms,t_1ms;
unsigned int b_pwm_sum,b_key_sum;
//*******************************************************
//初始化
void sys_init(void)
{
//*******************************************************
//清RAM
_ClrRAM();
//*******************************************************
//IO
P1UR=0xFF; //P10.0,P1.0,P5.4输出
P1M=0xFB; //p1.2作为按键使用
P2M=0XFF;
P0M=0xFF;
//******************************************************;
//TC0__50US
TC0M=0xF4;
TC0R=180;
FTC0IRQ=0;
FTC0IEN=1;
//*******************************************************;
//T0__1MS
T0M=0xB0;
T0C=131;
FT0IRQ=0;
FT0IEN=1;
FGIE=1;
//*******************************************************;
//数据初始化
b_led_r_model=0;
b_led_g_model=2;
b_led_b_model=1;
//.......................................................;
b_led_r_tcor=0;
b_led_g_tcor=255;
b_led_b_tcor=0;
//.......................................................;
ft_r_wait_2s=1;
ft_g_wait_2s=1;
ft_b_wait_2s=0;
//*******************************************************;
}
void time(void )
{
if(ft_isr_on==1)
{
ft_isr_on=0;
t_1ms++;
if(t_1ms==20) //20ms增加一介
{
t_1ms=0;
ft_key_20ms=1;
//.......................................................;是否暂停,暂停后不需要进下面程序
if(f_stop==1) {goto time_pro90;}
//.......................................................;2.5s=20MS*127
ft_pwm_20ms=1; //pwm增加的基准时间
if(ft_r_wait_2s==1)
{
t_r_10ms++;
if(t_r_10ms==127)
{
t_r_10ms=0;
ft_r_2s=1;
ft_r_wait_2s=0;
}
}
//.......................................................;
if(ft_g_wait_2s==1)
{
t_g_10ms++;
if(t_g_10ms==127)
{
t_g_10ms=0;
ft_g_2s=1;
ft_g_wait_2s=0;
}
}
//.......................................................;
if(ft_b_wait_2s==1)
{
t_b_10ms++;
if(t_b_10ms==127)
{
t_b_10ms=0;
ft_b_2s=1;
ft_b_wait_2s=0;
}
}
//.......................................................;
}
}
time_pro90:;
}
void pwm_count(void)
{
//.......................................................;19ms进一次程序
if(ft_pwm_20ms==1)
{
ft_pwm_20ms=0;
//*******************************************************
//R
pwm_r_10:;
if(b_led_r_model==0) //选择模式,如果是模式0的话那在这里停2s
{
if(ft_r_2s==1)
{
ft_r_2s=0;
b_led_r_model=1;
}
goto pwm_g_20;
}
//.......................................................;
if(b_led_r_model==2)
{
if(ft_r_2s==1)
{
ft_r_2s=0;
b_led_r_model=3;
}
goto pwm_g_20;
}
//.......................................................;
if(b_led_r_model==1)
{
b_led_r_tcor++; //19ms增加一介(这个数据必须小于20ms,否则会有停顿的感觉)
if(b_led_r_tcor==255)
{
b_led_r_model=2;
ft_r_wait_2s=1; //等待2s的标志位
}
goto pwm_g_20;
}
//.......................................................;
if(b_led_r_model==3)
{
b_led_r_tcor--;
if(b_led_r_tcor==0)
{
b_led_r_model=0;
ft_r_wait_2s=1;
}
}
//*******************************************************
//G
pwm_g_20:;
if(b_led_g_model==0)
{
if(ft_g_2s==1)
{
ft_g_2s=0;
b_led_g_model=1;
}
goto pwm_b_30;
}
//.......................................................;
if(b_led_g_model==2)
{
if(ft_g_2s==1)
{
ft_g_2s=0;
b_led_g_model=3;
}
goto pwm_b_30;
}
//.......................................................;
if(b_led_g_model==1)
{
b_led_g_tcor++;
if(b_led_g_tcor==255)
{
b_led_g_model=2;
ft_g_wait_2s=1;
}
goto pwm_b_30;
}
//.......................................................;
if(b_led_g_model==3)
{
b_led_g_tcor--;
if(b_led_g_tcor==0)
{
b_led_g_model=0;
ft_g_wait_2s=1;
}
}
//*******************************************************
//B
pwm_b_30:;
if(b_led_b_model==0)
{
if(ft_b_2s==1)
{
ft_b_2s=0;
b_led_b_model=1;
}
goto pwm_pro90;
}
//.......................................................;
if(b_led_b_model==2)
{
if(ft_b_2s==1)
{
ft_b_2s=0;
b_led_b_model=3;
goto pwm_pro90;
}
goto pwm_pro90;
}
//.......................................................;
if(b_led_b_model==1)
{
b_led_b_tcor++;
if(b_led_b_tcor==255)
{
b_led_b_model=2;
ft_b_wait_2s=1;
}
goto pwm_pro90;
}
//.......................................................;
if(b_led_b_model==3)
{
b_led_b_tcor--;
if(b_led_b_tcor==0)
{
b_led_b_model=0;
ft_b_wait_2s=1;
}
}
/////////////////////////////////////////////////////////;
}
pwm_pro90:;
}
void key(void)
{
////////////////////////////////////////////////////////////////////////////////////;按键10ms扫描一次
if(ft_key_20ms==1)
{
ft_key_20ms=0;
////////////////////////////////////////////////////////////////////////////////////;赋数
if(key_stop==1) //按键按下key_stop=0
{
f_key_on=0; //如果按键弹起那把按下按下标志位清掉
b_key_sum=0; //消抖寄存器也清掉
goto key_pro90;
}
////////////////////////////////////////////////////////////////////////////////////;判断按键是否还未弹起
if(f_key_on==1) {goto key_pro90;}
////////////////////////////////////////////////////////////////////////////////////;消抖120ms(由于这个按键是常闭按键,所以消抖时间比较长)
b_key_sum++;
if(b_key_sum==6)
{
f_key_on=1; //按键按下标志位
f_stop=!f_stop; //暂停工作标志位
}
////////////////////////////////////////////////////////////////////////////////////;跳出
}
key_pro90:;
}
void ROM_save(void )
{
}
void led(void)
{
//*******************************************************;用占空比的数据和周期数据比较,大于输出高电平,反之输出低电平
//R
if(b_led_r_tcor>b_pwm_sum){led_r=1;}
else{led_r=0;}
//*******************************************************
//G
if(b_led_g_tcor>b_pwm_sum){led_g=1;}
else{led_g=0;}
//*******************************************************
//B
if(b_led_b_tcor>b_pwm_sum){led_b=1;}
else{led_b=0;}
/////////////////////////////////////////////////////////;
}
__interrupt isr(void)
{
if(FTC0IRQ==1)
{
FTC0IRQ=0;
b_pwm_sum++; //灯的周期 50us*256=12.8ms=78.125hz(只有大于50hz才能够保证灯不会看到闪烁的现象)
}
//*******************************************************
//中断1ms
if(FT0IRQ==1)
{
FT0IRQ=0;
T0C=131; //t0中断重新赋初值
ft_isr_on=1; //中断标志位,用于计数
}
}
void sleep(void )
{
if(ft_sleep_on==1)
{
ft_sleep_on=0;
FCPUM0=1;
}
}
////////////主函数/////////////////////////////
void main(void)
{
STKP=0X7F;
PFLAG=0;
OSCM=0;
sys_init();
while(1)
{
WDTR=0x5A; //清狗
time();
pwm_count();
led();
key();
ROM_save();
sleep();
}
}
|
|