搜索
bottom↓
回复: 13

高手帮我看看

[复制链接]

出0入0汤圆

发表于 2012-9-4 15:55:52 | 显示全部楼层 |阅读模式
//4位数码管逐一加到F就出问题了

include<reg52.h>

//宏定义
typedef unsigned  char uint8 ;
typedef unsigned  int  uint16;

#define HIGNT (65536-5000)/256                        //定时器0计数寄存器高8位 50毫秒
#define LOW   (65536-5000)%256                        //定时器0计数寄存器低8位 50毫秒

//位定义
sbit d0=P2^0;
sbit d1=P2^1;
sbit d2=P2^2;
sbit d3=P2^3;

//定义编码表
uint8 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//定义全局变量

uint8 num,aa;

//启动数码管声明
void start_Nixie_tube();

//定时器0初始化声明
void timer0_init();

//延时函数声明
void delay(uint16 z);

//主函数
void main()
{
  timer0_init();
  start_Nixie_tube();
          
       
}

//定时器0初始化函数
void timer0_init()
{
  TMOD=0x01;             //定时器0方式1
  TH0 =HIGNT;
  TL0 =LOW;
  EA  =1;                //开总中断
  ET0 =1;                //开定时器0中断
  TR0 =1;                //启动定时器0
  P0=0xc0;
}                                                       
                                                                                                                                                                  
//启动数码管函数
void start_Nixie_tube()
{  
   while(1)
   {
  
     if(aa==20)
        {
          aa=0;
            for(num=0;num<16;num++)
        {          
             
          d0=0;
          P0=table[num++];
         delay(1000);
          d0=1;
  
         d1=0;
         P0=table[num++];
         delay(1000);
         d1=1;
   
         d2=0;
         P0=table[num++];
         delay(1000);
         d2=1;

         d3=0;
         P0=table[num];
         delay(1000);
         d3=1;
                 if(num>15)
                num=1;
        }
      }                                  
     }          
}
   

//延时函数
void delay(uint16 z)
{
   uint16 x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
//定时器0中断函数
void timer0()  interrupt 1
{
          TH0=HIGNT;
        TL0=LOW;
        aa++;
}

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-9-5 13:51:19 | 显示全部楼层
看什么...

出0入0汤圆

发表于 2012-9-5 15:40:15 | 显示全部楼层
   if(aa==20)
        {
          aa=0;
            for(num=0;num<16;num++)
        {         
              
          d0=0;
          P0=table[num++];
         delay(1000);
          d0=1;
  
         d1=0;
         P0=table[num++];
         delay(1000);
         d1=1;
搞不清楚LZ要干嘛, 有aa在计时,干嘛还要 delay(1000)来延时?

出0入0汤圆

发表于 2012-9-5 16:03:57 | 显示全部楼层
num==15后,循环还会继续,table[]越界

出0入0汤圆

 楼主| 发表于 2012-9-6 08:50:07 | 显示全部楼层
aaron96031 发表于 2012-9-5 15:40
if(aa==20)
        {
          aa=0;

把delay删了就有问题

出0入0汤圆

 楼主| 发表于 2012-9-6 08:58:02 | 显示全部楼层
dzcn 发表于 2012-9-5 16:03
num==15后,循环还会继续,table[]越界

数码管显示到F时,就停了几秒,然后再又从0开始显示到F,我就是不知道中间停了几秒是怎么回事

出0入0汤圆

 楼主| 发表于 2012-9-6 08:59:05 | 显示全部楼层
lcw_swust 发表于 2012-9-5 13:51
看什么...

数码管显示到F时,就停了几秒,然后再又从0开始显示到F,我就是不知道中间停了几秒是怎么回事

出0入0汤圆

发表于 2012-9-6 09:04:53 | 显示全部楼层
看来这个动态扫描 你还是没搞清楚哦, 简单说吧,一位一位扫, 一位停留2ms 足够了。 现在应该很清楚了吧

出0入0汤圆

 楼主| 发表于 2012-9-6 09:14:10 | 显示全部楼层
aaron96031 发表于 2012-9-6 09:04
看来这个动态扫描 你还是没搞清楚哦, 简单说吧,一位一位扫, 一位停留2ms 足够了。 现在应该很清楚了吧 ...

这个我知道 是我表达的不够清楚,现在问题已经解决了,我在 for(num=0;num<16;num++) 这里加了个while(1){}就行了
while(1)
{
            
for(num=0;num<16;num++)
。。。。
。。。。

出0入0汤圆

发表于 2012-9-6 09:21:30 | 显示全部楼层
num从0开始,FOR循环一次num+3,然后判断是否小于16,小于16num++,循环四次后,num值为15,然后判断是否小于16,num++,num变为16,将继续执行循环体内代码一次,由于table[]数组大小为16,访问table[]已经超出其范围。

出0入0汤圆

 楼主| 发表于 2012-9-6 09:28:51 | 显示全部楼层
dzcn 发表于 2012-9-6 09:21
num从0开始,FOR循环一次num+3,然后判断是否小于16,小于16num++,循环四次后,num值为15,然后判断是否小于 ...

程序是循环的加到F 后它会自动从0开始再加到F 这样循环下去,我刚才试过了,没有问题

出0入0汤圆

发表于 2012-9-6 09:28:51 | 显示全部楼层
正解是:
while(1)
{
    num++;
    switch(num)
    {
       case 1:    // 第1位扫描
           break;   
       case 2:    // 第2位扫描
           break;   
       case 3:    // 第3位扫描
           break;   
       case 4:    // 第4位扫描
           break;   
       default: break;
  }

出0入0汤圆

发表于 2012-9-6 10:13:03 | 显示全部楼层
不好意思,理解错误,for循环是判断后先执行循环体再++的,你的问题应该出在if(a==20),可以改为if(a>19)试试

出0入0汤圆

 楼主| 发表于 2012-9-6 12:42:23 | 显示全部楼层
dzcn 发表于 2012-9-6 10:13
不好意思,理解错误,for循环是判断后先执行循环体再++的,你的问题应该出在if(a==20),可以改为if(a>19)试 ...

if(a==20),可以改为if(a>19)这个没问题
我把它改成这样了,就没问题了
       while(1)
           {
            for(num=0;num<16;num++)
               {         
              
                 d0=0;
                 P0=table[num++];
                 delay(1000);
                 d0=1;
  
                 d1=0;
                 P0=table[num++];
                 delay(1000);
                 d1=1;
   
                d2=0;
                P0=table[num++];
                delay(1000);
                d2=1;

               d3=0;
               P0=table[num];
               delay(1000);
               d3=1;
               if(num==16)
               num=1;
            }
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 18:14

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

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