找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机时钟问题,仿真可以实物数码管很暗,蜂鸣器不响

[复制链接]
跳转到指定楼层
楼主
ID:419540 发表于 2018-12-3 11:22 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
时钟数码管显示不完全,下面是代码和图,而且第二个数码管不亮,最后一个数码管很暗,蜂鸣器不响,仿真成功的,要实现的功能是按键按一次响一次,可以校时校分的

#include  "reg51.h"
#define char unsigned char
char code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                     0x80,0x90,0xff,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  beep=P1^7;

//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)
        {
        beep=0;
delay1ms(10);
           beep=1;
        while (key0==0);
        con++;
        TR0=0;
        ET0=0;
        if (con>=3)
                {
                con=0;
                TR0=1;
                ET0=1;}
        }
        if (con!=0)
                {
                if (key1==0)
                        {
                                beep=0;
                          delay1ms(10);
                           beep=1;
                        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)
                        {
                                beep=0;
                        delay1ms(10);
                            beep=1;
                        while (key2==0);
                        timedata[con]--;
                        if (con==2) con2=23;else con2=59;                        
                        if (timedata[con]<=0)
                                {timedata[con]=con2;}
                        }
                }
         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;
        ET0=1;
        TR0=1;
        EA=1;
        while (1)
                {
                scan();
                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;
}

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

使用道具 举报

沙发
ID:316832 发表于 2018-12-3 14:54 | 只看该作者
大概看了一下楼主的程序,当调用按键子函数的时候就停止显示了,可能需要把显示程序移入定时中断自动扫描显示这样就不断在扫描按键时中断显示了。外出搬砖去了,回来再研究一下
回复

使用道具 举报

板凳
ID:316832 发表于 2018-12-3 20:44 | 只看该作者

#include  "reg51.h"
#define char unsigned char
char code dis_7[12]={//我的实验板引脚连接不规则,所以段码也不一样
                                0x21,  //"0"
                0xEB,  //"1"
                0x85,  //"2"
                0x83,  //"3"
                0x4B,  //"4"
                0x13,  //"5"
                0x11,  //"6"
                0xAB,  //"7"
                0x01,  //"8"
                0x03,  //"9"
                                0xFF,  //""0a
                0xDF,  //"-"0b
                     };//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳极LED数码管"0~9","灭"和"-"的字段码
char code scan_con[8]={0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f};//{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]={0,8,11};
//分别为秒、分和小时的值
char data ms50=0,con=0,con1=0,con2=0;

//char sec,min,hours;

sbit  key0=P1^6;
sbit  key1=P1^5;
sbit  key2=P1^4;
sbit  beep=P1^7;

//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)
        {
        beep=0;
        delay1ms(10);
           beep=1;
        while (key0==0);
        con++;
        TR0=0;
        ET0=0;
        if (con>=3)
                {
                con=0;
                TR0=1;
                ET0=1;}
        }
        if (con!=0)
                {
                if (key1==0)
                        {
                                beep=0;
                          delay1ms(10);
                           beep=1;
                        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)
                        {
                                beep=0;
                        delay1ms(10);
                            beep=1;
                        while (key2==0);
                        timedata[con]--;
                        if (con==2) con2=23;else con2=59;                        
                        if (timedata[con]<=0)
                                {timedata[con]=con2;}
                        }
                }
         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;
        ET0=1;
        TR0=1;
        EA=1;
        while (1)
                {
                scan();
                keyscan();
                }
}

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

void time_intt0(void) interrupt 1
{
    ET0=0;
    TR0=0;
    TH0=0x3c;
    TL0=0xb0;
    TR0=1;
    ms50++;
        if (ms50==10)//我是用6Mhz晶振
        {
        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;
}经测试显示正常

评分

参与人数 1黑币 +12 收起 理由
zkele + 12 回帖助人的奖励!以资鼓励!

查看全部评分

回复

使用道具 举报

地板
ID:316832 发表于 2018-12-3 20:45 | 只看该作者
请参考,楼主请先确定你的数码管是共阴还是共阳,段码是否一致,晶振是多少M的,然后慢慢查原因,祝你成功

评分

参与人数 1黑币 +12 收起 理由
zkele + 12 回帖助人的奖励!以资鼓励!

查看全部评分

回复

使用道具 举报

5#
ID:433249 发表于 2018-12-3 20:49 | 只看该作者
硬件图呢?
回复

使用道具 举报

6#
ID:157238 发表于 2018-12-3 21:09 | 只看该作者
先检查一下硬件电路有没有问题。单片机的io口的驱动能力是很弱的,输出的电流很小,数码管所需的电流较大,所以需要加三极管放大一下,这应该就是你数码管显示很暗的原因,蜂鸣器的话你看看你使用的蜂鸣器是有源的还是无源的,有源蜂鸣器的话里面有振荡源,通直流电的话会一直响,无源蜂鸣器的话里面没有振荡电源,所以只当通电的一瞬间会“哔”的响一下,需要输出脉冲波才能不断的触发,不断的响。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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