51单片机控制,按下停止键,执行到最后能复位,应如何操作?

succed 2004-11-20 05:46:28
我的一个项目,使用的是89C52的单片机,当按下停止键后,程序在执行完了之后要恢复复位状态,应如何做才能实现。写程序用的是C51。谢谢?
...全文
1158 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
succed 2004-12-15
  • 打赏
  • 举报
回复
我记得在C语言中,好象符号型和整型是完全相同的。如果是这个原因,那每次都会死机的,不会有时可以正常使用。
ldqmoon 2004-12-12
  • 打赏
  • 举报
回复
是不是和那个feed变量的类型有关?做比较的时候,符号型和非符号型不太一样
succed 2004-12-09
  • 打赏
  • 举报
回复
如果是我的feed的值设的太大的话,系统会复们的更快啊,我想还是哪有问题。不过我现在已经解决了,我不再使用中断了,我在每一个子程序 中分段加上P3_5=!P3_5,在stop中不再P3_5=!P3_5,等待就行了。还省了一个中断。改过之后再没死过机。也不知原来是因为什么?
galle 2004-12-09
  • 打赏
  • 举报
回复
你的看门狗时间是多少?把Feed的初值改小,因为你中断中的程序会影响定时的。
P3_5=!P3_5;改成P3_5=~P3_5;
jnwsh 2004-12-08
  • 打赏
  • 举报
回复
http://www.c51bbs.com/show.aspx?id=48&cid=9
CopperLau 2004-12-07
  • 打赏
  • 举报
回复
NOP
NOP
LJMP ERR
1。在不用的中断中加这个
2。在jmp后加这个
3。在不用的空间中加这个就得了

err是一个软复位..
加寄存器都复位,,
没有带书。。自己看看..
jnwsh 2004-12-07
  • 打赏
  • 举报
回复
c51里我也不会设置陷阱,刚开始学习c51,强烈建议哪位大虾给个例子瞧瞧
ldqmoon 2004-12-06
  • 打赏
  • 举报
回复
最简单的方法:c中插入汇编

或:进入子程后修改堆栈里的值,执行完子程后返回时可以直接跳到任何地方
succed 2004-12-03
  • 打赏
  • 举报
回复
使用C51怎么做陷阱,我不会。我会用汇编做陷阱,直接跳转就行了。怎么用C51来做陷阱和跳回到程序最初始点。可以做到吗?请给出例子。
succed 2004-12-02
  • 打赏
  • 举报
回复
我想当我按下停止键后,当停止操作做完之后进入上电复位的状态,主要是我不想我的程序在执行完我的停止操作之后,再去接着原来没进行完的程序去进行。我要的是停止就先把一些外部设备的状态复位,复位完了,主机就进入初始状态,等待下一次操作。
succed 2004-12-02
  • 打赏
  • 举报
回复
我要的就是按键复位,我使用的是复位电路Max813L,我用的有复位按键。但我希望我的一段程序在执行结束的时候进入上电复位状态。我的这段程序执行时间比较长,最长可达100小时。我希望在我的程序执行期间,不论执行到何处,只要我按下停止键,程序都要进入停止程序,先执行一段代码后,再进入复位操作。我使用的是看门狗,用T1来实现,在T1中断中,每过1.5秒,就取反P3.5,P3.5和813的DI相连。只是复位按键每次都能有效复位,停止按键有时执行到一半会死机,也不知为什么,有效率在80%左右。而且连续执行几次,就死机了。大家看一下我的代码。
void FeedDog(void) interrupt 3 这是我的T1中断程序,由它来喂看门狗
{
TH1=-5000/256;
TL1=-5000%256;
Feed=Feed+1;
if(Feed==150)
{
Feed=0;
P3_5=!P3_5;
}
}
void Stop() /* 停止函数*/
{
uint i;
F0=1;
//P2_4=1;
P2_6=1;
//P2_3=0;
P2_5=0;
//for(i=0;i<10;i++)//我这里要延时1分钟,但我这里只要有定时,系统死机率就会增加
delay(100);
P2_5=1;
//P2_3=1;
P2_2=1;
P2_1=1;


test();
delay(10);
TR1=0;
ET1=0; //停止T1,等待复位
for(i=0;i<600;i++)
{
P3_5=0;//这里是我发现如果我最后将P3_5置0,死机率就会减小
delay(100);
}
EX0=1;
//while(1);
//P3_5=1;
}
大家看一下,我的程序是有问题,还是系统干扰的原因,使我的系统总不能有效复位。
jnwsh 2004-12-02
  • 打赏
  • 举报
