找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2102|回复: 4
收起左侧

求各位大神指正,四位一体共阳极数码管数字钟程序,仿真能运行,实物就只显8个8,不动

[复制链接]
ID:318408 发表于 2020-1-4 14:23 | 显示全部楼层 |阅读模式
//采用8位数码管动态显示程序
//使用AT89C51单片机,12MHz晶振,P0输出字段码,P2口输出位选码
//用共阳极LED数码管,key0为调时分位选择键,key1为加1键,key2为减1键,key3为确定键


#include  "reg51.h"
//包含头文件
#define char unsigned char
//定义无符号字符型
char code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//共阳极LED数码管"0~9","-"的字段码
char code scan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//位选择码
char data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//显示缓冲区,时、分、秒初始为0,0x0b为"-"的编码
char data timedata[3]={0x00,0x00,0x00};
//分别为秒、分和小时的值
char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;


sbit  key0=P1^0;
sbit  key1=P1^1;
sbit  key2=P1^2;
sbit  key3=P1^3;
//定义四个按键


//1ms延时函数


delay1ms(int t)
{
int i,j;
for (i=0;i<t;i++)
        {
for(j=0;j<120;j++);
}
}


//按键处理函数


keyscan()
{
EA=0;
//关总中断
if (key0==0)         //判断第一个按键是否按下
        {
                   delay1ms(10);
                //按键消抖
                while (key0==0);
                //再次判断按键是否按下
                con++;
TR0=0;
ET0=0;
            //关定时/计数器,关T0中断
                if (con>=3)  
                {
con=0;
TR0=1;
ET0=1;
}
          }
                if (con!=0)
                {
                        if (key1==0)
                        //如果第二个按键按下
                        {
                                delay1ms(10);
                                while (key1==0);
                                timedata[con]++;
                                //加一功能
                                if (con==2)
con1=24;
else con1=60;                        
if (timedata[con]>=con1)
                                {timedata[con]=0;}
                        }
                }
                if (con!=0)
                {
                        if (key2==0)
                        //如果第三个按键按下
                        {
                                delay1ms(10);
                                while (key2==0);
                                timedata[con]--;
                                //减一功能
                                if (con==2)
con2=23;
else con2=59;                        
                                if (timedata[con]<=0)
                                {
timedata[con]=con2;
}
                        }
                 }
                        if(key3==0)
                   //如果第四个按键按下
                        {
                                delay1ms(10);
                                while(key3==0);
                                EA=1;
                                TR0=1;
                                ET0=1;        
                }
          EA=1;
        //开总中断
}


        //数码管显示函数


        scan()
        {
        char k;
        dis[0]=timedata[0]%10;
dis[1]=timedata[0]/10;
    dis[3]=timedata[1]%10;
dis[4]=timedata[1]/10;
    dis[6]=timedata[2]%10;
dis[7]=timedata[2]/10;
     for (k=0;k<8;k++)
                {
                        P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms(1);
P2=0x00;
                }
        }
        
        //主函数


        main()
        {
                TH0=0x3c;
TL0=0xb0;
                TMOD=0x01;
                //选择工作方式1
ET0=1;
TR0=1;
EA=1;
           while (1)
                {
                        scan();
                        //调用数码管显示scan()子函数
                        keyscan();
                        //调用按键处理keyscan()子函数
                }
}


//定时器/计数器T0中断服务函数


void time_intt0(void) interrupt 1
{
ET0=0;
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ms50++;
if (ms50==20)
        {
                ms50=0x00;
timedata[0]++;
                if (timedata[0]==60)
                {
                        timedata[0]=0;
timedata[1]++;
                        if (timedata[1]==60)
                        {
                                timedata[1]=0;
timedata[2]++;
                                if (timedata[2]==24)
                                {
                                        timedata[2]=0;
                                }
                        }
                }
        }
        ET0=1;
//开T0中断
}

protues仿真图,实物加了9012pnp型的三极管驱动数码管的位选。

protues仿真图,实物加了9012pnp型的三极管驱动数码管的位选。
回复

使用道具 举报

ID:235200 发表于 2020-1-4 20:51 | 显示全部楼层
显示程序scan()也要改为定时中断,放在主程序循环的时间是不定的,特别是按键操作的时候
回复

使用道具 举报

ID:213173 发表于 2020-1-4 21:11 | 显示全部楼层
直接用楼主这个程序仿真结果是008.008.00,与贴图不一致,原因是缓存数组有错
char data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};//显示缓冲区,时、分、秒初始为0,0x0b为"-"的编码
实际在段码数组里对应"-"的下标是0x0a,也就是10。
另外楼主在实际电路制作不成功可能是硬件搭建问题。51单片机I/O口高电平驱动能力不足以正常点亮数码管,要附加放大器。
再者这种按键程序根本不适合与数码管动态显示配套,会导致黑屏。
回复

使用道具 举报

ID:318408 发表于 2020-1-5 13:07 | 显示全部楼层
wulin 发表于 2020-1-4 21:11
直接用楼主这个程序仿真结果是008.008.00,与贴图不一致,原因是缓存数组有错
char data dis[8]={0x00,0x0 ...

加了三极管放大信号了的,有另外一组的师兄也是用的这个程序,能成功,不知道为什么我的这个就是不行
回复

使用道具 举报

ID:318408 发表于 2020-1-5 13:13 | 显示全部楼层
csmyldl 发表于 2020-1-4 20:51
显示程序scan()也要改为定时中断,放在主程序循环的时间是不定的,特别是按键操作的时候

是在scan函数里面,把定时器跟中断打开吗?按键操作的时候中断跟定时器是关闭了的,定时器不工作,调好了按下key3确定键的时候,才会继续走。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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