| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 447 人关注过本帖
标题:解释一下单片机的程序!!!!!自己实在是不理解
只看楼主 加入收藏
来生缘
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-9-21
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:2 
解释一下单片机的程序!!!!!自己实在是不理解
程序代码:
#include "AT89X51.H"
#include "delay.h"
#include "max7219.c"
#include "music.c"

#define uchar unsigned char
#define uint unsigned int idata
sbit ADD=P1^1;
sbit SUB=P1^0;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

void showDay(void);//显示时间
void showData(void);//显示日期
void showDishi(void);//显示定时
void int_0(void);//中断0
void int_1(void);//中断1
void flash_max7219(unsigned char n);//闪一个位max7219

/*********************************************************************/
/* 实时时钟模块 时钟芯片型号:DS1302 */
/*/
/*********************************************************************/
sbit T_CLK = P2^3; /*实时时钟时钟线引脚 */
sbit T_IO = P2^4; /*实时时钟数据线引脚 */
sbit T_RST = P2^5; /*实时时钟复位线引脚 */
/********************************************************************/
void v_RTInputByte(uchar ucDa); //往DS1302写入1Byte数据
uchar uc_RTOutputByte(void);// 从DS1302读取1Byte数据
void v_W1302(uchar ucAddr, uchar ucDa);//往DS1302写入数据
uchar uc_R1302(uchar ucAddr);//读取DS1302某地址的数据

void v_Set1302(uchar *pSecDa) ;//设置初始时间,,输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
void v_Get1302(uchar ucCurtime[]) ;//读取DS1302当前时间


uchar showTime[8]={0,0,10,0,0,10,0,0};//显示的时间**********************************************全局变量
uchar setTime[2]={0,0};//定时的设定
uchar time[7]={0,0x59,0x19,0x24,0x7,0x01,0x08};//秒 分 时 日 月 星期 年
uchar Tmod=7;//此时的调节模式
void main()
{
    delay_ms(200);
    initMAX7219();//初始化max7219
    cls();//清屏max7219

    EX0=1;
    EX1=1;
    IT1=1;//下降沿触发
    IT0=1;
    EA=1;//开中断

    v_Get1302(& time);
    showDay();   
    while(1)
    {
        v_Get1302(& time);
        showDay();
        if ((setTime[0]==time[2])&&(setTime[1]==time[1]))sound();
    }
}


//************************************************显示时间
void showDay(void)
{
    //将数据转化为显示格式
    showTime[7]=time[0] & 0x0f;//个位
    showTime[6]=time[0]>>4;//十位
    showTime[4]=time[1] & 0x0f;
    showTime[3]=time[1]>>4;
    showTime[1]=time[2] & 0x0f;
    showTime[0]=time[2]>>4;
    showTime[2]=showTime[5]=10;
    disp_88(& showTime);   
}
//*************************************************显示日期
void showData(void)
{
    showTime[7]=time[3] & 0x0f;
    showTime[6]=time[3]>>4;
    showTime[4]=time[4] & 0x0f;
    showTime[3]=time[4]>>4;
    showTime[1]=time[6] & 0x0f;
    showTime[0]=time[6]>>4;
    showTime[2]=showTime[5]=10;
    disp_88(& showTime);
}
//*************************************************显示定时
void showDishi(void)
{
    showTime[1]=setTime[0] & 0x0f;
    showTime[0]=setTime[0]>>4;
    showTime[4]=setTime[1] & 0x0f;
    showTime[3]=setTime[1]>>4;
    showTime[6]=12;
    showTime[7]=13;
    showTime[2]=showTime[5]=10;
    disp_88(& showTime);
}