回复
陷阱,执行到陷阱后跳转到冷启动或热启动就可以了
没有啥的昵称 2004-12-01
  • 打赏
  • 举报
回复
to: flowercity(小唐"菜")
你说的方法我在以前试过,不太好使,常出错,可能是一些寄存器的值不是初始值的缘故,所以一直不太明白,要是你能实现,可以和我讨论一下!
galle 2004-11-28
  • 打赏
  • 举报
回复
一般来讲应该用一个外部中断来做这个停止键的.如果你的外部中断被使用了,可以使用组合的方式,用个或门,将按键和你现有的中断或起来.然后在中断程序中判断是哪个提出的中断在处理就好了;
ldqmoon 2004-11-28
  • 打赏
  • 举报
回复
怎么看怎么象按键复位.

-------------------------------------------------
所以我设立了停止按键,如果按下停止键,则不论原来在执行什么程序,程序要执行停止过程,停止过程之后,将程序初始化。
-------------------------------------------------

这样的话直接在复位端接个按键不行吗?然后在初始化的时候安排一段程序来处理运行中的复位
你的外围元件除了0809还有什么?
xwdd129 2004-11-25
  • 打赏
  • 举报
回复
其实方法多了,你可以把停止键单独用一个I/O口线,分程序中定时检测这个口线,若为相应电平就延时并回跳不就行了!!

当然用看门狗一样的,同样可以实现!!
succed 2004-11-25
  • 打赏
  • 举报
回复
我现在改用ADC0809了,它可以解决5G14433的问题,只是我对ADC0809不熟,正在学习。
succed 2004-11-24
  • 打赏
  • 举报
回复
另我的电路中,有一个AD采集,我用的是5G14433,要采集的信号在显示为0的时候,传感器电压为在15mv左右,满量程时为19mv左右,量程分300个等级,我用的是tlc2652放大1000倍。由于我的0不是0v,而且我使用的是不能断电保存的cpu89s52,所以我在每次上电时,采集信号为0,在标准状态下,采集为300,只是我不可能每次都核准,所以我在AD和放大器输出加了电位器,通过调节电位器,使仪器显示为300,只是这样同时使设备在0时采集到的电压也不同了,这样在初始化之后,在标准状态下又不能显示为300了。我的想法不知有没有错,应如何解决,谢谢!
succed 2004-11-24
  • 打赏
  • 举报
回复
我的程序不是单进程的,主程序只是初始化之后,根据不同的按键输入,执行不同的程序,主程序只是不停的查询键盘,进入分程序后,则主程序停止查询,执行完了之后,主程序接着查询。在分程序中,有时要开中断,执行中断程序,我用了四个中断,T0,T1,Int0,Int1,其中一个分程序要执行24小时,所以我设立了停止按键,如果按下停止键,则不论原来在执行什么程序,程序要执行停止过程,停止过程之后,将程序初始化。也就是说不要程序执行完之后,再去接着原来的程序执行就行了,同时要初始化。我用的是C写的,在C中可以在中断中跳到程序的开始部分,并初始化各寄存器吗?我现在用的是硬件的看门狗,用了一上IO口,用了一个计时器,在计时器中断中,给出喂狗脉冲。也不知是否合适?
flowercity 2004-11-24
  • 打赏
  • 举报
回复
最近你问了好多问题啊
呵呵
加载更多回复(7)

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