找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8802|回复: 22
收起左侧

单片机动态数码管显示试验做 8位数码管计数器

[复制链接]
ID:59980 发表于 2014-9-30 10:37 | 显示全部楼层 |阅读模式
动态数码管显示试验做 8位数码管计数器,只做好了一半,计数程序如何写啊?求补充计数器部分C语言程序.
*******************************************************************************/

  1. #include<reg51.h>

  2. //--定义使用的IO--//
  3. #define GPIO_DIG P0

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. //--定义全局变量--//
  8. unsigned char code DIG_CODE[17]={
  9. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  10. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  11. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  12. unsigned char DisplayData[8];
  13. //用来存放要显示的8位数的值

  14. //--声明全局函数--//
  15. void DigDisplay(); //动态显示函数
  16. /*******************************************************************************
  17. * 函 数 名         : main
  18. * 函数功能                   : 主函数
  19. * 输    入         : 无
  20. * 输    出         : 无
  21. *******************************************************************************/
  22. void main(void)
  23. {
  24.         unsigned char i;
  25.         for(i=0;i<8;i++)
  26.         {
  27.                 DisplayData[i]=DIG_CODE[i];        
  28.         }
  29.         while(1)
  30.         {
  31.                 DigDisplay();
  32.         }                                
  33. }
  34. /*******************************************************************************
  35. * 函 数 名         : DigDisplay
  36. * 函数功能                   : 使用数码管显示
  37. * 输    入         : 无
  38. * 输    出         : 无
  39. *******************************************************************************/
  40. void DigDisplay()
  41. {
  42.         unsigned char i;
  43.         unsigned int j;
  44.         for(i=0;i<8;i++)
  45.         {
  46.                 switch(i)         //位选,选择点亮的数码管,
  47.                 {
  48.                         case(0):
  49.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  50.                         case(1):
  51.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  52.                         case(2):
  53.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  54.                         case(3):
  55.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  56.                         case(4):
  57.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  58.                         case(5):
  59.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  60.                         case(6):
  61.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  62.                         case(7):
  63.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  64.                 }
  65.                 GPIO_DIG=DisplayData[i];//发送段码
  66.                 j=10;                                                 //扫描间隔时间设定
  67.                 while(j--);        
  68.                 GPIO_DIG=0x00;//消隐
  69.         }
  70. }
复制代码

回复

使用道具 举报

ID:66840 发表于 2014-9-30 11:29 | 显示全部楼层
位选的数组没定义

评分

参与人数 1威望 +10 黑币 +10 收起 理由
xiaojuan + 10 + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:66840 发表于 2014-9-30 12:16 | 显示全部楼层
数码管的数据输入端接到P0的8个I/O口吗
回复

使用道具 举报

ID:66840 发表于 2014-9-30 12:37 | 显示全部楼层
/*------------------------------------------------------
                     取显示数据
------------------------------------------------------*/
void DigDisplay()
{       
        for(n=0; n<17; n++)
        {
                GPIO_DIG = DIG_CODE[n]; //取显示数字的编码
                  Delay(1000); //延时大约1秒       
        }
}

/*-------------------------------------------------
                     延时函数
--------------------------------------------------*/
void Delay(unsigned int xms)
{
        unsigned char n, m;
        for(n=xms; n>0; n--)
        {
                for(j=110; j>0; j--);
        }
}

评分

参与人数 1威望 +10 黑币 +10 收起 理由
xiaojuan + 10 + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:51090 发表于 2014-9-30 13:01 | 显示全部楼层
[i] 改为 [ i] 就不会显示成斜体
回复

使用道具 举报

ID:59980 发表于 2014-9-30 14:30 | 显示全部楼层

位选的数组有啊:sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位        
                }


段码也是有的: GPIO_DIG=DisplayData;//发送段码
                j=10;                                                 //扫描间隔时间设定
                while(j--);        
                GPIO_DIG=0x00;//消隐




就差计数器,和进位显示处理程序了。
回复

使用道具 举报

ID:66032 发表于 2014-9-30 14:30 | 显示全部楼层
看了下, 写法有一些问题, 还是重改了下, 仅仅给你参考, 5年前用过89C52,现在都不用了。
#include<reg51.h>

