找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2987|回复: 8
收起左侧

单片机用按键来控制数码管倒数总是有问题 小白求助

[复制链接]
ID:237524 发表于 2017-10-7 15:32 | 显示全部楼层 |阅读模式
我在做一个用按键来控制数码管倒数,当小时、分钟、秒都为零时,报警响起,大佬们帮忙看一下哪里错了吧,,写到后面我自己都乱了。。

#include<reg52.h>
sfr P0M0=0x93;
sfr P0M1=0x94;
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr P2M0=0x95;
sfr P2M1=0x96;
sfr P3M0=0xb1;
sfr P3M1=0xb2;
#define fosc 11059200L
#define TO_50ms(65536-50000*(fosx/12000000L))   //50ms定时参数
sbit en1=P2^6;                   //个位  秒
sbit en2=P2^7;                   //十位  秒
sbit en3=P2^5;                   //个位  分
sbit en4=P2^4;         //十位  分
sbit en5=P2^3;         //个位  时
sbit en6=P2^2;         //十位  时
sbit clear=P1^0;           //清零                           
sbit char display_num,count_in_TO;     //计数值、进入定时器的次数
sbit alert=P3^2;     //报警输入
sbit speaker=P0^2;   //报警输出
sbit led=P0^0;       //工作指示
/*
共阴级数码管0~9的字形码
*/
coust unsigned char seg7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int init_port()
{
        //配置P0模式为开漏输出
        P0M1=0xff;
        P0M0=0xff;
        P1M1 |=0x01;                                                          //P1.0输入
        P1M0 |=0x00;
        P2M1 |=0xc0;
        P2M0 |=0xc0;

        clear=1;
}

bit run_flag;        //工作标志
int ms_delay(unsigned int t)
{
         unsigned int i;
        for(t;t>0;t--)                         //外层循环t次
                for(i=110;i>0;i--);                          //内层循环110次
}
//INTO中断服务程序
int INTO_interrupt() interrupt 0
{
        EXO=0;                   //关INTO中断
        run_flag=0;
}
int init_int()
{
        ITO=1;                                                //设置INTO为下降沿触发
        EXO=1;                                                //允许INTO中断
}
int INTO_interrupt() interrupt 1                 
{
        running=~running;     //切换暂停/计时
        if(running)
        {                                          //切换为运行
                TRO=1;
        }
        else
        {                                          //切换为暂停
                TRO=0;
        }
}
int TimerO_interrupt() interrupt 2
{
        THO=TO_50ms >>8;      //重新初值
        TLO=TO_50ms;
        if((++ count_in_TO)==20) //count_in_TO自加到20.计时1s
        {
                count_in_TO=0;
                if((++display_num)==60)
                {                                  //display_num自加1后判断是否等于60
                        dispaly_num=0;
                }
        }
}
int init_timer()
{
        TMOD=0x09;         //定时器0模式1,16bit
        THO=TO_50ms >>8;   //THO=TO_50ms/256
        TLO=TO_50ms;       //TLO=TO_50ms%256
        ETO=1;
}
int display1(unsigned char c2,unsigned char c1)
{
        P0=seg7[c2];                     //送入秒十位的段码
        en2=0;                                         //显示DS2
        ms_delay(10);
        en1=1;                                         //关闭DS2

        P0=seg7[c1];                          //送入秒个位的段码
        en1=0;                //显示DS1
        ms_delay(100);
        en1=1;                 //显示DS1
}
int display2(unsigned char c3,unsigned char c4)
{
        P0=seg7[c3];                     //送入分个位的段码
        en3=0;                                         //显示DS2
        ms_delay(10);
        en1=1;        

        P0=seg7[c4];                     //送入分十位的段码
        en4=0;                                         //显示DS2
        ms_delay(10);
        en1=1;        
}
int display3(unsigned char c5,unsigned char c6)
{
        P0=seg7[c5];                     //送入时个位的段码
        en5=0;                                         //显示DS2
        ms_delay(10);
        en1=1;        

        P0=seg7[c6];                     //送入时十位的段码
        e6=0;                                         //显示DS2
        ms_delay(10);
        en1=1;        
}
int        while(1)                //报警程序
        {
                if(display3_num=0)
                {                                 //正常运行
                        if(display2_num=0)
                        {
                                if(display1_num=0)
                                           speaker=1;
                        }
                }
        }
