|
為什么我一初始化PWM(使用pwm_init(0XFF,0XF6,100,0);這個(gè)函數(shù))就無(wú)法再接收來(lái)自紅外的控制了呢!
單片機(jī)源程序如下:
#include <reg52.h>
#include <intrins.h>
#include "public.h"
#include "pwm.h"
sbit LED=P1^0;
u8 pwmdata=0;
u8 rec_data;
u8 duty=0;
u8 i;
void UART_Init()
{
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可變
REN = 1;//串口允許接收
TR1 = 1;//啟動(dòng)定時(shí)器1
TMOD |= 0x20;//定時(shí)器1,工作模式2 8位自動(dòng)重裝
TH1 = 0xfd;
TL1 = 0xfd;//設(shè)置比特率9600
}
void main()
{
UART_Init();
//pwm_init(0XFF,0XF6,100,0);
while(1)
{
// duty=30+pwmdata*20;
// pwm_set_duty_cycle(duty);//設(shè)置占空比
}
}
void uart() interrupt 4 //串口通信中斷函數(shù)
{
i=!i;
RI = 0; //清除接收中斷標(biāo)志位
rec_data=SBUF; //存儲(chǔ)接收到的數(shù)據(jù)
if(rec_data==1)
{
if(i==1)
{
LED=1;
}
else
{
LED=0;
}
}
if(rec_data==11)
{
delay_ms(20);//短暫延時(shí)
pwmdata++;
}
if(rec_data==12)
{
delay_ms(20);//短暫延時(shí)
pwmdata--;
}
}
PWM.C
#include "pwm.h"
//全局變量定義
u8 gtim_h=0;//保存定時(shí)器初值高8位
u8 gtim_l=0;//保存定時(shí)器初值低8位
u8 gduty=0;//保存PWM占空比
u8 gtim_scale=0;//保存PWM周期=定時(shí)器初值*tim_scale
/*******************************************************************************
* 函 數(shù) 名 : pwm_init
* 函數(shù)功能 : PWM初始化函數(shù)
* 輸 入 : tim_h:定時(shí)器高8位
tim_l:定時(shí)器低8位
tim_scale:PWM周期倍數(shù):定時(shí)器初值*tim_scale
duty:PWM占空比(要小于等于tim_scale)
* 輸 出 : 無(wú)
*******************************************************************************/
void pwm_init(u8 tim_h,u8 tim_l,u16 tim_scale,u8 duty)
{
gtim_h=tim_h;//將傳入的初值保存在全局變量中,方便中斷函數(shù)繼續(xù)調(diào)用
gtim_l=tim_l;
gduty=duty;
gtim_scale=tim_scale;
TMOD|=0X01; //選擇為定時(shí)器0模式,工作方式1
TH0 = gtim_h; //定時(shí)初值設(shè)置
TL0 = gtim_l;
ET0=1;//打開定時(shí)器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時(shí)器
}
/*******************************************************************************
* 函 數(shù) 名 : pwm_set_duty_cycle
* 函數(shù)功能 : PWM設(shè)置占空比
* 輸 入 : duty:PWM占空比(要小于等于tim_scale)
* 輸 出 : 無(wú)
*******************************************************************************/
void pwm_set_duty_cycle(u8 duty)
{
gduty=duty;
}
void pwm(void) interrupt 1 //定時(shí)器0中斷函數(shù)
{
static u16 time=0;
TH0 = gtim_h; //定時(shí)初值設(shè)置
TL0 = gtim_l;
time++;
if(time>=gtim_scale)//PWM周期=定時(shí)器初值*gtim_scale,重新開始計(jì)數(shù)
time=0;
if(time<=gduty)//占空比
PWM=1;
else
PWM=0;
}
PWM.h
#ifndef _pwm_H
#define _pwm_H
#include "public.h"
//管腳定義
sbit PWM=P1^0;
//變量聲明
extern u8 gtim_scale;
//函數(shù)聲明
void pwm_init(u8 tim_h,u8 tim_l,u16 tim_scale,u8 duty);
void pwm_set_duty_cycle(u8 duty);
#endif
|
|