找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3116|回复: 9
收起左侧

求助,我是初学者,也是业余爱好者,对51单片机c语言不是很了解,希望老师们多多指点

[复制链接]
ID:65179 发表于 2014-11-15 19:16 | 显示全部楼层 |阅读模式
本帖最后由 chweji123 于 2014-11-15 19:20 编辑

我有一个ds1302+4位数码管时钟带,年月,日周,时间,有一部分是抄袭的,有一部分只能学着开始修改程序没想到这玩意真难搞,搞几天头都高大了,嗨老天不负有心人终于有点点收获,只是不足之处就是要按键来切换,我想让它自动切换来显示,年月,日周,时间,不知道这个程序怎么写,望老师指点,在此谢了。

#include <at89x52.h>
#include <DS1302.h>
#define uchar unsigned char
/********************************************************/
unsigned char code shumg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff};
/********************************************************/
sbit led=P1^7;                                   //冒号闪烁
sbit buzz=P3^6;                            //报时IO输出
uchar a;
char miao_num;                                   //冒号标志
char didi_dd;                                   //闹铃标志
/********************************************************/
unsigned char Time[]={0,0,0,0};//用来储存,时间
unsigned char Dime[]={0,0,0,0};//用来储存,年月
unsigned char Bime[]={0,0,0,0};//用来储存,日期
unsigned char flag;
/********************************************************/
SYSTEMTIME  time1;   
/********************************************************/
void keyscan();                                  //按键扫描函数
void bao_shi();                                         //报时声明
void mao_hao();                                         //冒号声明
void nao_ling();                                 //闹铃声明
/********************************************************/
void delay(unsigned char i)      //延时子程序  
{
  unsigned char j;
  while((i--)!=0)
  {
    for(j=123;j>0;j--);
  }
}
/********************************************************/
void t0_init()                        //定时50ms一个中断
{
  TMOD=0x11;                                                  //总中断初始化
  TH0=(65536-50000)/256;                          //定时50ms一个中断
  TL0=(65536-50000)%256;                          //定时50ms一个中断
  TH1=(65536-50000)/256;                          //定时50ms一个中断
  TL1=(65536-50000)%256;                          //定时50ms一个中断
  EA=1;                                                                  //开启总中断
  ET0=1;                                                         
  ET1=1;                                                         
  TR0=1;                                                          //开启定时器0
  TR1=0;                                                          //关闭定时器1
}
/********************************************************/
unsigned char button_time(n,x,y)        //时钟调整子程序
unsigned char n,x,y;
{
if(P1_5==0)                                                        //加
  {
  delay(50);
if(P1_5==0)
{
n++;
if(n==x)
  n=0;
while(P1_5==0);
   }
}
/********************************************************/
if(P1_6==0)                                                //减
    {
   delay(50);
if(P1_6==0)
    {
if(n==0)
   n=y;
else
    n--;                                                
  while(P1_6==0);
    }
}
return n;                                                   //函数返回
}
/********************************************************/
void display(shi10,shi1,fen10,fen1)//显示子程序
{
  P2=0xf7;
  a=shumg[shi10];   //显示时的十位
  if(a==0xc0)                //如a是零让其它的数码管显示
          {
  P0=0xff;                        //消隐
  P2=0xff;                        //消隐
        }
  P0=a;                            //如a是1让它显示
  delay(1);                        //延时
  P0=0xff;
   
  P2=0xfb;
  P0=shumg[shi1];        //显示时的个位
  delay(1);                        //延时
  P2=0xff;                        //消隐
  P0=0xff;                        //消隐                                                         
  
  P2=0xfd;
  P0=shumg[fen10];  //显示分的十位
  delay(1);                        //延时
  P2=0xff;                        //消隐
  P0=0xff;                        //消隐
  
  P2=0xfe;
  P0=shumg[fen1];        //显示分的个位
  delay(1);                        //延时
  P2=0xff;                        //消隐
  P0=0xff;                    //消隐
}
/********************************************************/
void main()                                                        //主函数
{  
   Initial_DS1302();                                 //初始化DS1302这个时钟芯片,   
   t0_init();                                                 //中断初始化
   while(1)                                                         //大循环   
   {                                                                 
   mao_hao();                                                 //冒号初始
    nao_ling();                                                   //闹铃初始
     bao_shi();                                                 //报时初始
           keyscan();
  
  DS1302_GetTime(&time1);                       //读取时间参数            
  
  Bime[3]=(time1.Week)%10;                   //把时的个位数据存入Bime[3]
  Bime[2]=(time1.Week)/10;                         //把时的个位数据存入Bime[2]
  Bime[1]=(time1.Day)%10;                       //把时的个位数据存入Bime[1]
  Bime[0]=(time1.Day)/10;                     //把时的个位数据存入Bime[0]
  
  Dime[3]=(time1.Month)%10;                   //把时的个位数据存入Dime[3]
  Dime[2]=(time1.Month)/10;                         //把时的个位数据存入Dime[2]
  Dime[1]=(time1.Year)%10;                   //把时的个位数据存入Dime[1]
  Dime[0]=(time1.Year)/10;                         //把时的个位数据存入Dime[0]
  
  Time[3]=(time1.Minute)%10;                 //把分的个位数据存入Time[3]
  Time[2]=(time1.Minute)/10;                 //把分的十位数据存入Time[2]
  Time[1]=(time1.Hour)%10;                   //把时的个位数据存入Time[1]
  Time[0]=(time1.Hour)/10;                         //把时的十位数据存入Time[0]
}
}
/********************************************************/
void keyscan()                   //按键扫描函数
{
   if(P1_3==0)                                    //切换
        {
         delay(100);
        if(P1_3==0)
           {
           TR0=0;                                                        //有按键按下关闭定时器0
                miao_num=0;                                         //冒号常亮
                 flag++;
                if(flag>2)                                                //翻页年月日周按两次后启动定时器
                        {
                 flag=0;
                   TR0=1;                                                //启动定时器0
                        }
                }
        while(P1_3==0);
        }
/********************************************************/
        if(P1_4==0)                                    //设置
        {
         delay(100);
        if(P1_4==0)
           {
          TR0=0;                                                        //有按键按下关闭定时器0
         miao_num=0;                                                //冒号常亮
            flag++;                                                        
            if(flag>2)                                                //按两次后启动定时器
           {
           TR0=1;                                                        //启动定时器0
                }
          if(flag>4)                                                //按四次后关闭定时器
           {
           TR0=0;                                                        //关闭定时器0
          miao_num=0;                                                //冒号常亮
                }
        if(flag>8)                                                        //显示多少位和翻页按八次启动定时器
                        {
                 flag=0;
                  TR0=1;                                                //启动定时器0
                        }
                }
        while(P1_4==0);
        }
switch(flag)
        {
/********************************************************/
        case 0:display(Time[0],Time[1],Time[2],Time[3]);                //调用子函数display,把存入数组time的数据给显示出来
                        break;
        case 1:display(Dime[0],Dime[1],Dime[2],Dime[3]);                //调用子函数display,把存入数组Dime的数据给显示出来
                        break;
        case 2:display(Bime[0],Bime[1],Bime[2],Bime[3]);                //调用子函数display,把存入数组Bime的数据给显示出来
                        break;
/*******************************************************/        
        case 3:time1.Hour=button_time(time1.Hour,24,23);                //调整时                           
                        DS1302_SetTime(0x84,time1.Hour);
                        display(Time[0],Time[1],10,10);
                        break;


    case 4:time1.Minute=button_time(time1.Minute,60,59);        //调整分                           
                        DS1302_SetTime(0x82,time1.Minute);
                        display(10,10,Time[2],Time[3]);
                        break;
/*******************************************************/
               
        case 5:time1.Year=button_time(time1.Year,100,99);                //调整年                          
                        DS1302_SetTime(0x8c,time1.Year);
                        display(Dime[0],Dime[1],10,10);
                        break;
        
        case 6:time1.Month=button_time(time1.Month,13,12);                //调整月                           
                        DS1302_SetTime(0x88,time1.Month);
                        display(10,10,Dime[2],Dime[3]);
                        break;
/********************************************************/        
                                         
           case 7:time1.Day=button_time(time1.Day,32,31);                        //调整日
                        DS1302_SetTime(0x86,time1.Day);
                        display(Bime[0],Bime[1],10,10);
                        break;
        
        case 8:time1.Week=button_time(time1.Week,8,7);                        //调整周
                        DS1302_SetTime(0x8a,time1.Week);
                        display(10,10,Bime[2],Bime[3]);
                        break;
    }
}

回复

使用道具 举报

ID:51088 发表于 2014-11-15 20:22 来自手机 | 显示全部楼层
先看看。帮顶一下
回复

使用道具 举报

ID:68897 发表于 2014-11-16 17:05 | 显示全部楼层
先看看                                          
回复

使用道具 举报

ID:65179 发表于 2014-11-16 18:06 | 显示全部楼层
老师,大侠,哥哥,姐姐们,就帮帮我指点指点迷经,我只是想让它自动切换显示年月,日周,时间,可是这段程序是在不知道怎么写都停在这里了,为了找这段程序例子一天到论坛网都来好几趟,都是欢欢喜喜而来,空手而归
回复

使用道具 举报

ID:51088 发表于 2014-11-16 19:20 来自手机 | 显示全部楼层
我看你的定时器1还没有使用,你可以启动定时器一,然后把下面的程序写进中断程序里面去就行了
回复

使用道具 举报

ID:51088 发表于 2014-11-16 19:21 来自手机 | 显示全部楼层
  if(P1_3==0)                                    //切换         {          delay(100);         if(P1_3==0)            {            TR0=0;                                                        //有按键按下关闭定时器0                 miao_num=0;                                         //冒号常亮                  flag++;                 if(flag>2)                                                //翻页年月日周按两次后启动定时器                         {                  flag=0;                    TR0=1;                                                //启动定时器0                         }                 }         while(P1_3==0);
回复

使用道具 举报

ID:51088 发表于 2014-11-16 19:22 来自手机 | 显示全部楼层
由于我没有你的头文件,没法进行编译。这个方法理论上是觉得可行的
回复

使用道具 举报

ID:65179 发表于 2014-11-17 08:00 | 显示全部楼层
首先照您的方法去试试,其实中断器1做了整点闹铃用了,只是程序没有发上来,不行就把整个程序上来
回复

使用道具 举报

ID:26188 发表于 2014-11-17 10:26 来自手机 | 显示全部楼层
那就用定时器2
回复

使用道具 举报

ID:65179 发表于 2014-11-17 12:22 | 显示全部楼层
本帖最后由 chweji123 于 2014-11-17 13:31 编辑

我没有用定时器,自动翻页是可行就是时间有点短,差不多两秒一次,想把时间延长点还在慢慢调试,下面是我加了一段,还望老师多指点
k++;
//  if(k==200)
    if(k==0)                                    
        {
         delay(50);
         if(k==0)
          {
           TR0=0;                                                        
                miao_num=0;                                         
                 buzz=0;                                                
                 flag++;
                if(flag>2)
                        {                                       
                        flag=0;
                   TR0=1;
                          }
                delay(50);  
            if(k==0)  
                   {k=1;}                                       
        }
        while(k==0);
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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