打印

51单片机

[复制链接]
1080|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuangbao|  楼主 | 2016-12-3 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我写的程序,我想用定时器和数码管显示 时 分 秒,00-00-00,但是它就是跑动不了,还有我这样写显示子函数有没有问题?


#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit wela=P2^7;
sbit dula=P2^6;
uchar a,t0,shi,sec,fen,wei=0xfe;
void display(uchar sec,uchar fen,uchar shi);
void delay(uint x)                   //延时子函数
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}
void init()           
{
        TMOD=0x01;
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        EA=1;
        ET0=1;
        TR0=1;

}
void main()                                 //主函数
{
        while(1)
        {
                init();
                display(sec,fen,shi);
        }
}
void display(uchar sec,uchar fen,uchar shi)        //显视子函数
{
        uchar buf[8];                  //定义缓冲数组
        buf[0]=table[sec%10];
        buf[1]=table[sec/10%10];
        buf[2]=0x40;
        buf[3]=table[fen%10];
        buf[4]=table[fen/10%10];
        buf[5]=0x40;
        buf[6]=table[shi%10];
        buf[7]=table[shi/10%10];
        while(1)
        {
                uchar a;
                for(a=0;a<8;a++)
                {
                        wela=1;
                        P0=wei;
                        wela=0;
                        wei=_crol_(wei,1);        //循环选择位选,数码管是共阴的,
                        P0=wei;
       
                        dula=1;
                        P0=buf[a];
                        dula=0;
                        delay(2);
                }
        }
}
void time0() interrupt 1                 //定时器T0
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        t0++;
        if(t0==10)
        {
                sec++;
                t0=0;;
                if(sec==60)
                {
                        sec=0;
                        fen++;
               
                        if(fen==60)
                        {
                                shi++;
                                fen=0;
                                if(shi==24)                       
                                        shi=0;

                        }
                }
        }       
}

相关帖子

沙发
dirtwillfly| | 2016-12-4 18:46 | 只看该作者
程序要和硬件完美配合,才能正常跑起来。
单独看程序,不容易发现问题的

使用特权

评论回复
板凳
a136498491| | 2016-12-4 18:54 | 只看该作者
显示函数不要传入参数了,直接使用全局变量;
另外,显示,不是显"视"。

使用特权

评论回复
地板
NE5532| | 2016-12-4 21:59 | 只看该作者
请看《程序调试黑宝书》,像你这样写完了来找问题,神都做不到。

使用特权

评论回复
5
chuangbao|  楼主 | 2016-12-5 16:28 | 只看该作者
NE5532 发表于 2016-12-4 21:59
请看《程序调试黑宝书》,像你这样写完了来找问题,神都做不到。

好的。。。谢谢

使用特权

评论回复
6
zsttom| | 2016-12-8 23:46 | 只看该作者
把void display(uchar sec,uchar fen,uchar shi)这个函数中while(1)去掉

使用特权

评论回复
7
zhuls| | 2016-12-10 11:21 | 只看该作者
本帖最后由 zhuls 于 2016-12-10 11:22 编辑

void main()                                 //主函数
{
        init();//要初始化完才能进行循环,在接下来的循环中就不要再初始化,
       while(1)
        {
                  display(sec,fen,shi);
        }
}

要初始化完才能进行循环,在接下来的循环中就不要再初始化,看到你计数器中的
if(t0==10)
        {
                sec++;
                t0=0;;

说明一次中断是100ms..你之前主程序循环While(1)中一开始就就 init();综合你显示中的延时,计数还没中断,你的 init()就把计数器复位了。
你的t0=0;;这边为什么要2个;?不懂,求指点。
void display(uchar sec,uchar fen,uchar shi)        //显视子函数中为什么还要放个 while(1)?
你的位码、段码都从P0输出,有锁存电路吗?
你要么去网上找个能用的程序学习一下人家的编程方法,
要么就把原理图传上来。这样大家才好帮你的啊。
        

使用特权

评论回复
评论
ligao0302 2016-12-18 17:31 回复TA
这位仁兄正解! 另外f(t0==10) { sec++; t0=0; 这种计算不要放到中断中进行。 
8
hawa22| | 2016-12-10 12:04 | 只看该作者
借鉴借鉴

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

20

帖子

1

粉丝