搜索
bottom↓
回复: 42

51的复位按键不起作用,按下后程序无法重新执行,求指点

[复制链接]

出0入0汤圆

发表于 2015-4-3 17:13:43 | 显示全部楼层 |阅读模式
复位键的电路图如图所示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2015-4-3 17:18:14 | 显示全部楼层
EA脚接了没,电源正常不?
至少要上个完整的电路吧

出0入0汤圆

发表于 2015-4-3 17:20:03 | 显示全部楼层
正负极反了~                    

出0入0汤圆

发表于 2015-4-3 17:24:01 | 显示全部楼层
是不是STC的单片机?是不是把复位脚设置成IO口了?

出0入0汤圆

 楼主| 发表于 2015-4-3 17:32:06 | 显示全部楼层
lcw_swust 发表于 2015-4-3 17:18
EA脚接了没,电源正常不?
至少要上个完整的电路吧

我是直接焊的,没有完整电路图,这只是我找的复位电路图

出0入0汤圆

 楼主| 发表于 2015-4-3 17:33:18 | 显示全部楼层
lcw_swust 发表于 2015-4-3 17:18
EA脚接了没,电源正常不?
至少要上个完整的电路吧

EA接VCC了

出0入0汤圆

 楼主| 发表于 2015-4-3 17:35:15 | 显示全部楼层

你确定?我试试,但网上看的复位电路图电容正极都这样接的啊

出0入0汤圆

 楼主| 发表于 2015-4-3 17:36:58 | 显示全部楼层
chess01 发表于 2015-4-3 17:24
是不是STC的单片机?是不是把复位脚设置成IO口了?

是STC的,9管脚除了接复位,其他就没动他

出0入0汤圆

 楼主| 发表于 2015-4-3 17:37:54 | 显示全部楼层
jswd0810 发表于 2015-4-3 17:27
测测51单片机的复位管脚电平先

然后呢?求指点

出0入96汤圆

发表于 2015-4-3 17:44:57 | 显示全部楼层
有的单片机是上拉电阻,有的是下拉电阻,一定要分清。

出0入0汤圆

发表于 2015-4-3 17:47:24 | 显示全部楼层
chenhai 发表于 2015-4-3 17:35
你确定?我试试,但网上看的复位电路图电容正极都这样接的啊

把电容和电阻的位置换一换吧~

出0入0汤圆

发表于 2015-4-3 17:48:40 | 显示全部楼层
按下按键测试电平变化.

出0入0汤圆

发表于 2015-4-3 17:53:51 | 显示全部楼层
单片机的型号全称是什么?

出0入0汤圆

发表于 2015-4-3 17:54:37 | 显示全部楼层
自己焊接的要注意看看电源和复位电路有没有虚焊

出0入0汤圆

 楼主| 发表于 2015-4-3 18:04:24 | 显示全部楼层
魏道志 发表于 2015-4-3 17:53
单片机的型号全称是什么?

好的,STC89C52RC

出0入0汤圆

发表于 2015-4-5 22:18:55 | 显示全部楼层
目测LZ的电路是没错的,但是焊接正确吗?

出0入0汤圆

 楼主| 发表于 2015-4-6 21:41:46 | 显示全部楼层
黑夜之狼 发表于 2015-4-5 22:18
目测LZ的电路是没错的,但是焊接正确吗?

焊接没问题,然后我直接将9脚接vcc也没用啊,程序还是无法重新执行

出0入0汤圆

 楼主| 发表于 2015-4-6 21:42:30 | 显示全部楼层
lryxr2507 发表于 2015-4-3 17:48
按下按键测试电平变化.

按键按下去后,检测到9脚是高电平

出145入215汤圆

发表于 2015-4-6 23:27:38 来自手机 | 显示全部楼层
复位后并不一定所有东西都归原始值的。比如寄存器里面存的值,复位后任然在的。你没有在代码最前面加初始化。

出0入0汤圆

发表于 2015-4-7 00:01:39 | 显示全部楼层
chenhai 发表于 2015-4-6 21:41
焊接没问题,然后我直接将9脚接vcc也没用啊,程序还是无法重新执行

把最小系统发上来看看

出0入0汤圆

发表于 2015-4-7 11:08:00 | 显示全部楼层

如果是这个型号的单片机的话,你的电路是没有问题的

出0入0汤圆

发表于 2015-4-7 11:13:45 | 显示全部楼层
把程序贴上来看看

出0入0汤圆

 楼主| 发表于 2015-4-7 20:10:54 | 显示全部楼层
黑夜之狼 发表于 2015-4-7 00:01
把最小系统发上来看看

这是完整的电路图,谢谢了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-4-7 20:11:49 | 显示全部楼层
dz20062008 发表于 2015-4-6 23:27
复位后并不一定所有东西都归原始值的。比如寄存器里面存的值,复位后任然在的。你没有在代码最前面加初始化 ...

学艺不精,请问怎么加初始化啊

出0入0汤圆

 楼主| 发表于 2015-4-7 20:25:03 | 显示全部楼层
xiaoseaip 发表于 2015-4-7 11:13
把程序贴上来看看

程序有点多,我就贴个main.c了
/*******************************************************************************
* 文件名                 :  18B20数字温度计加DS1302实时显示时间
* 说明     :   LCD1602显示温度值及当前时间。
*******************************************************************************/
#include <reg51.h>
#include "lcd.h"
#include "temp.h"
#include "ds1302.h"
#include "at24c02.h"
#include "key.h"
/*******************************************************************************/
unsigned char address,_Caiyang,address_1;//温度数据保存初始地址;采样时间;按键操作地址值
unsigned int  reserve_time,Set_time=1200;
void _interrupt(void);//中断配置
void reserve_data(void);//保存数据
void anjian(void);      //按键操作

/*******************************************************************************
* 函数名         : void main(void)
* 函数功能                     : 主函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void main(void)
{
        _interrupt();
        LcdInit();                         //初始化LCD1602
        Ds1302Init();    //初始化DS1302
        LcdDisplay_temp(Ds18b20ReadTemp()); //1602显示温度初始值
        while(1)
        {
//                if(_Caiyang>=100)        //_Caiyang=100,则采样时间为5秒
//                {
                                LcdDisplay_temp(Ds18b20ReadTemp());//lcd实时显示当前温度值
//                          _Caiyang = 0;//重新计数
//                }
                Ds1302ReadTime();                  //读取时间
                LcdDisplay_1302();                       //lcd实时显示当前时间
                reserve_data();
                if(KeyScan()==4)
                                anjian();
         }
}
/*******************************************************************************
* 函数名         : void reserve_data(unsigned int reserve_time,unsigned int Set_time)
* 函数功能                     : 温度数据保存函数
* 输入           :无
* 输出                  : 无
*******************************************************************************/
void reserve_data(void)  //1分钟保存一次数据
{
        if(reserve_time>=Set_time)
        {
                At24c02Write_temp(address,Ds18b20ReadTemp());//
                reserve_time = 0;
                if(address==254)
                {
                        address = 0;
                }
                address += 2;
        }
}
/*******************************************************************************
*函数名         : void _interrupt(void)
*函数功能                    : 中断配置函数
*输入           : 无
*输出                 : 无
*******************************************************************************/
void _interrupt(void)
{
   TMOD=0x01;                    //定时器0工作方式1,16位计时器
   TH0=(65536-50000)/256;        //50毫秒中断一次
   TL0=(65536-50000)%256;   
   EA=1;                              //开总中断
   ET0=1;                                    //定时器0中断允许
         //EX0=1;                //外部中断INT0的中断允许
   TR0=1;                              //允许定时器0计数
         //IT0 = 0;               //低电平触发中断
}
/*******************************************************************************
*函数名         : void anjian(void)
*函数功能                    : 按键操作函数
*输入           : 无
*输出                 : 无
*******************************************************************************/
void anjian(void)
{
        while(1)
        {
                if(KeyScan()==1)
                {
                        if(address_1==254)
                        {
                                address_1=0;
                        }
                        address_1 = address_1+2;
                }
                if(KeyScan()==2)
                {
                        if(address_1==0)
                        {
                                address_1=254;
                        }
                        address_1 = address_1-2;
                       
                }
                if(KeyScan()==3)
                {
                        break;
                }
                LcdDisplay_temp(At24c02Reading_temp(address_1));//lcd显示当前地址中保存的温度数据
                //LcdDisplay_temp(At24c02Reading_temp(address_1));
                Ds1302ReadTime();                  //读取时间
                LcdDisplay_1302();                       //lcd实时显示当前时间
        }
}
/*******************************************************************************
*函数名         : void time0() interrupt 1
*函数功能                    : 定时器重装初始值
*输入           : 无
*输出                 : 无
*******************************************************************************/

void time0() interrupt 1
{
   TH0=(65536-50000)/256;        //高八位,装入初值
   TL0=(65536-50000)%256;   //低八位,装入初值
   _Caiyang++;              //每50毫秒_Caiyang加1,最多加到255
         reserve_time++;           //每50毫秒reserve_time加1,最多加到65535
}

出20入25汤圆

发表于 2015-4-7 20:34:06 | 显示全部楼层
看看晶振起振了没

出0入0汤圆

 楼主| 发表于 2015-4-7 20:37:04 | 显示全部楼层
