找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3174|回复: 8
打印 上一主题 下一主题
收起左侧

此程序总有一个错误,求助大神解决,我的单片机芯片是stc89c52rc系列的

[复制链接]
跳转到指定楼层
楼主
ID:87568 发表于 2016-3-27 21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*-------------------------------------------------------
要求:利用数码管,定时器等模块,做出一个秒表,样式00:00.0

------------------------------------------------*/

  #include<reg52.h>
  #define uchar unsigned char
  #define uint unsigned int
  uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  uchar a,n,num1,num2,f_shi,f_ge,m_shi,m_ge,msec;
  char  f_num,m_num;
  void init();
  void delay(uint xms)
  {
    uint i,j;
    for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
  }
  void init()
  {
     TMOD=0x11;
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;
  EA=1;
  ET0=1;
  TR0=1;
  ET1=1;
  TR1=1;
  }
  void display(uchar f_shi,f_ge,m_shi,m_ge)
  {   
  P1=0x00;
  P2=table[f_shi];
  delay(5);
  P1=0x01;
  P2=table[f_ge];
  delay(5);
  P1=0x02;
  P2=0x40;
  delay(5);
     P1=0x03;
  P2=table[m_shi];
  delay(5);
  P1=0x04;
  P2=table[m_ge]|0x80;
  delay(5);
  P1=0x05;
  P2=table[msec];
  delay(5);
  }
  void main()
  {
    init();
f_num=00;
m_num=00;
while(1)
{
   if(num1==20)
   {
      num1=0;
      if(m_num==59)
      {
            m_num=-1;
            if(f_num==59)
            {                  
               f_num=-1;
            }
            f_num++;
         }
         m_num++;                  
       }
  m_shi=m_num/10;     
  m_ge =m_num%10;
  f_shi=f_num/10;     
  f_ge =f_num%10;
   display(uchar f_shi,f_ge,m_shi,m_ge);
}
  }
  void T0_time() interrupt 1
  {
     TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;  
  num1++;      
  }
void T1_time() interrupt 3
  {
     TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;
  num2++;
  if(num2==12)
  {
      num2=0;
   n++;
   if(n==60)
   {
     n=0;
   }
   msec=n%10;
  }
   }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72781 发表于 2016-3-27 23:58 | 只看该作者
本帖最后由 暗光 于 2016-3-28 00:07 编辑

不知道是不是这个地方错啊,
看了一下感觉是变量重复定义了,首先你在前面定义了f_shi,f_ge,m_shi,m_ge为全局变量,然后你在写显示子函数时是这样写的void display(uchar f_shi,f_ge,m_shi,m_ge),这个语句相当于重新定义了一个局部的只能在这个子函数使用的局部变量,多嘴一下这个变量叫形参是用来接收传递进来的参数供子函数使用,故冲突了,而且定义错了,每一个变量前面都要加uchar不能一次加(印象中是的)。

解决办法:1、那么既然是全局变量,display就可以直接引用,直接定义为void display(){}就可以了。
2、定义这个子函数时把里面的局部变量改一下,比如加一个字母货这数字区分开即可,void display(uchar f_shi1,uchar f_ge1,uchar m_shi1,uchar m_ge1),里面的也要改。

还有一个错误,调用的时候错误,你在mian的while(1)中是这样调用的display(uchar f_shi,f_ge,m_shi,m_ge);是直接复制的吧?!!,调用的时候只需要把要传递的参数传递进去就可以了,所以应该是display(f_shi,f_ge,m_shi,m_ge);
这里面的四个变量,因为在调用的时候传递了参数,所以是实参。


最后在说一句,如果编程遇到报错,把报错的内容复制下来,百度一下,就可以找到错误原因(PS:英语好的省略这一步。。。。。。。。。。)
回复

使用道具 举报

板凳
ID:85702 发表于 2016-3-28 10:49 | 只看该作者
uchar a,n,num1,num2,f_shi,f_ge,m_shi,m_ge,msec;
char  f_num,m_num;

感觉是变量定义类型不对吧。CHAR是字符型的。f_num++字符自加。这不对吧。  应该定义成INT吧
int a,n,num1,num2,f_shi,f_ge,m_shi,m_ge,msec;
int   f_num,m_num;然后试试
回复

使用道具 举报

地板
ID:97438 发表于 2016-3-28 10:54 来自手机 | 只看该作者
楼上的都错了。。。我这没网,有网电脑再说
回复

使用道具 举报

5#
ID:87568 发表于 2016-3-28 19:26 | 只看该作者
暗光 发表于 2016-3-27 23:58
不知道是不是这个地方错啊,
看了一下感觉是变量重复定义了,首先你在前面定义了f_shi,f_ge,m_shi,m_ge为 ...

十分感谢你的回复,你的方法给我提供了很大的帮助!!!
回复

使用道具 举报

6#
ID:111182 发表于 2016-3-28 19:37 | 只看该作者
来晚了
回复

使用道具 举报

7#
ID:97438 发表于 2016-3-28 21:53 | 只看该作者
我错了,应该是变量的问题
回复

使用道具 举报

8#
ID:72781 发表于 2016-3-28 23:36 | 只看该作者
七彩缤纷 发表于 2016-3-28 10:49
uchar a,n,num1,num2,f_shi,f_ge,m_shi,m_ge,msec;
char  f_num,m_num;

不是,char型虽然是字符型,但是并不是代表储存的必须是字符,而意思是,一个字符是由8bit组成,char型就8bit,在任意编译器都一样,都是8bit,而int型在不同的编译器,不同位数的单片机是不一样的
回复

使用道具 举报

9#
ID:7485 发表于 2016-3-29 14:41 | 只看该作者
两个中断几乎是同时发生,容易出错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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