打印
[国产单片机]

STC15F102W遇到的问题

[复制链接]
3078|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nwjjdwx|  楼主 | 2015-7-19 21:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nwjjdwx 于 2015-7-28 12:23 编辑

请教各位老师,这个问题应该怎样解决,问题如下,用8脚的STC15F104E做了一个小东西,程序下载后运行正常,就是按键反应稍有迟缓,后来看到STC15F102W这款单片机价格便宜一些,便想使用15F102W来做这个东西,可是下载后却不能正常运行,以为芯片的问题,换了好几片,现象一个样,芯片是从STC南通公司买的,请各位老师帮忙指点一下:

//程序功能说明:利用定时器0产生一个频率838Hz的信号,通过7脚输出;有两种占空比输出,利用3脚外接的对地微动按钮来切换,1脚驱动外接发光管来指示输出占空比类型;5脚6脚8脚用来对电路输出负载进行监测:主要实现开机负载不短路、不开路时8脚输出驱动一个蜂鸣器,发出一长声表示正常,开路三短声连续响,短路两短声连续响并停止信号驱动输出。利用5脚电压高低变化来进行监测。6脚为开机自检时对负载状态进行辅助控制以配合5脚进行自检。//

//(遇到的问题:这个程序在15F104E上运行正常,只是按键功能执行感觉稍有迟缓,其它正常,把它下载到15F102W上出现两个问题:1、蜂鸣器一工作,程序功能彻底混乱,在104E上应用时8脚加4.7k上拉,再用10欧电阻限流驱动三极管来驱动蜂鸣器,后我将10欧限流改为2k限流,应用在102w上,蜂鸣器干扰问题解决。2、第二个问题:开机先不正常短响一下才开始进入自检程序,这个短响在程序里是没有的,不知道为什么会短响一下,这时示波器测了一下信号输出正常,按动3脚按键切换输出脉冲占空比,切换成功,示波器测试证实也是正常的。可是再次按动按键想切换回来却不能了,这时发现自检监测程序也失灵了,好像除了定时器和它的中断程序外,其他的都失灵了,只有断电再次启动才正常,不过按键只能按动1次,按了之后又失灵了。)//





#include <reg52.h>    //52系列单片机头文件
#define uint unsigned int     //宏定义

sbit out1=P3^3;   //声明蜂鸣器输出为p1的0引脚(蜂鸣器)
sbit out2=P3^2;   //(信号输出)
sbit out3=P3^1;   //声明状态监测辅助输出脚为p1的第1脚

sbit key1=P3^5;   //声明功能转换按钮为p1的第5脚
sbit key2=P3^0;   //声明状态监测脚(包括过流)为p1的第0脚
sbit led1=P3^4;    //声明功能状态指示灯为p3的第4脚
uint i,j;        //定义数据类型
uint num1;         //定义数据类型


void delayms(uint xms)   //延时子程序
    {
       for(i=xms;i>0;i--)
            for(j=400;j>0;j--);
     }



void init()

    {
  out1=0;       //蜂鸣器
  out2=0;       //信号输出
  out3=1;       //监测辅助控制
  delayms(60);

  


          out3=1;    //监测辅助控制打开
          delayms(60);
while(key2==1)            //判断状态监测脚状况
             {
                  
                    out1=1;
       delayms(400);
        out1=0;
        delayms(200);
       out1=1;
       delayms(400);
        out1=0;
                   delayms(200);
       out1=1;
       delayms(400);
        out1=0;
        delayms(1500);

                  }
                  out3=0;        //监测辅助控制关闭
  
num1=310;
  
  TMOD=0x01;    //设置定时器0为工作方式1(M1M0为01)
  TH0=(65536-1116)/256;   //装初值11.0592M晶振定时50ms数为45872.(1116为1.2ms)
  TL0=(65536-1116)%256;
  EA=1;  //开总中断
  ET0=1;   //开定时器0中断
  
  TR0=1;    //开定时器0
      
  delayms(50);
  if(key2==1)
  {
       TR0=0;
        out1=1;           //蜂鸣器开
         delayms(1500);
         out1=0;            //蜂鸣器关
                   TR0=1;
     }

  }
     




         
         