//***********************************************中断0子程序
void int_0(void) interrupt 0
{
    uint i;
    EA=0;
    delay_ms(10);
    while(!INT0){;}
    Tmod+=1;
    if(Tmod==7)goto inout;
    if (Tmod==8)Tmod=0;
    while(1)
    {
        flash_max7219(Tmod);
        for (i=0;i<20000;i++)
        {
            if (!INT0)
            {
                delay_ms(40);
                while(!INT0){;}
                if(Tmod==6)goto inout;
                Tmod+=1;
                if(Tmod==8)Tmod=0;
            }
            else if ((!ADD) || (!SUB))//调节时间
            {
                switch(Tmod)
                {
                case 0:                                                        //
                    if (!ADD)
                    {
                        time[6]+=0x01;
                        if ((time[6] & 0x0f)==10)time[6]+=0x06;
                        if ((time[6]>>4)==10)time[6]=0;
                    }
                    else
                    {
                        time[6]-=0x01;
                        if ((time[6] & 0x0f)==15)time[6]-=0x06;
                        if ((time[6]>>4)==15)time[6]=0x99;
                    }
                    break;
                case 1:                                                        //
                    if (!ADD)
                    {
                        time[4]+=0x01;
                        if((time[4] & 0x0f)==10)time[4]+=0x06;
                        if(time[4]==0x13)time[4]=0x01;
                    }
                    else
                    {
                        time[4]-=0x01;
                        if((time[4] & 0x0f)==15)time[4]-=0x06;
                        if(time[4]==0)time[4]=0x12;
                    }
                    break;
                case 2:                                                        //
                    if (!ADD)
                    {
                        time[3]+=0x01;
                        if ((time[3] & 0x0f)==10)time[3]+=0x06;
                        if (time[3]==0x32)time[3]=1;
                    }
                    else
                    {
                        time[3]-=0x01;
                        if ((time[3] & 0x0f)==15)time[3]-=0x06;
                        if (time[3]==0)time[3]=0x31;
                    }
                    break;
                case 3:                                                        //
                    if (!ADD)
                    {
                        time[2]+=0x01;
                        if ((time[2] & 0x0f)==10)time[2]+=0x06;
                        if (time[2]==0x24)time[2]=0;
                    }
                    else
                    {
                        time[2]-=0x01;
                        if ((time[2] & 0x0f)==15)time[2]-=0x06;
                        if ((time[2]>>4)==15)time[2]=0x23;
                    }
                    break;
                case 4:                                                        //
                    if (!ADD)
                    {
                        time[1]+=0x01;
                        if ((time[1] & 0x0f)==10)time[1]+=0x06;
                        if (time[1]==0x60)time[1]=0;
                    }
                    else
                    {
                        time[1]-=0x01;
                        if ((time[1] & 0x0f)==15)time[1]-=0x06;
                        if ((time[1]>>4)==15)time[1]=0x59;
                    }
                    break;
                case 5:                                                        //定时
                    if (!ADD)
                    {
                        if (setTime[0]==0xAA)setTime[0]=0x24;
                        setTime[0]+=0x01;
                        if ((setTime[0] & 0x0f)==10)setTime[0]+=0x06;
                        if (setTime[0]==0x25)setTime[0]=0;
                        if (setTime[0]==0x24)setTime[0]=0xAA;
                    }
                    else
                    {
                        if (setTime[0]==0xAA)setTime[0]=0x24;
                        setTime[0]-=0x01;
                        if ((setTime[0] & 0x0f)==15)setTime[0]-=0x06;
                        if ((setTime[0]>>4)==15)setTime[0]=0x24;
                        if (setTime[0]==24)setTime[0]=0xAA;
                    }
                    break;                   
                case 6:                                                        //定分
                    if (!ADD)
                    {
                        setTime[1]+=0x01;
                        if ((setTime[1] & 0x0f)==10)setTime[1]+=0x06;
                        if (setTime[1]==0x60)setTime[1]=0;
                    }
                    else
                    {
                        setTime[1]-=0x01;
                        if ((setTime[1] & 0x0f)==15)setTime[1]-=0x06;
                        if ((setTime[1]>>4)==15)setTime[1]=0x59;
                    }
                    break;
                case 7:
                    break;
                }
                while((!ADD) || (!SUB)){;}
            }
        }
    }
inout:
    v_Set1302(& time);
    EA=1;
}
//**********************************************中断序1子程序
void int_1(void) interrupt 2
{
    showData();
    delay_ms(200);
}


//*****************************************闪一个位
void flash_max7219(unsigned char n)
{
    switch(n)
    {
    case 0:
        showData();
        delay_ms(40);
        //cls();
        showTime[0]=11;
        showTime[1]=11;
        disp_88(& showTime);
        break;
    case 1:
        showData();
        delay_ms(40);
        //cls();
        showTime[3]=11;
        showTime[4]=11;
        disp_88(& showTime);
        break;
    case 2:
        showData();
        delay_ms(40);
        //cls();
        showTime[6]=11;
        showTime[7]=11;
        disp_88(& showTime);
        break;
    case 3:
        showDay();
        delay_ms(40);
        //cls();
        showTime[0]=11;
        showTime[1]=11;
        disp_88(& showTime);
        break;
    case 4:
        showDay();
        delay_ms(40);
        //cls();
        showTime[3]=11;
        showTime[4]=11;
        disp_88(& showTime);
        break;
    case 5:
        showDishi();
        delay_ms(40);
        //cls();
        showTime[0]=11;
        showTime[1]=11;
        disp_88(& showTime);
        break;
    case 6:
        showDishi();
         delay_ms(40);
        //cls();
        showTime[3]=11;
        showTime[4]=11;
        disp_88(& showTime);
        break;
    }
}

//**************************************************加减处理
/*void changeTime(uchar nmod,uchar sty)
{
    nmod=sty=0;
}*/

/**********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7=T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}


/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月
星期 年 */
ucAddr += 2;
}
}
搜索更多相关主题的帖子: 单片机 
2012-05-29 21:47
来生缘
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-9-21
收藏
得分:0 
回复 楼主 来生缘
那个数组uchar time[7]={0,0x59,0x19,0x24,0x7,0x01,0x08};//秒 分 时 日 月 星期 年,为什么是0,0x59,0x19,0x24,0x7,0x01,0x08
2012-05-29 21:50
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:20 
你要看看DS1302的操作方法,这种跟底层相关的程序你不了解器件的工作原理是没法看的

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-05-30 06:22
快速回复:解释一下单片机的程序!!!!!自己实在是不理解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025276 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved