打印

新人用单片机做的一个闹钟问题

[复制链接]
3062|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
情不醉信仰|  楼主 | 2015-1-26 18:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分模块写的  代码可能会多一点 麻烦大神帮忙看一下。被折磨好几天了 快崩溃
//-主函数 预定义和main()
#include<reg52.h>
#include"achieve.h"
void main()
{
        while(1)
        {
                key();
                delay(2);       
        }

}

//-------延时函数---------
void delay(uchar z)
{
        uchar i,j;
        i=z;
        for(;i>0;i--)
        {
                for(j=2;j>0;j--)
                {};
        }
}

#include<reg52.h>
#include"achieve.h"

sbit key1=P3^4;          //K1 设置第一次的时间
sbit key2=P3^5;          //K2 设置第二次的时间
sbit key3=P3^6;          //K3 启动闹铃
sbit key4=P3^7;          //K4  关闭闹铃


//--------按键程序------------
//--------是否要消抖----------
void key()
{
        P3=0xff;
        if(key1==0)
        {
        /*        delay(10);
                if(key1==0)*/
                        fun1();
        }       
        if(key2==0)
        {
        /*        delay(10);
                if(key2==0)*/
                        fun2();
        }
        if(key3==0)
        {
        /*        delay(10);
                if(key3==0)        */
                        begin();
        }
        if(key4==0)
        {
        /*        delay(10);
                if(key4==0)        */
                        close();
        }
}



//--------检测按键---------------
//注释掉了 延时
uchar temp;  //获取P3端口状态
uchar flag;
uchar keyscan()
{
        flag=0;
        P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                //delay(10);        //延时消抖
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)    //确认非外界因素 导致键盘按下
                {
                        temp=P3;
                        switch(temp)
                        {
                        case 0xee:{flag=1;break;}
                        case 0xde:{flag=2;break;}
                        case 0xbe:{flag=3;break;}
                        case 0x7e:{flag=4;break;}
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                }
        }


        P3=0xfd;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                //delay(10);        //延时消抖
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)    //确认非外界因素 导致键盘按下
                {
                        temp=P3;
                        switch(temp)
                        {
                        case 0xed:{flag=5;break;}
                        case 0xdd:{flag=6;break;}
                        case 0xbd:{flag=7;break;}
                        case 0x7d:{flag=8;break;}
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                }
        }


        P3=0xfb;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                //delay(10);        //延时消抖
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)    //确认非外界因素 导致键盘按下
                {
                        temp=P3;
                        switch(temp)
                        {
                        case 0xeb:{flag=9;break;}
                        case 0xdb:{flag=10;break;}
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                }
        }

        return flag;

}


#include<reg52.h>
#include"achieve.h"

/*sbit dula=P2^6;          //段选 位选控制
sbit wela=P2^7;*/          

sbit first=P0^0;
sbit two=P0^1;
sbit third=P0^3;
sbit fouth=P0^4;    //控制第 1,2,4,5个数码管 24小时制  XX:XX

uchar diyici[4];
uchar dierci[4];

uchar sum;  //if(!keyscan()) 改为  sum=keyscan();   if(sum)

int num0,num1;   //两次时间化为分钟数
uchar shu;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};


void fun1()
{
        sum=keyscan();
        if(!sum)
        {
                wela=1;
                first=0;
                wela=0;          //选通位选

                dula=1;
                P0=0x3f;
                dula=0;
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        diyici[0]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;

        sum=keyscan();
        if(!sum)
        {
                wela=1;
                two=0;
                wela=0;         

                dula=1;
                P0=0x3f;
                dula=0;
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        diyici[1]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;

        sum=keyscan();
        if(!sum)
        {
                wela=1;
                third=0;
                wela=0;          //选通位选

                dula=1;
                P0=0x3f;
                dula=0;
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        diyici[2]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;

        sum=keyscan();
        if(!sum)
        {
                wela=1;
                fouth=0;
                wela=0;          //选通位选

                dula=1;
                P0=0x3f;
                dula=0;
               
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        diyici[3]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;
}


void fun2()
{
        sum=keyscan();
        if(!sum)
        {
                wela=1;
                first=0;
                wela=0;          //选通位选

                dula=1;
                P0=0x3f;
                dula=0;
               
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        dierci[0]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;

        sum=keyscan();
        if(!sum)
        {
                wela=1;
                two=0;
                wela=0;          //选通位选

                dula=1;
                P0=0x3f;
                dula=0;
               
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        dierci[1]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;

        sum=keyscan();
        if(!sum)
        {
                wela=1;
                third=0;
                wela=0;          //选通位选

                dula=1;
                P0=0x3f;
                dula=0;
               
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        diyici[2]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;

        sum=keyscan();
        if(!sum)
        {
                wela=1;
                fouth=0;
                wela=0;          //选通位选

                dula=1;
                P0=0x3f;
                dula=0;
               
                while(!sum)
                {
                        sum=keyscan();
                }
        }
        dierci[3]=table[sum-1];
        dula=1;
        P0=table[sum-1];
        dula=0;
}


void begin()   
{
        num0=(diyici[0]*10+diyici[1])*60+diyici[2]*10+diyici[3];
        num1=(dierci[0]*10+dierci[1])*60+dierci[2]*10+dierci[3];
        if(num1>=num0)
                shu=num1-num0;
        else
                shu=num0-num1;
        liushuideng();               
}


void close()
{
        P1=0xff;
        TR0=0;
        dula=1;
        P0=0;
        dula=0;       

}



#include<reg52.h>
#include<intrins.h>
#include"achieve.h"

sbit deep=P2^3;

uchar time0,led;
int time1;

void liushuideng()
{ //使用中断以控制闹铃时间
        TMOD=0x01;  //工作方式
        TH0=(65536-50000)/256;        // 赋值
        TL0=(65536-50000)%256;
        EA=1;   //开定时器总中断
        ET0=1;        //开定时器T0中断
        TR0=1;        //启动定时器T0
        led=0xfe;
        P1=led;
}

void timer0() interrupt        1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        time0++;
        if(time0==20)
        {
                time0=0;
                led=_crol_(led,1);
                P1=led;
                time1++;
                if(time1==shu*60)
                        {
                                TR0=0;
                                deep=0;  //蜂鸣器响
                                dula=1;
                                P0=0;
                                dula=0;
                        }
        }               
}


#define uint unsigned int
#define uchar unsigned char

//------function---------
extern uchar flag;  //返回值,返回按下数字0-9的哪个值

//------interrupt---------
extern uchar time0,led;
extern int time1;

//------achieve-----------
extern int num0,num1;
extern uchar shu;

sbit dula=P2^6;
sbit wela=P2^7;

//-------各模块函数接口----------
void key();
void fun1();
void fun2();
void begin();
void close();
void delay(uchar z);
uchar keyscan();
void liushuideng();


谢谢论坛平台 谢谢各位有心进来帮忙解决的前辈!!!!非伸手


相关帖子

沙发
情不醉信仰|  楼主 | 2015-1-26 18:49 | 只看该作者
在#define uint unsigned int 这开始 是 .H 头文件 放了各个模块的函数声明
闹钟功能: 独立建K1-K4 对应端口 P3^4 -- P3^7    K1:设置现在时间  K2:设置要闹铃的时间  K3:启动 K4:关闭
输入用  矩键  只用了  三行   第三行的前二个。      在达到闹钟之前 流水灯以1S的速度闪烁(楼主比较喜欢单片机流水灯亮起来的感觉~~卡哇伊)  在线等 谢谢

使用特权

评论回复
板凳
情不醉信仰|  楼主 | 2015-1-26 18:55 | 只看该作者
Nobody ?

使用特权

评论回复
地板
ywzqdpj| | 2015-1-26 20:28 | 只看该作者
我顶贴一下,辛苦了

使用特权

评论回复
5
ywzqdpj| | 2015-1-26 20:45 | 只看该作者
while(!sum)
                {
                        sum=keyscan();
                }
这什么作用?

使用特权

评论回复
6
dirtwillfly| | 2015-1-26 21:14 | 只看该作者
好长的代码,楼主有什么问题?

使用特权

评论回复
7
情不醉信仰|  楼主 | 2015-1-26 21:35 | 只看该作者
ywzqdpj 发表于 2015-1-26 20:45
while(!sum)
                {
                        sum=keyscan();

等待下一次按键

使用特权

评论回复
8
情不醉信仰|  楼主 | 2015-1-26 21:42 | 只看该作者
dirtwillfly 发表于 2015-1-26 21:14
好长的代码,楼主有什么问题?

额 就是做的一个闹钟 然后那个 K1 K2功能不对  单独拿出来有测过 但是还是没找到问题所在   版主有时间看看那单独测的代码么

使用特权

评论回复
9
专注于嵌入式| | 2015-1-27 10:52 | 只看该作者
现在好多学生不知道怎么样问问题、你这样、没几个人帮你解决

使用特权

评论回复
10
icecut| | 2015-1-27 12:13 | 只看该作者
一万个人的代码有一万种写法....你还是先网上找个能用的吧

使用特权

评论回复
11
情不醉信仰|  楼主 | 2015-1-27 17:32 | 只看该作者
专注于嵌入式 发表于 2015-1-27 10:52
现在好多学生不知道怎么样问问题、你这样、没几个人帮你解决

额,我也确实不知道做的这个东西怎么问, 自己也搞不出,有蛋疼

使用特权

评论回复
12
情不醉信仰|  楼主 | 2015-1-27 17:33 | 只看该作者
icecut 发表于 2015-1-27 12:13
一万个人的代码有一万种写法....你还是先网上找个能用的吧

别人是可以 用  但还是要自己做过 才知道。。。。

使用特权

评论回复
13
fg888fg888| | 2015-1-27 18:45 | 只看该作者
没有认真看代码,你自己查一下是否有防抖,防抖时间延时10--20ms,用示波器看一下,延时的时间是否正确,按键按下的电平是否正确,另外增加一下检测按键松开!

使用特权

评论回复
14
949155525| | 2015-1-27 18:50 | 只看该作者
专注于嵌入式 发表于 2015-1-27 10:52
现在好多学生不知道怎么样问问题、你这样、没几个人帮你解决

能问出问题来问题他自己再加把劲就解决了,应试教育就是如此

使用特权

评论回复
15
icecut| | 2015-1-27 21:45 | 只看该作者
情不醉信仰 发表于 2015-1-27 17:33
别人是可以 用  但还是要自己做过 才知道。。。。

可是我们每个人不可能都好好指导啊.没时间也没那么的钱浪费

使用特权

评论回复
16
情不醉信仰|  楼主 | 2015-1-28 18:36 | 只看该作者
:hug: 此贴结了把,,自己折腾了~~~~~有 前辈 走嵌入式的 能简单说说学习方向么。 大二学生  目前学了  C语言 数据结构(写过贪吃蛇)   51单片机(额,还有些没学完。看的郭天祥视频)    接下来想买STM32的板子学学,有推荐的么   我们班有学的快一点的同学也是51直接转STM32 但是学了一点 都说学不动  要找16位过渡  我也有点没底气了。。。自学,求 各位 前辈分享点自己的经验  少走点弯路也好

使用特权

评论回复
17
huayuliang| | 2015-1-28 19:01 | 只看该作者
其实大家都不太喜欢看别人的代码。尤其是新手的代码,变量命名、程序结构啥的看着都累。。

大二先把51弄通了再说,汇编要掌握好,即便你以后不用汇编写程序,也对你有好处。
时间片懂不懂?任务调度啥的都得学。。。STM32你大三学也不迟。

使用特权

评论回复
18
dirtwillfly| | 2015-1-28 19:14 | 只看该作者
情不醉信仰 发表于 2015-1-28 18:36
此贴结了把,,自己折腾了~~~~~有 前辈 走嵌入式的 能简单说说学习方向么。 大二学生  目前学了  C语 ...

自学的话,可以从学习视频开始,现在网上视频很多,选一两个就行。然后找本书,和一块板子。多练习。

使用特权

评论回复
19
情不醉信仰|  楼主 | 2015-1-28 21:22 | 只看该作者
huayuliang 发表于 2015-1-28 19:01
其实大家都不太喜欢看别人的代码。尤其是新手的代码,变量命名、程序结构啥的看着都累。。

大二先把51弄通 ...

看到汇编 我就有几个关于汇编的问题想问。。。不是代码  一些方向把  能加个QQ咨询一下么。。一般问题自己百度解决 不烦人  303829298   只是我比较关心方向。。比较怕走错

使用特权

评论回复
20
huayuliang| | 2015-1-29 19:36 | 只看该作者
情不醉信仰 发表于 2015-1-28 21:22
看到汇编 我就有几个关于汇编的问题想问。。。不是代码  一些方向把  能加个QQ咨询一下么。。一般问题自 ...

汇编俺也····多少年没用过了。。唉~~想起人工编译的乐趣来了。。哈哈

使用特权

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

本版积分规则

5

主题

40

帖子

0

粉丝