void keyscan()       //键扫描子程序
   {

        if(key1==0)
                  TR0=0;
        delayms(10);
          if(key1==0)
               led1=~led1;
                     while(key1==0);
                                                        delayms(30);
                                                        TR0=1;
                if(key2==0)                                
            {
                   TR0=0;
                  while(1)
                  {
        
       out1=1;
       delayms(400);
        out1=0;
        delayms(200);
       out1=1;
       delayms(400);
        out1=0;
       delayms(1000);
                 }
      
    }
                 
        }


         

          void main()    //主程序
{
   init();    //执行初始化
  
        while(1)
  {
     keyscan();

   }
}

   

中断程序省略....................................................
     

相关帖子

沙发
naught0911| | 2015-7-19 21:57 | 只看该作者
不同型号寄存器配置不一样、速度也不一样,你仔细查手册吧!

使用特权

评论回复
板凳
nwjjdwx|  楼主 | 2015-7-19 22:07 | 只看该作者
本帖最后由 nwjjdwx 于 2015-7-19 22:16 编辑
naught0911 发表于 2015-7-19 21:57
不同型号寄存器配置不一样、速度也不一样,你仔细查手册吧!

谢谢老师指点,我的程序水平实在有限,这个程序如此简单,没用到里面的特殊寄存器,只用了里面的定时器0,下载时设置的时钟都是11.0592M,我一时实在想不出问题出在哪里,同样都是51的内核,在15F104E能正常运行,可是在15F102W就不行了。

使用特权

评论回复
地板
naught0911| | 2015-7-19 22:28 | 只看该作者
若不设置单片机引脚上电是高电平,你初始化不设置KEY2,它就自动为高,就死在你的初始化里了。建议按键扫描函数放在中断里或直接弄个外部中断也行啊,你的扫描函数内停顿时间过长导致了按键反应不灵敏

使用特权

评论回复
5
nwjjdwx|  楼主 | 2015-7-20 09:18 | 只看该作者
本帖最后由 nwjjdwx 于 2015-7-20 09:51 编辑
naught0911 发表于 2015-7-19 22:28
若不设置单片机引脚上电是高电平,你初始化不设置KEY2,它就自动为高,就死在你的初始化里了。建议按键扫描 ...

谢谢您了老师,随后我按照您的指导修改一下试试。希望其他老师继续不吝赐教。

使用特权

评论回复
6
nwjjdwx|  楼主 | 2015-7-21 09:55 | 只看该作者
本帖最后由 nwjjdwx 于 2015-7-21 10:06 编辑

naught0911老师您好,按照您的思路将键扫函数中涉及key1的内容搬到中断服务中,结果发现了问题,程序跑到这就陷进去出不来了,连定时器也停了,仔细分析应该是陷在了TR0=0这条语句之后,便将条件语句之后的内容加了一个花括号{},结果解决了,试验按键非常灵敏,执行很顺畅;又将这部分内容移回键扫里,结果执行仍然顺畅,到此问题解决,总结经验为:我写程序时犯的一个低级错误,少了一个花括号{},可是在15F104E上却能跑过去(虽然按键迟缓一些),令人不解,另外您说的key2初始化设置为高电平的问题,我反复试验,设置和不设置结果一样,这个应该不是问题所在。然而第二个问题我却怎么也解决不了了,就是开机蜂鸣器先短响一下,然后才跑进程序包含的内容,这个短响程序里是没有的,为了找到原因,将相关程序逐一删掉试验,现象仍然如此,后用示波器测量各I/O口发现上电瞬间均有一个上下跳动,不知是什么原因,而15F104E却没有这个现象,我想是不是厂家设计15F102W复位期间各I/O口均被强制置高电平?实在不解。我想不行的话将蜂鸣器设置成低电平驱动,改一下外电路,不知能不能圆满解决,希望继续得到各位老师的指导。在这里感谢naught0911老师的帮助,是您的思路帮助启发我找到了原因,谢谢您了。:handshake

使用特权

评论回复
7
naught0911| | 2015-7-22 14:21 | 只看该作者
不必客气。加油干!

使用特权

评论回复
8
nwjjdwx|  楼主 | 2015-7-27 19:12 | 只看该作者
最后一个问题终于解决,解决过程:将程序中关于蜂鸣器驱动的电平进行修改,设置成低电平驱动,外电路采用PNP管驱动蜂鸣器,结果可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

63

帖子

3

粉丝