//--?????IO--//
#define GPIO_DIG P0
#define uchar unsigned char
#define uint unsigned int

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//--??????--//
unsigned char code DIG_CODE[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0?1?2?3?4?5?6?7?8?9?A?b?C?d?E?F????
uchar num[8];
uint counter=0;
unsigned long second;

void delay(uint t)
{
    uint i,j;
    for (i=0; i<t; i++)
      for (j=0; j<1000; j++);
}
//*****************Add the interrupt for counting*************//
void time0_init()
{
        TMOD = 0x01;
        TH0  = 0xfc;
        TL0  = 0x67;
        TR0  = 1;       
}

void interrupt_init()
{
        EA  = 1;
        ET0 = 1;

}
//***********Using your 74HC138 to get the scanning *******************//
void refresh()
{
static uint8 j=0;//avoid scanning always start from 0; only initialize one time;       
   switch(j)
    {       
   
        case 0: LSA = 0; LSB = 0; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[0]];delay(2);break;
        case 1: LSA = 1; LSB = 0; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[1]];delay(2);break;
        case 2: LSA = 0; LSB = 1; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[2]];delay(2);break;
        case 3:        LSA = 1; LSB = 1; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[3]];delay(2);break;
        case 4: LSA = 0; LSB = 0; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[4]];delay(2);break;
        case 5: LSA = 1; LSB = 0; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[5]];delay(2);break;
        case 6:        LSA = 0; LSB = 1; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[6]];delay(2);break;
        case 7: LSA = 1; LSB = 1; LSC = 1; j=0; GPIO_DIG=DIG_CODE[num[7]];delay(2);break;
        default: break;       

   }

}
void main()
{
        time0_init();
        interrupt_init();
        while(1)
        {
            refresh();
        }


}


void time0_interrupt() interrupt 1
{            
                    
    TH0  = 0xfc;
    TL0  = 0x67;
    counter++;
    if (1000==counter)// many interrupt will creates the error;
        {
          counter=0;
          seccond++;// this is just for your reference, it's not accurate;
          if (99999999==sec)
            {
              sec = 0;
              num[0]=sec/10000000;
              num[1]=sec%10000000/1000000;
              num[2]=sec%1000000/100000;
              num[3]=sec%100000/10000;       
              num[4]=sec%10000/1000;       
              num[5]=sec%1000/100;       
              num[6]=sec%100/10;       
              num[7]=sec%10;       
             }
                               
           }
                               
}
               
       
回复

使用道具 举报

ID:66032 发表于 2014-9-30 14:31 | 显示全部楼层
定义有错误;改一下
#include<reg51.h>

//--?????IO--//
#define GPIO_DIG P0
#define uchar unsigned char
#define uint unsigned int

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//--??????--//
unsigned char code DIG_CODE[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0?1?2?3?4?5?6?7?8?9?A?b?C?d?E?F????
uchar num[8];
uint counter=0;
unsigned long sec;

void delay(uint t)
{
    uint i,j;
    for (i=0; i<t; i++)
      for (j=0; j<1000; j++);
}
//*****************Add the interrupt for counting*************//
void time0_init()
{
        TMOD = 0x01;
        TH0  = 0xfc;
        TL0  = 0x67;
        TR0  = 1;       
}

void interrupt_init()
{
        EA  = 1;
        ET0 = 1;

}
//***********Using your 74HC138 to get the scanning *******************//
void refresh()
{
static uint8 j=0;//avoid scanning always start from 0; only initialize one time;       
   switch(j)
    {       
   
        case 0: LSA = 0; LSB = 0; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[0]];delay(2);break;
        case 1: LSA = 1; LSB = 0; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[1]];delay(2);break;
        case 2: LSA = 0; LSB = 1; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[2]];delay(2);break;
        case 3:        LSA = 1; LSB = 1; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[3]];delay(2);break;
        case 4: LSA = 0; LSB = 0; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[4]];delay(2);break;
        case 5: LSA = 1; LSB = 0; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[5]];delay(2);break;
        case 6:        LSA = 0; LSB = 1; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[6]];delay(2);break;
        case 7: LSA = 1; LSB = 1; LSC = 1; j=0; GPIO_DIG=DIG_CODE[num[7]];delay(2);break;
        default: break;       

   }

}
void main()
{
        time0_init();
        interrupt_init();
        while(1)
        {
            refresh();
        }


}


