OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4246|回复: 6

大神帮忙看看

[复制链接]

20

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2016-12-1
在线时间
65 小时
发表于 2018-5-7 00:13:43 | 显示全部楼层 |阅读模式
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;
        }


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2017-8-6
在线时间
42 小时
发表于 2018-5-7 08:19:22 | 显示全部楼层
优先级没设置好 定时器0会打断你的串口中断
回复

使用道具 举报

20

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2016-12-1
在线时间
65 小时
 楼主| 发表于 2018-5-7 08:56:34 | 显示全部楼层
zwh的旅程 发表于 2018-5-7 08:19
优先级没设置好 定时器0会打断你的串口中断

我把串口优先级设置成
IP=0x10
了啊
回复

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2017-8-6
在线时间
42 小时
发表于 2018-5-7 09:39:51 | 显示全部楼层
设置最高优先级是两个寄存器    IPH没设置  加上这句试试
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2018-5-7 12:04:47 | 显示全部楼层
kifea 发表于 2018-5-7 08:56
我把串口优先级设置成
IP=0x10
了啊

你先发一下看看,你的波特率准不准,另外和优先级无关,串口里也不用关中断,51实际上是有一个字节的硬件缓存的,发送也是要进中断的。
回复

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2017-8-6
在线时间
42 小时
发表于 2018-5-12 09:22:08 | 显示全部楼层
根据需要 发送可以不进中断的   在多任务时优先级是很重要
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2018-5-14 00:25:57 | 显示全部楼层
zwh的旅程 发表于 2018-5-12 09:22
根据需要 发送可以不进中断的   在多任务时优先级是很重要

优先级不对,只是响应不及时,不会步不进中断,用发送来看一下中断设置是否正确。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表