X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
嵌入式系统
51单片机的定时器0和串口同时使用问题,急!
xsyxxxxx
2009-9-14 21:36
楼主
这是我的程序:当定时器打开后就接收不到数据了,屏蔽掉定时器就可以了!请大侠指教原因所在!
/*************************************************************/
/*本设计采用STC89C52单片机 */
/* */
/*晶振为11.0592M */
/*************************************************************/
#include
#include
#define uchar unsigned char
/***************************变量定义***************************/
int timecount=0; //定时器计数
uchar flag=0; //是否超时未取走电池标志
uchar state=0; //状态标志
uchar rec=0x00; //接收数据
uchar f_rec=0; //接收标志
/***************************端口定义***************************/
sbit Battery=P1^0; // 有无电池
sbit Hand=P1^1; //有无手阻挡
sbit Output=P1^2; //夹具松开或闭合
/*************************************************************/
/*函数功能:初始化定时器0,定时时间设置为50ms */
/*入口参数:无 */
/*出口参数:无 */
/*************************************************************/
void init_timer0(void)
{
TMOD=0x01; //定时器工作在方式1
TH0=0x04; //定时初值设置为定时50ms
TL0=0xBF;
ET0=1;
}
/*************************************************************/
/*函数功能:定时器0中断服务程序 */
/*入口参数:无 */
/*出口参数:无 */
/*************************************************************/
void timer0() interrupt 1
{
TR0=0;
timecount++;
if(timecount==400) //当从CTS接收停止信号1时或夹具关闭到达20s
{
Output=1; //松开夹具
TR0=0; //关闭定时器
timecount=0; //定时计数清零
flag=1; //置位超时标志
}
else
{
init_timer0();
TR0=1;
}
}
/*************************************************************/
/*函数功能:串行接收中断服务程序 */
/*入口参数:无 */
/*出口参数:无 */
/*************************************************************/
void uart( ) interrupt 4
{
if(RI)
{
RI=0;
rec=SBUF; //接收一个数据
if(rec==0x01)
f_rec=1;
}
}
/*************************************************************/
/*函数功能:延时函数,最小延时单位1ms */
/*入口参数:延时时间 */
/*出口参数:无 */
/*************************************************************/
void delay(int t)
{
int i=0,j=0,k=0;
for(;t>0;t--)
for(;i<100;i++)
for(;i<120;i++);
}
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1; //开定时器
SCON=0x50;
PCON=0x80;
EA=1;//总中断
ES=1;//串口中断允许位
//IP=0x10; //设置串行中断为高优先级
P1=0x03; //置平P1.0及P1.1为输入模式
Output=1;
init_timer0( ); //默认情况下,夹具松开
while(1)
{
if(Battery==1&&Hand==0)
{
delay(500); //延时500ms以防止误判
if(Battery==1&&Hand==0) //当夹具上有电池且手已经拿开,闭合夹具
{
while(flag) //有超时未取走的电池时,等待将电池拿走
{
if(Battery==0&&Hand==0) //超时电阻已经取走
{
flag=0;
state=1;
f_rec=0;//清零f_rec
}
}
if(state==0)
{
TR0=1;
if(f_rec==1)
{
ES=0;
Output=1; //松开夹具
TR0=0; //关闭定时器
timecount=0; //定时计数清零
flag=1;
delay(10);
SBUF=rec;
while(!TI);
TI=0;
ES=1;
}
else Output=0;
}
else
{
state=0; //清状态标志
Output=1;
}
}
else Output=1;
}
else Output=1;
}
}
点赞
回复评论 (4)
沙发
沧海蝴蝶
定时器中断占用CPU资源太多,应该只在定时器服务代码中设置计时标志字,在主代码中计时判断动作,否则定时器中断服务代码影响串口通信.
点赞
2009-9-15 09:56
板凳
davidzjq
我没看你的程序
中断优先级是不是有问题?
点赞
2009-9-17 20:07
4楼
dq043
问题出在你的init_timer0函数里,每次启动定时器中断后会执行init_timer0中的TMOD=0x01,这样定时器1的模式就不是串口模式下所需模式了,自然串口接收不到数据。应该成 TMOD |= 0x01;
另外在你的串口接收中断函数中,跳入中断时最好把EA关掉,处理完后在将EA置位。
点赞
2009-9-18 10:13
5楼
haha6600
学习了!
点赞
2009-12-14 00:11
最新活动
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
随便看看
有没有贴片电解电容的3D库和磁环的3D库!
EEWORLD大学堂----直播回放: ADI 基准电压源产品技术及应用选择
ds18b20的问题,希望各位大哥帮忙解答一下!!!!!
430单片机软件抗干扰
IEC62612标准里有关COSΨ1 和 PF的问题
利用可采用电子方式重新配置的 GaN 功率放大器 彻底改变雷达设计
29个“烟花脚印”是如何制作的
电源在CC模式下建立恒流所面时间在什么范围
一个终端四个按键绑定四个不同的终端?
关于ML75308光学雨量芯片调试问题???
SMD零件计数器 GAM-12 (台湾产)
EEWORLD大学堂----电子电路基础知识讲座(6) - MOSFET的驱动
攒分,请无视攒分,请无视
如何将一个数据写入到DSP内的某个指定地址的数据存储器中
中英文对照论文一篇,关于Authorware的,3000字以上,谢谢大家!
电子电路实验与虚拟技术
Stratix II FPGA的PLL重新配置 7.pdf
5V转12V电平,有何高招?
做项目时收集的Keeloq资料
如何在IRP_MJ_PNP处理例程内实现对IRP_MP_IOCTL的处理
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复