void time0_interrupt() interrupt 1
{            
                    
    TH0  = 0xfc;
    TL0  = 0x67;
    counter++;
    if (1000==counter)// many interrupt will creates the error;
        {
          counter=0;
          seccond++;// this is just for your reference, it's not accurate;
          if (99999999==sec)
            {
              sec = 0;
              num[0]=sec/10000000;
              num[1]=sec%10000000/1000000;
              num[2]=sec%1000000/100000;
              num[3]=sec%100000/10000;       
              num[4]=sec%10000/1000;       
              num[5]=sec%1000/100;       
              num[6]=sec%100/10;       
              num[7]=sec%10;       
             }
                               
           }
                               
}
               
       

回复

使用道具 举报

ID:66840 发表于 2014-9-30 17:57 来自手机 | 显示全部楼层
sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4;
回复

使用道具 举报

ID:66840 发表于 2014-9-30 17:58 来自手机 | 显示全部楼层
这三个位应该是锁存控制端口
回复

使用道具 举报

ID:66032 发表于 2014-9-30 20:24 | 显示全部楼层
很显然是3转8的译码器
回复

使用道具 举报

ID:59980 发表于 2014-9-30 22:57 | 显示全部楼层
是的,3转8的译码器
回复

使用道具 举报

ID:59980 发表于 2014-9-30 23:00 | 显示全部楼层
Build target 'Target 1'
compiling LED.c...
LED.C(43): error C141: syntax error near 'j'
LED.C(82): error C202: 'seccond': undefined identifier
Target not created


还有错误哦!
回复

使用道具 举报

ID:19715 发表于 2014-9-30 23:29 | 显示全部楼层
hts2008222 发表于 2014-9-30 22:57
是的,3转8的译码器

138这译码器有个特别:
8位数码管,不管在哪一个时刻,不管程序怎么修改,
始终总是选中其中一位数码管。没有一瞬间,这8位数码管全部都是关闭的。
所以在打开每一位数码管之前,最好让段码关掉,也就是=0;
回复

使用道具 举报

ID:66032 发表于 2014-10-1 11:22 | 显示全部楼层
不好意思, 我没有编译器,有两处错误更正后,应该OK了

static uchar j=0;//avoid scanning always start from 0; only initialize one time;     
seccond++;// this is just for your reference, it's not accurate;
回复

使用道具 举报

ID:66032 发表于 2014-10-1 11:23 | 显示全部楼层
sec++;// this is just for your reference, it's not accurate;
回复

使用道具 举报

ID:59980 发表于 2014-10-1 18:15 | 显示全部楼层
好!我试试看。
回复

使用道具 举报

ID:59980 发表于 2014-10-1 18:19 | 显示全部楼层
Build target 'Target 1'
compiling LED.c...
LED.C(46): error C202: 'seccond': undefined identifier
LED.C(86): error C202: 'seccond': undefined identifier
Target not created
回复

使用道具 举报

ID:66032 发表于 2014-10-2 09:32 | 显示全部楼层
你改了这句没有?
sec++;// this is just for your reference, it's not accurate;
回复

使用道具 举报

ID:59980 发表于 2014-10-3 19:21 | 显示全部楼层
改了sec++;// this is just for your reference, it's not accurate;之后就这样啊!


Build target 'Target 1'
compiling LED.c...
LED.C(46): error C202: 'seccond': undefined identifier
LED.C(86): error C202: 'seccond': undefined identifier
Target not created
回复

使用道具 举报

ID:66032 发表于 2014-10-4 14:45 | 显示全部楼层
我看了下,没有second 这个变量,为什么还有提示没有定义?奇怪?
回复

使用道具 举报

ID:59980 发表于 2014-10-5 00:55 | 显示全部楼层
我也不清楚啊

回复

使用道具 举报

ID:59980 发表于 2014-10-5 00:58 | 显示全部楼层
现在我发现了一种比C语言更好的高级语言,但前提还是要先学会C语言,才可以更容易学的,叫PL/M语言,很强大的语言,如果能在论坛中有初级教程相信也会有很多人喜欢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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