1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
为什么进不去串口中断?定时中断能进,
#include #include // 函数原形定义 #define uchar unsigned char #define uint unsigned int #define BAUD 9600 //设置串口波特率 #define FOSC 11059200L //晶振频率 ***it LED= P1^0; uchar a=0; //串口接收 //uint Duty; ***it 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; } |
|
相关推荐
6个回答
|
|
优先级没设置好 定时器0会打断你的串口中断
|
|
|
|
|
|
|
|
设置最高优先级是两个寄存器 IPH没设置 加上这句试试
|
|
|
|
你先发一下看看,你的波特率准不准,另外和优先级无关,串口里也不用关中断,51实际上是有一个字节的硬件缓存的,发送也是要进中断的。
|
|
|
|
根据需要 发送可以不进中断的 在多任务时优先级是很重要
|
|
|
|
优先级不对,只是响应不及时,不会步不进中断,用发送来看一下中断设置是否正确。
|
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1179浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 13:40 , Processed in 1.221312 second(s), Total 60, Slave 51 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号