chenchaoting 发表于 2015-4-7 20:34
看看晶振起振了没

其他功能按键都好着,就是复位键有问题,愁死我了

出20入25汤圆

发表于 2015-4-7 20:39:43 | 显示全部楼层
chenhai 发表于 2015-4-7 20:37
其他功能按键都好着,就是复位键有问题,愁死我了

你确定你的按钮没装反?用万用表试试是不是按下通,放开断

出0入0汤圆

 楼主| 发表于 2015-4-7 20:42:11 | 显示全部楼层
chenchaoting 发表于 2015-4-7 20:39
你确定你的按钮没装反?用万用表试试是不是按下通,放开断

已经用万用表测过了,没有按下去时,9脚和vcc是不通的,按下去时才是通着的

出0入0汤圆

发表于 2015-4-7 20:43:17 | 显示全部楼层
chenhai 发表于 2015-4-7 20:10
这是完整的电路图,谢谢了

单纯看电路是没啥问题,会不会是元器件的问题

出0入0汤圆

 楼主| 发表于 2015-4-7 20:47:58 | 显示全部楼层
黑夜之狼 发表于 2015-4-7 20:43
单纯看电路是没啥问题,会不会是元器件的问题

刚开始怀疑是电容坏了,但是把电容换了之后还是不行。我在想会不会是复位按键离9脚有点远才导致这样,但是这样也说不通啊,按键按下去之后9脚电平是有变化的啊,从0到5v,松开之后是从5v变为0

出20入25汤圆

发表于 2015-4-7 20:51:11 | 显示全部楼层
chenhai 发表于 2015-4-7 20:47
刚开始怀疑是电容坏了,但是把电容换了之后还是不行。我在想会不会是复位按键离9脚有点远才导致这样,但 ...

你说其他正常是什么意思?不按的话电路能正常工作?

出0入0汤圆

 楼主| 发表于 2015-4-7 20:57:28 | 显示全部楼层
整个电路的其他功能都能够实现,另外四个按键也能正常工作,唯独复位键不起作用;不按复位键的话能正常工作

出0入0汤圆

发表于 2015-4-7 21:11:10 | 显示全部楼层
电容挂了

来过PCB的图

出0入0汤圆

 楼主| 发表于 2015-4-7 21:22:24 | 显示全部楼层
jiangkexiaozhen 发表于 2015-4-7 21:11
电容挂了

来过PCB的图

这电容只在上电复位时起作用吧,感觉按键复位时那电容就不起啥作用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-4-7 21:37:03 | 显示全部楼层
chenhai 发表于 2015-4-7 20:47
刚开始怀疑是电容坏了,但是把电容换了之后还是不行。我在想会不会是复位按键离9脚有点远才导致这样,但 ...

想不通,换MCU

出0入0汤圆

发表于 2015-4-7 21:49:44 | 显示全部楼层
你这个问题很奇怪啊    楼主解决了没有

出0入0汤圆

 楼主| 发表于 2015-4-7 21:52:55 | 显示全部楼层
jiaxianglhh 发表于 2015-4-7 21:49
你这个问题很奇怪啊    楼主解决了没有

还没有呢,办法都试过了

出0入0汤圆

发表于 2015-4-7 22:00:25 | 显示全部楼层
用示波器测试晶振有没有起振,能看到12M的正弦波是正常的,不能说明单片机没工作。不按按键,看复位管脚是不是低电平,检查电源管脚电压是否正常,EA电压是否正常,

出0入0汤圆

 楼主| 发表于 2015-4-7 22:15:58 | 显示全部楼层
晶振有起震。不按按键,复位管脚是低电平,电源管脚电压正常,EA电压正常。
lcd1602能正常显示ds1302的时间,说明上面的都好着

出145入215汤圆

发表于 2015-4-8 02:16:49 来自手机 | 显示全部楼层
手动复位与关电复位有啥区别,能上电复位就说明复位电路好的,手动也就是放电电容再次充电。两者区别有的,断电上电复位不光初始化sfr  pc的值而且其它寄存器也是初始值。手动复位只是sfr   pc复位了,你修改过的寄存器的值是还在的,如果你直接就调用了寄存器数据就会与断电开机运行效果不一样的。比如全局变量

出0入0汤圆

 楼主| 发表于 2015-4-8 20:39:09 | 显示全部楼层
dz20062008 发表于 2015-4-8 02:16
手动复位与关电复位有啥区别,能上电复位就说明复位电路好的,手动也就是放电电容再次充电。两者区别有的, ...

应该就是你说的这种情况了,每次按复位键后lcd1602要么显示不正确,要么闪烁几下后就不显示了。
还是不会,麻烦帮忙解决下,谢谢了,我用的是stc89c52
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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