int while(2)
{
          TR1=0;                                //若按下K1键,则定时器T1关闭,时钟暂停
        if(K2==0)                                //若按下K2键
         {
                Delay_ms(10);                //延时去抖
                if(K2==0)
                {
                        while(!K2);                //等待K2键释放
                        hour++;                //小时调整
                        if(hour==24)
                        {
                                hour = 0;
                        }
                }
        }
        if(K3==0)                                //若按下K3键
         {
                Delay_ms(10);
                if(K3==0)
                {
                        while(!K3);                //等待K3键释放
                           min++;                //分钟调整
                        if(min==60)
                        {
                                min = 0;
                        }               
                }
        }
        if(K4==0)                                //若按下K4键
         {
                Delay_ms(10);
                if(K4==0)
                {
                        while(!K4);                //等待K4键释放
                                                   sec++;
                                                if(sec==60)
                                                {
                                                        sec=0;
                                                }
                        TR1=1;                //调整完毕后,时钟恢复走时
                        K1_FLAG=0;                //将K1键按下标志位清0
                }
        }        
}
int while(3)                                         //按键
{
        shi=display1_num/10;
        ge=display1_num%10;
        display1(shi,ge);
        shi=ge=0;
        shi=display2_num/10;
        ge=display2_num%10;
        display2(shi,ge);
        shi=ge=0;
        shi=display3_num/10;
        ge=display3_num%10;
        display3(shi,ge);
        //检测清零按键
        if(clear==0)
        {
                ms_delay(10)
                if(clear==0)
                {                                  //确认按下清零按钮
                        if(!running)   //如果处于暂停状态
                        display=0;
                }
        }
}
int while(4)
{
        int num;
        num=display3*3600+display*60+display;
        if(num==0)
        {
                speaker=1;
        }
        else
        {
                display3_num=num/3600;
                display2_num=(num%3600)/60;
                display1_num=(num%3600)%60;

        }
        
}
main()
{
        //配置端口模式
        P0M1=0x03;              //P0.1、P0.0输出
        P0M0=0x03;
        P3M1=0x04;                            //P3.2输入
        P3M0=0x00;

        unsigned char shi,ge;          //定义十位、个位要输出的数据
        init_port();
        init_int();
        init_timer();

        display1_num=0;
        display2_num=0;
        display3_num=0;
        count_in_TO=0;
        running=0;
        //把两个数码管都关闭
        en2=1;
        en1=1;


        ITO=0;      //设置INTO为低电平触发
        EXO=1;      //允许INTO中断
        EA=1;       //开总中断

        while(2)                 //按键
        while(4)                 //倒数
        while(3)                 //暂停

        alert=1;
        speaker=1;

        while(1)
        
}

回复

使用道具 举报

ID:123289 发表于 2017-10-8 00:25 | 显示全部楼层
学会先画程序流程图、框图,再按图写程序,就不会乱了。
回复

使用道具 举报

ID:236614 发表于 2017-10-8 08:28 | 显示全部楼层
调用的函数全部错误,程序上太多while,while会给你放坑,而且while也不是那样用的。
回复

使用道具 举报

ID:237524 发表于 2017-10-8 09:35 | 显示全部楼层
yzwzfyz 发表于 2017-10-8 00:25
学会先画程序流程图、框图,再按图写程序,就不会乱了。

嗯嗯,,,好的,,我试试啊
回复

使用道具 举报

ID:111634 发表于 2017-10-8 15:18 | 显示全部楼层
实例96  能预置初值的倒计时秒表
Proteus仿真一下,确认有效。
实例96 能设置初值的倒计时秒表.rar (40 KB, 下载次数: 5)
回复

使用道具 举报

ID:237812 发表于 2017-10-8 15:23 | 显示全部楼层
你这个在主程序用while(2),这个是死循环,按键怎么能得到处理。程序怪怪的
回复

使用道具 举报

ID:237524 发表于 2017-10-25 21:34 | 显示全部楼层
zl2168 发表于 2017-10-8 15:18
实例96  能预置初值的倒计时秒表
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设 ...

嗯嗯,,谢谢大佬费心了。我看看啊
回复

使用道具 举报

ID:212797 发表于 2017-10-27 12:31 | 显示全部楼层
程序里面的int while(2)这些是什么?函数吗?感觉有些怪
回复

使用道具 举报

ID:242454 发表于 2017-10-27 13:48 | 显示全部楼层
这个程序真心有点看不大懂,程序写的太拖拉   ,WHILE里面个数值 那肯定是进私循环了,

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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