高级会员
- 积分
- 616
- 金钱
- 616
- 注册时间
- 2016-12-1
- 在线时间
- 65 小时
|
3金钱
为什么进不去串口中断?定时中断能进,
#include <reg52.H>
#include <intrins.h>
// 函数原形定义
#define uchar unsigned char
#define uint unsigned int
#define BAUD 9600 //设置串口波特率
#define FOSC 11059200L //晶振频率
sbit LED= P1^0;
uchar a=0; //串口接收
//uint Duty;
sbit PWMOUT = P0^0; //pwm输出引脚
uchar HighRH = 0; //高电平重载值的高字节
uchar HighRL = 0; //高电平重载值的低字节
uchar LowRH = 0; //低电平重载值的高字节
uchar LowRL = 0; //低电平重载值的低字节
uint dc;
void UART_Iint(void);
void ConfigPWM(uint fr, uint dc);
void delay_ms(uint ms);
/*********************************************************
函数名称:void main (void)
函数功能:主函数
入口参数:无
返回参数:无
*********************************************************/
void main (void)
{
dc=0;
UART_Iint();//初始化
ConfigPWM(10000,0); //频率50hz,占空比50%
LED=0;//默认LED点亮
EA=1; //打开所有中断
while(1)
{
if(a==0)
dc=0; //频率1000000hz,占空比50% // 接收到蓝牙字符为0,占空比为0,led处于熄灭状态
else if(a==1)
dc=100; //接收到蓝牙字符为1,占空比为100;led处于常亮状态
else if(a==2) //接收到蓝牙字符为2,占空比加10,led变亮
{
dc=dc+10;
if(dc==100) //加到100之后不再往上加
{
dc=100;
}
}
else if(a==3) //接收到蓝牙字符为3,占空比减10,led变暗
{
dc=dc-10;
if(dc==0) //减到0之后不再往下减
{
dc=0;
}
}
ConfigPWM(10000,dc); //设置相应的占空比
}
}
/********************************
函数名称:void UART_Iint(void)//定时器1
函数功能:串口中断初始化
输入参数:无
输出参数:无
*********************************/
void UART_Iint(void)//定时器1
{
IP=0x10;
PCON|=0x00; //PCON的最高位SMOD=1时波特率加倍
TMOD|=0x20; //时器1为方式2 初值自动装入 产生波特率
TH1=-(FOSC/12/32/BAUD); //定时器初始为0XF7,晶振为12MHz,本函数实际产生的波特率为9600bps
TL1=TH1; //同上 f7
SCON=0x50; //串口设置为方式1,REN=1,允许接收
TR1=1; //启动定时器1
ES=1; //使能串口接收中断,
// EA=1; //打开所有中断
}
/**********************************************************
函数名称:void ConfigPWM(uint fr, uint dc)
函数功能:pwm初始化配置
入口参数:fr,dc
出口参数:无
**********************************************************/
void ConfigPWM(uint fr, uint dc)
{
uint high, low;
unsigned long tmp;
tmp = (11059200/12)/fr; //计算一个周期所需的计数值
high = (tmp*dc) / 100; //计算高电平所需的计数值
low = tmp - high; //计算低电平所需的计数值
high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
low = 65536 - low + 12; //计算低电平的重载值并补偿中断延时
HighRH = (uchar)(high>>8); //高电平重载值拆分为高低字节
HighRL = (uchar)high;
LowRH = (uchar)(low>>8); //低电平重载值拆分为高低字节
LowRL = (uchar)low;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = HighRH; //加载 T0 重载值
TL0 = HighRL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
PWMOUT = 1; //输出高电平
}
/***************************
函数名称:void delay_ms(uint ms)
函数功能:延时
输入参数:ms
输出参数:无
***************************/
void delay_ms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/***********************
函数名称:void tim0() interrupt 1
函数功能:输出pwm波
输入参数:无
输出参数:无
************************/
void tim0() interrupt 1 //
{
if (PWMOUT == 1) //当前输出为高电平时,装载低电平值并输出低电平
{
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}
else //当前输出为低电平时,装载高电平值并输出高电平
{
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}
/**************************************
函数功能:串口中断函数,接收数据处理
输入参数:无
输出参数:无
**************************************/
void Com_Int(void) interrupt 4
{
EA = 0;
if (RI == 1) //当硬件接收到一个数据时,RI会置位
{
a = SBUF-48 ; //这里减去48是因为从电脑中发送过来的数据是ASCII码。// Buffer[0] = SBUF-48 ;
RI = 0;
LED=~LED;
}
EA = 1;
}
|
|