xzm8469105 发表于 2010-1-11 23:23:45

初学51,制作了一个电子钟,四个按键可设置时间和闹钟参数,用了AT89S52,DS1302,DS18B20,G

我是个大二的,刚学单片机一个学期了,刚刚做了个电子钟,拿上来个大伙点评点评,有错的地方请大伙说出来,好让我学习学习,再改进一下;
这里是程序C代码:


这是原程序,因为在网页上显示出来没退格比较不好看ourdev_525119.rar(文件大小:5K) (原文件名:晶振12MHz   AT89s52+12232+DS1302+DS18B20电子钟.rar)




/****************AT89S52 + G12232F + DS1302 + DS18B20 电 子 钟   **********************/
//主要功能:用DS1302实现精准电子钟,闹钟
//           用DS18B20采集温度
//           用四个独立按键可对时间,闹钟,进行调节
//石英晶振:12MHz
/*********************************************************************************/


#include <reg52.h>                                         //头文件
#include <intrins.h>                       
#define uchar unsigned char                        //宏定义
#define uint unsigned int
sbit DS1302_SCLK=P0^7;                        //定义时钟芯片DS1302时钟线
sbit DS1302_IO=P0^6;                        //定义时钟芯片DS1302数据线
sbit DS1302_RST=P0^5;                        //定义时钟芯片DS1302复位线
sbit G12232_CS=P2^0;                        //定义液晶片选引脚
sbit G12232_DI=P2^1;                        //定义液晶数据线
sbit G12232_SCLK=P2^2;                        //定义液晶时钟线
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit KEY0=P3^2;
sbit KEY1=P3^3;
sbit KEY2=P3^4;
sbit KEY3=P3^5;
sbit DQ=P0^2;                                //定义DS18B20的单总线引脚
sbit fm=P0^3;                                //定义蜂鸣器引脚



/*******************************函数申明 **************************************/

void delay_us(uchar x);                                           //延时 2 * x + 5 us
void delay_ms(uint z);                                        //延时任意Ms
void DS1302_writebyte(uchar writebyte);                        //往DS1302写一个字节
uchar DS1302_readbyte();                                        //往DS1302读一个字节
uchar DS1302_read(uchar DS1302_add);                          //往DS1302指定地址读数据
void DS1302_write(uchar DS1302_add,uchar DS1302_data);      //往DS1302指定地址写数据
void DS1302_init();                                        //DS1302初始化函数
void DS1302_set_time();                                        //设置时间
void DS1302_read_time();                                        //读取时间
void G12232_send_byte(uchar G12232_data);                        //往G12232发送一个字节
void G12232_write_com(uchar G12232_data);                        //往G12232写命令
void G12232_write_data(uchar G12232_data);                         //往G12232写数据       
void week(uchar week);                                         //星期代码
void G12232_init();                                           //液晶初始化函数
void keyscan() ;                                                  //键盘扫描
void keyscan_waibu();                                          //进入外部中断的键盘扫描,用于设定时间
void keyscan_nz();                                                  //进入闹钟扫描按键,用于闹钟设置
void G12232_write_time();                                        //往液晶写入时间参数
void DS18B20_init();                                           //DS18B20初始化
void DS18B20_writeByte(uchar cmd);                                //DS18B20写一个字节
uchar DS18B20_readByte();                                    //DS18B20读一个字节
void DS18B20_read();                                            //读取DS18B20的温度
void nz_jc();                                                                        //闹钟检测函数

/*********************************************************************************/





/******************************** 全局变量*************************************/

char w,nian,yue,ri,xingqi,shi,fen,miao;
char nz_xingqi,nz_shi,nz_fen,nz_miao;
uchar wbzd,nz,t0,wh,wl;
bit naozhong;
uint wx,wz,t1;

/********************************************************************************/




void main()
{
       
        DS1302_init();                      //调用时钟芯片DS1302的初始化函数
        G12232_init();                     //调用液晶G12232的初始化函数
        TMOD=0x11;                      //设置定时器0,定时器1工作在方式1                                       
        TH0=0xd8;
        TL0=0xf0;                      //10ms溢出进入中断
        TH1=0x3c;
        TL1=0xb0;                                  //50ms溢出进入中断
        EA=1;                              //开总中断
        ET0=1;                        //开定时器0中断
        ET1=1;                        //开定时器0中断
        EX0=1;                        //开外部中断0
        fm=0;
        while(1)
        {                
       
                DS1302_read_time();                        //调用读取DS1302时间参数函数
                G12232_write_time();                //调用写时间参数进液晶的函数
                keyscan();                                        //调用键盘扫描
                nz_jc();
       
        }

}

/*************************** 外 部 中 断 0 程 序************************************/
//功能:按键触发,对时间进行调节
/*******************************************************************************/

void int0() interrupt 0          //外部中断0程序
{
        EX0=0;                                //进入中断后关外部中断开关               
        wbzd=0;                                //循环控制变量
        DS1302_read_time();
        DS1302_write(0x8e,0x00);                 //关写保护
        DS1302_write(0x80,0x80);                 //关时间       
        DS1302_write(0x8e,0x80);                //开写保护
        G12232_write_com(0x01);                //清除显示
        G12232_write_time();                //将时间参数写入液晶
        while(!wbzd)
        {
                keyscan_waibu();               //进入外部中断的键盘扫描,用于设定时间
        }
        EX0=1;                                //中断函数结束时再开外部中断开关
}

/*******************************************************************************/





/******************************* 定 时 器 0 程 序 ***********************************/
//功能:,用于判断按键被按下的时间,时间按键的多功能
/*******************************************************************************/

void time0() interrupt 1   //定时器0程序
{
        TH0+=0xd8;
        TL0+=0xf0;                        //10ms溢出进入中断
        t0++;
}

/*******************************************************************************/






/******************************* 定时器 1 程序 *************************************/
//功能:闹钟到了,蜂鸣器响一分钟
/********************************************************************************/

void time1() interrupt 3
{
        TH1+=0x3c;
        TL1+=0xb0;
        t1++;
        if(t1==1200)
        {
                t1=0;
                TR1=0;
                TH1=0x3c;
                TL1=0xb0;
                fm=0;
        }
}

/********************************************************************************/








/*******************************us 级 延 时 函 数 **********************************/
//功能:延时任意微秒,理论上7~515us
/*******************************************************************************/

void delay_us(uchar x)//延时 2 * x + 5 us
{
        while(--x);                        //实现精准延时,us级别

}

/*******************************************************************************/





/*******************************ms 级 延 时 函 数 *********************************/
//功能:延时任意毫秒,理论上1~65535ms
/*******************************************************************************/

void delay_ms(uint z)                //延时任意Ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=123;y>0;y--);

}

/*******************************************************************************/









/****************************** 闹 钟 检 测 函 数 *********************************/
//功能:检测闹钟设的参数是否是此时时间参数相同的,相同的话驱动蜂鸣器响1分钟
/*******************************************************************************/

void nz_jc()
{
        if((naozhong==1)&&(nz_xingqi==xingqi)&&(nz_shi==shi)&&(nz_fen==fen)&&(nz_miao==miao))
        {
                fm=1;
                TR1=1;       
        }
}

/********************************************************************************/







/****************************** DS18B20 初 始 化 ***********************************/
//功能:向DS18B20发复位信号,并检测DS18B20回发的存在信号
/********************************************************************************/

void DS18B20_init()           //DS18B20初始化
{
        while(1)
        {
                DQ=1;               //拉高数据总线线
                _nop_();               //延时1us
                DQ=0;               //拉低数据总线       
                delay_us(250);        //延时505us
                DQ=1;               //释放总线       
                delay_us(40);       //延时85us,等待DS18B2发存在信号
                if(!DQ)               //DS18B20发存在脉冲则退出循环,无存在信号则重发初始化信号
                        break;
        }
        delay_us(110);                 //延时225us
        DQ=1;                          //释放总线

}

/*******************************************************************************/






/************************* 向 DS18B20 写 一 个 字 节 *********************************/

void DS18B20_writeByte(uchar cmd)        //DS18B20写一个字节
{
       uchar i;
       for(i=0;i<8;i++)                        //发八位
       {
               if(cmd&0x01)
                {
                        DQ=0;                //拉低数据总线,产生写时隙
                        delay_us(5);          //延时15us
                        DQ=1;                   //写 1
                }
                else
                {
                        DQ=0;               //写 0
                        delay_us(5);        //延时15us
                }
                delay_us(25);                //延时55us,等待DS18B20进行采样
                DQ=1;                       //释放总线
                _nop_();       //延时1us
                cmd>>=1;               //数据右移一位,发下一位
       }
}
/********************************************************************************/





/************************* 向 DS18B20 读 一 个 字 节 *********************************/

uchar DS18B20_readByte()          //DS18B20读一个字节
{
        uchar i,tmp;
        for(i=0;i<8;i++)                       //读八位
        {
                DQ=1;                        //拉高总线
                _nop_();                         //延时1us               
                tmp>>= 1;                           
                      DQ=0;                                //读时隙
                _nop_();                       //延时1us
                _nop_();                       //延时1us
                _nop_();                       //延时1us
                _nop_();                       //延时1us
                DQ=1;                              //释放总线
                delay_us(3);                   //延时11us
                if(DQ)                        //开始读位
                        tmp|=0x80;
                delay_us(25);                      //延时55us
               
        }
        return tmp;                            //将所读到的一个字节返回
}

/*******************************************************************************/






/****************************读取DS18B20的温度***********************************/
//功能:读取DS18B20的温度,并把温度值送到液晶上显示
/*******************************************************************************/

void DS18B20_read()                //读取DS18B20的温度
{
        DS18B20_init();                                            //初始化
        DS18B20_writeByte(0xcc);                        //发跳过ROM命令
        DS18B20_writeByte(0x44);                         //发温度转换命令
        _nop_();                                        //延时1us,等待转换
        DS18B20_init();                                //初始化
        DS18B20_writeByte(0xcc);                        //发跳过ROM命令
        DS18B20_writeByte(0xbe);                        //发读暂存器命令
        wl=DS18B20_readByte();                        //开始温度读低字节
        wh=DS18B20_readByte();                        //再读温度高字节
        _nop_();                                        //延时1us
        wx=(wl&0x0f)*625;                         //温度小数部分处理
        wz=wh*16+(wl>>4);                         //温度正数部分处理       
        G12232_write_com(0x92);                        //液晶光标跳到0x92位置
        G12232_write_data(wz/10+0x30);                //往液晶送温度数据
        G12232_write_data(wz%10+0x30);
        G12232_write_data('.');
        G12232_write_data(wx/1000+0x30);
        G12232_write_data(wx/1000%100+0x30);
        G12232_write_data(wx/100%10+0x30);
        G12232_write_data(wx%10+0x30);       
}

/*******************************************************************************/






/***************************** DS1302 的 初 始 化 **********************************/
//功能:上电时对时钟芯片DS1302里面的数据全部清零
/*******************************************************************************/

void DS1302_init()         //DS1302 的 初 始 化,将所有参数全清零
{
        DS1302_write(0x8e,0x00);                 //关写保护
        DS1302_write(0x80,0x80);                 //关时间
        DS1302_write(0x80,0x00);
        DS1302_write(0x82,0x00);
        DS1302_write(0x84,0x00);
        DS1302_write(0x86,0x00);
        DS1302_write(0x88,0x00);
        DS1302_write(0x8a,0x00);
            DS1302_write(0x8c,0x00);
        DS1302_write(0x80,0x00);                //开时间
        DS1302_write(0x8e,0x80);                //开写保护
}

/*******************************************************************************/






/*************************** G12232 液 晶 初 始 化 函 数 ******************************/
//功能:初始化液晶
/*******************************************************************************/

void G12232_init()                               //G12232液晶初始化函数
{
        G12232_write_com(0x01);                //清除显示
        G12232_write_com(0x02);                //地址位归零
        G12232_write_com(0x0c);                //开显关游标
        G12232_write_com(0x06);                //光标移动方向
        G12232_write_com(0x30);                //基本功能设定
       
}

/*******************************************************************************/







/******************************* DS1302 读 一 个 字 节 ******************************/
ucharDS1302_readByte()
{
   uchar i;
   for(i=8;i>0;i--)               
   {               
   ACC=ACC>>1;               
   ACC7=DS1302_IO;
   DS1302_SCLK=1;
   DS1302_SCLK=0;                                       
   }
   return(ACC);
}
/*******************************************************************************/






/******************************* DS1302 写 一 个 字 节 ******************************/
voidDS1302_writeByte(uchar tdata)
{
   uchar i;
   ACC=tdata;
   for(i=8;i>0;i--)
   {
   DS1302_IO=ACC0;
   DS1302_SCLK=1;
   DS1302_SCLK=0;
   ACC=ACC>>1;
   }
}
/********************************************************************************/






/******************************* DS1302 写 操 作**********************************/
void DS1302_write(uchar tadd,uchar tdata)
{
   DS1302_RST=0;
   DS1302_SCLK=0;
   DS1302_RST=1;
   DS1302_writeByte(tadd);
   DS1302_writeByte(tdata);
   DS1302_RST=0;
   DS1302_SCLK=1;
}
/********************************************************************************/




/******************************* DS1302 读 操 作**********************************/
uchar DS1302_read(uchar tadd)
{
   uchar tdata;   
   DS1302_RST=0;
   DS1302_SCLK=0;
   DS1302_RST=1;
   DS1302_writeByte(tadd);
   tdata=DS1302_readByte();
   DS1302_RST=0;
   DS1302_SCLK=1;
   return(tdata);
}
/********************************************************************************/





/****************************** DS1302 设 置 时 间 **********************************/
//功能:对已经调节好的时间参数写到DS1302中
/*********************************************************************************/

void DS1302_set_time()       //设置时间
{
        DS1302_write(0x8e,0x00); //关写保护
        DS1302_write(0x80,0x80); //关时间
        DS1302_write(0x8c,(nian/10<<4)|(nian%10));
        DS1302_write(0x8a,(xingqi/10<<4)|(xingqi%10));
        DS1302_write(0x88,(yue/10<<4)|(yue%10));
        DS1302_write(0x86,(ri/10<<4)|(ri%10));
        DS1302_write(0x84,(shi/10<<4)|(shi%10));
        DS1302_write(0x82,(fen/10<<4)|(fen%10));
    DS1302_write(0x80,(miao/10<<4)|(miao%10));
        DS1302_write(0x8e,0x80);//开写保护

}

/*******************************************************************************/




/****************************** DS1302 读 取 时 间 *********************************/
//功能:读取时钟芯片DS1302的时间参数
/*******************************************************************************/

void DS1302_read_time()    //读取时间
{
        miao=DS1302_read(0x81);
        fen   =DS1302_read(0x83);
        shi   =DS1302_read(0x85);
        ri    =DS1302_read(0x87);
        yue   =DS1302_read(0x89);
        xingqi=DS1302_read(0x8b);
        nian=DS1302_read(0x8d);

}       

/*******************************************************************************/





/**************************G12232 显 示 时 间 参 数 ********************************/
//功能:将DS1302读取回来的时间参数送到液晶上显示
/*******************************************************************************/

void G12232_write_time()
{
        G12232_write_com(0x80);
        G12232_write_data('2');
        G12232_write_data('0');
        G12232_write_data((nian>>4)+0x30);
        G12232_write_data((nian&0x0f)+0x30);
        G12232_write_data(0xc4);
        G12232_write_data(0xea);                     //“年”
                       
        G12232_write_data((yue>>4)+0x30);
        G12232_write_data((yue&0x0f)+0x30);
        G12232_write_data(0xd4);
        G12232_write_data(0xc2);                        //“月”
                       
        G12232_write_data((ri>>4)+0x30);
        G12232_write_data((ri&0x0f)+0x30);
                                       
        G12232_write_data(0xc8);
        G12232_write_data(0xd5);                        //“日”

        G12232_write_data(' ');
        G12232_write_data(' ');
       
        G12232_write_com(0x90);
        week(xingqi);
       
        if(naozhong==0)
        {               
                G12232_write_data(' ');
                G12232_write_data(' ');
        }
        else
        {
                G12232_write_data(0x06);
                G12232_write_data(' ');
        }
               
        G12232_write_data((shi>>4)+0x30);
        G12232_write_data((shi&0x0f)+0x30);
                       
        G12232_write_data(0xa1);
        G12232_write_data(0xc3);
                       
                       
        G12232_write_data((fen>>4)+0x30);
        G12232_write_data((fen&0x0f)+0x30);
                       
        G12232_write_data(0xa1);
        G12232_write_data(0xc3);
                       
        G12232_write_data((miao>>4)+0x30);
        G12232_write_data((miao&0x0f)+0x30);
        G12232_write_data(' ');
        G12232_write_data(' ');
       
}

/*******************************************************************************/






/**************************** 往 G12232 发 送 一 个 字 节****************************/
void G12232_send_byte(uchar G12232_data)//往G12232发送一个字节
{
        uchar i;
        CY=0;
        for(i=0;i<8;i++)
        {
                G12232_data<<=1;
                G12232_DI=CY;
                G12232_SCLK=0;
                G12232_SCLK=1;
        }
}
/********************************************************************************/






/******************************* 往 G12232 写 命 令********************************/
void G12232_write_com(uchar G12232_data)   //往G12232写命令
{
   uchar _data,i=250;
   _data=G12232_data;
   G12232_data&=0xf0;
   _data<<=4;
   _data&=0xf0;
   G12232_SCLK=0;
   G12232_CS=1;
   G12232_send_byte(0xf8);
   G12232_send_byte(G12232_data);
   G12232_send_byte(_data);
   G12232_SCLK=0;
   G12232_CS=0;
   G12232_data=0;
   while(--i);                        //延时505us
}
/********************************************************************************/




/******************************** 往 G12232 写 数 据 ********************************/
void G12232_write_data(uchar G12232_data)       //往G12232写数据
{
   uchar _data,i=250;
   _data=G12232_data;
   G12232_data&=0xf0;
   _data<<=4;
   _data&=0xf0;
   G12232_SCLK=0;
   G12232_CS=1;
   G12232_send_byte(0xfa);
   G12232_send_byte(G12232_data);
   G12232_send_byte(_data);
   G12232_SCLK=0;
   G12232_CS=0;
   G12232_data=0;
   while(--i);                        //延时505us
}
/********************************************************************************/





/*********************************星 期 代 码************************************/
//功能:将星期的数字转换成汉字
/********************************************************************************/

void week(uchar week)        //星期代码
{
        switch(week)
        {
                case 0: G12232_write_data(0xc8);G12232_write_data(0xd5);break;
                case 1: G12232_write_data(0xd2);G12232_write_data(0xbb);break;
                case 2: G12232_write_data(0xb6);G12232_write_data(0xfe);break;
                case 3: G12232_write_data(0xc8);G12232_write_data(0xfd);break;
                case 4: G12232_write_data(0xcb);G12232_write_data(0xc4);break;
                case 5: G12232_write_data(0xce);G12232_write_data(0xe5);break;
                case 6: G12232_write_data(0xc1);G12232_write_data(0xf9);break;
                default:break;       
        }
}

/********************************************************************************/






/************************** 进 入 外 部 中 断 后 的 键 盘 扫 描 **************************/
//功能:对时间参数进行调节设置
/*******************************************************************************/

void keyscan_waibu()   //进入外部中断的键盘扫描,用于设定时间
{
        uchar v;
        P3=0xff;
        if(P3!=0xff)
        {
                delay_ms(10);
                if(KEY0==0)
                {
                       delay_ms(10);
                        while(KEY0==0);
                        delay_ms(10);
                        v++;
                        if(v==8)v=1;
                        switch(v)
                        {                  //开光标并跳到那一位,等待用户设定参数
                                case 1:G12232_write_com(0x81);
                                           G12232_write_com(0x0f);
                                           break;       
                                case 2:G12232_write_com(0x83);
                                           G12232_write_com(0x0f);
                                           break;
                                case 3:G12232_write_com(0x85);
                                           G12232_write_com(0x0f);
                                           break;
                                case 4:G12232_write_com(0x90);
                                           G12232_write_com(0x0f);
                                           break;
                                case 5:G12232_write_com(0x92);
                                           G12232_write_com(0x0f);
                                           break;
                                case 6:G12232_write_com(0x94);
                                           G12232_write_com(0x0f);
                                           break;
                                case 7:G12232_write_com(0x96);
                                           G12232_write_com(0x0f);
                                           break;
                                default :break;
                        }
                        return ;
                }

                if(KEY1==0)
                {
                        delay_ms(10);
                        while(KEY1==0);
                        delay_ms(10);       
                        switch(v)
                        {
                                case 1:nian--;
                                           if(nian<0)
                                             nian=99;
                                           if(nian>100)
                                             nian=0;
                                           G12232_write_data(nian/10+0x30);
                                           G12232_write_data(nian%10+0x30);
                                           G12232_write_com(0x81);
                                           break;
                                case 2:yue--;
                                           if(yue<0)
                                             yue=12;
                                           if(yue>12)
                                             yue=1;
                                           G12232_write_data(yue/10+0x30);
                                           G12232_write_data(yue%10+0x30);
                                           G12232_write_com(0x83);
                                                break;
                                case 3:ri--;
                                           if(ri<0)
                                             ri=31;
                                           if(ri>31)
                                             ri=1;
                                           G12232_write_data(ri/10+0x30);
                                           G12232_write_data(ri%10+0x30);
                                           G12232_write_com(0x85);
                                           break;
                                case 4:xingqi--;
                                           if(xingqi<0)
                                             xingqi=6;
                                           if(xingqi>6)
                                             xingqi=0;
                                           week(xingqi);
                                           G12232_write_com(0x90);
                                           break;
                                case 5:shi--;
                                           if(shi<0)
                                             shi=23;
                                           if(shi>23)
                                             shi=0;
                                           G12232_write_data(shi/10+0x30);
                                           G12232_write_data(shi%10+0x30);
                                           G12232_write_com(0x92);
                                           break;
                                case 6:fen--;
                                           if(fen<0)
                                             fen=59;
                                           if(fen>59)
                                             fen=0;
                                           G12232_write_data(fen/10+0x30);
                                           G12232_write_data(fen%10+0x30);
                                           G12232_write_com(0x94);
                                           break;
                                case 7:miao--;
                                           if(miao<0)
                                             miao=59;
                                           if(miao>59)
                                             miao=0;
                                           G12232_write_data(miao/10+0x30);
                                           G12232_write_data(miao%10+0x30);
                                           G12232_write_com(0x96);
                                           break;
                                default :break;
                        }
                        return ;
                }

                if(KEY2==0)
                {
                        delay_ms(10);
                        while(KEY2==0);
                        delay_ms(10);       
                        wbzd=1;
                        v=0;
                        DS1302_set_time();               //设置时间
                        G12232_write_com(0x0c);   //关游标
                        return ;
                }

                if(KEY3==0)
                {
                        delay_ms(10);
                        while(KEY3==0);       
                        delay_ms(10);
                        switch(v)
                        {
                                case 1:nian++;
                                           if(nian<0)
                                             nian=99;
                                           if(nian>100)
                                                      nian=0;
                                           G12232_write_data(nian/10+0x30);
                                           G12232_write_data(nian%10+0x30);
                                           G12232_write_com(0x81);
                                           break;
                                case 2:yue++;
                                           if(yue<0)
                                             yue=12;
                                           if(yue>12)
                                             yue=1;
                                           G12232_write_data(yue/10+0x30);
                                           G12232_write_data(yue%10+0x30);
                                           G12232_write_com(0x83);
                                           break;
                                case 3:ri++;
                                           if(ri<0)
                                             ri=31;
                                           if(ri>31)
                                             ri=1;
                                           G12232_write_data(ri/10+0x30);
                                           G12232_write_data(ri%10+0x30);
                                           G12232_write_com(0x85);
                                           break;
                                case 4:xingqi++;
                                           if(xingqi<0)
                                                      xingqi=6;
                                           if(xingqi>6)
                                             xingqi=0;
                                           week(xingqi);
                                           G12232_write_com(0x90);
                                           break;
                                case 5:shi++;
                                           if(shi<0)
                                             shi=23;
                                           if(shi>23)
                                             shi=0;
                                           G12232_write_data(shi/10+0x30);
                                           G12232_write_data(shi%10+0x30);
                                           G12232_write_com(0x92);
                                           break;
                                case 6:fen++;
                                           if(fen<0)
                                             fen=59;
                                           if(fen>59)
                                             fen=0;
                                           G12232_write_data(fen/10+0x30);
                                           G12232_write_data(fen%10+0x30);
                                           G12232_write_com(0x94);
                                           break;
                                case 7:miao++;
                                           if(miao<0)
                                             miao=59;
                                           if(miao>59)
                                             miao=0;
                                           G12232_write_data(miao/10+0x30);
                                           G12232_write_data(miao%10+0x30);
                                           G12232_write_com(0x96);
                                           break;
                                default :break;
                                }
                        return ;
                }
        }
}

/*******************************************************************************/







/**************************** 主 程 序 中 的 键 盘 扫 描*******************************/
//功能:通过判断按住按键的时间来进行相应的功能选项,其中用到定时器0计时
/********************************************************************************/

void keyscan()//独立键盘扫描
{
        P3=0xff;
        if(P3!=0xff)
        {
                delay_ms(10);
                if(KEY1==0)
                {       
                        delay_ms(10);
                        while(KEY1==0)
                        {
                               
                        }
                       
                }


                if(KEY2==0)
                {
                        TR0=1;
                        while(KEY2==0)
                        {
                       
                                if(t0>100)
                                {
                                        TR0=0;
                                        t0=0;
                                        G12232_write_com(0x01);//清除显示
                                        G12232_write_com(0x80);

                                        G12232_write_data(0xc4);
                                        G12232_write_data(0xd6);        //“闹”
       
                                        G12232_write_data(0xd6);
                                        G12232_write_data(0xd3);        //“中”
                                       
                                        G12232_write_data(0xc9);
                                        G12232_write_data(0xe8);        //“设”
                                       
                                        G12232_write_data(0xd6);
                                        G12232_write_data(0xc3);        //“置”
       
                                        G12232_write_data(0xa1);
                                        G12232_write_data(0xc3);        //“:”
                                       
                                        if(naozhong==1)
                                        {
                                                G12232_write_data(0xbf);
                                                G12232_write_data(0xaa);
                                        }
                                        else
                                        {
                                                G12232_write_data(0xb9);
                                                G12232_write_data(0xd8);
                                        }       
       
                                        G12232_write_com(0x90);
                                        week(nz_xingqi);
       
                                        G12232_write_data(' ');
                                        G12232_write_data(' ');
       
                                        G12232_write_data((nz_shi>>4)+0x30);
                                        G12232_write_data((nz_shi&0x0f)+0x30);
                                                       
                                        G12232_write_data(0xa1);
                                        G12232_write_data(0xc3);
                                                       
                                                       
                                        G12232_write_data((nz_fen>>4)+0x30);
                                        G12232_write_data((nz_fen&0x0f)+0x30);
                                                       
                                        G12232_write_data(0xa1);
                                        G12232_write_data(0xc3);
                                                       
                                        G12232_write_data((nz_miao>>4)+0x30);
                                        G12232_write_data((nz_miao&0x0f)+0x30);
                                        G12232_write_data(' ');
                                        G12232_write_data(' ');
                                       
                                        while(!nz)
                                        {
                                                keyscan_nz();
                                        }
                                        nz=0;
                                        return ;
                                }
                       
                        }
                        if(t0<100)
                        {
                                TR0=0;
                                t0=0;
                        }
             
                }


                if(KEY3==0)
                {
                        TR0=1;
                        while(KEY3==0)
                        {
                       
                                if(t0>100)
                                {
                                        TR0=0;
                                        t0=0;
                                        G12232_write_com(0x01);//清除显示
                                        G12232_write_com(0x0c);/*开显关游标*/
                                        G12232_write_com(0x80);

                                        G12232_write_data(0xcf);
                                        G12232_write_data(0xd6);        //“现”
       
                                        G12232_write_data(0xd4);
                                        G12232_write_data(0xda);        //“在”
                                       
                                        G12232_write_data(0xb5);
                                        G12232_write_data(0xc4);        //“的”
                                       
                                        G12232_write_data(0xce);
                                        G12232_write_data(0xc2);        //“温”
       
                                        G12232_write_data(0xb6);
                                        G12232_write_data(0xc8);        //“度”

                                        G12232_write_data(0xa1);
                                        G12232_write_data(0xc3);        //“:”
                                       
                                       
                                        while(KEY3==0)
                                        {
                                                DS18B20_read();
                                        }
                                       
                                        return ;
                                }
                       
                        }
                        if(t0<100)
                        {
                                TR0=0;
                                t0=0;
                        }
                       

                }
                               
        }
}

/*******************************************************************************/






/************************ 进 入 闹 钟 设 置 后 的 键 盘 扫 描 ****************************/
//功能:主程序的键盘扫描进入到闹钟设置选项后,对闹钟的参数进行调节设置
/*******************************************************************************/

void keyscan_nz()          //进入闹钟扫描按键,用于闹钟设置
{
        uchar j;
        P3=0xff;
        if(P3!=0xff)
        {
                delay_ms(10);
                EX0=0;
                if(KEY0==0)
                {
                        delay_ms(10);
                        while(KEY0==0);
                        delay_ms(10);
                        nz=1;
                        j=0;
                        EX0=1;
                }

                if(KEY1==0)
                {
                        delay_ms(10);
                        while(KEY1==0);
                        delay_ms(10);
                        switch(j)
                        {
                                case 1:naozhong=~naozhong;
                                                if(naozhong==1)
                                                {
                                                        G12232_write_data(0xbf);
                                                        G12232_write_data(0xaa);
                                                }
                                                else
                                                {
                                                        G12232_write_data(0xb9);
                                                        G12232_write_data(0xd8);
                                                }
                                                G12232_write_com(0x85);break;                                                                                                                                                                 
                                case 2:nz_xingqi--;
                                           if(nz_xingqi<0)
                                                      nz_xingqi=6;
                                           if(nz_xingqi>6)
                                             nz_xingqi=0;
                                           week(nz_xingqi);
                                           G12232_write_com(0x90);
                                           break;
                                case 3:nz_shi--;
                                           if(nz_shi<0)
                                             nz_shi=23;
                                           if(nz_shi>23)
                                             nz_shi=0;
                                           G12232_write_data(nz_shi/10+0x30);
                                           G12232_write_data(nz_shi%10+0x30);
                                           G12232_write_com(0x92);
                                           break;
                                case 4:nz_fen--;
                                     if(nz_fen<0)
                                             nz_fen=59;
                                           if(nz_fen>59)
                                             nz_fen=0;
                                           G12232_write_data(nz_fen/10+0x30);
                                           G12232_write_data(nz_fen%10+0x30);
                                           G12232_write_com(0x94);
                                           break;
                                case 5:nz_miao--;
                                     if(nz_miao<0)
                                             nz_miao=59;
                                           if(nz_miao>59)
                                             nz_miao=0;
                                           G12232_write_data(nz_miao/10+0x30);
                                           G12232_write_data(nz_miao%10+0x30);
                                           G12232_write_com(0x96);
                                           break;
                                default :break;
                        }
                        return ;
             
                }

                if(KEY2==0)
                {       
                        delay_ms(10);
                        while(KEY2==0);
                        delay_ms(10);
                        j++;
                        if(j==8)j=1;
                        switch(j)
                        {                           //开光标并跳到那一位,等待用户设定参数
                                case 1:G12232_write_com(0x85);
                                           G12232_write_com(0x0f);
                                           break;
                                case 2:G12232_write_com(0x90);
                                           G12232_write_com(0x0f);
                                           break;
                                case 3:G12232_write_com(0x92);
                                           G12232_write_com(0x0f);
                                           break;
                                case 4:G12232_write_com(0x94);
                                           G12232_write_com(0x0f);
                                           break;
                                case 5:G12232_write_com(0x96);
                                           G12232_write_com(0x0f);
                                           break;
                                default :break;
                        }
                        return ;
                }

                if(KEY3==0)
                {
                        delay_ms(10);
                        while(KEY3==0);
                        delay_ms(10);
                        switch(j)
                        {
                                case 1:naozhong=~naozhong;
                                                if(naozhong==1)
                                                {
                                                        G12232_write_data(0xbf);
                                                        G12232_write_data(0xaa);
                                                }
                                                else
                                                {
                                                        G12232_write_data(0xb9);
                                                        G12232_write_data(0xd8);
                                                }
                                                G12232_write_com(0x85);
                                                break;
                                case 2:nz_xingqi++;
                                           if(nz_xingqi<0)
                                             nz_xingqi=6;
                                           if(nz_xingqi>6)
                                             nz_xingqi=0;
                                           week(nz_xingqi);
                                           G12232_write_com(0x90);
                                           break;
                                case 3:nz_shi++;
                                           if(nz_shi<0)
                                             nz_shi=23;
                                           if(nz_shi>23)
                                             nz_shi=0;
                                           G12232_write_data(nz_shi/10+0x30);
                                           G12232_write_data(nz_shi%10+0x30);
                                           G12232_write_com(0x92);
                                           break;
                                case 4:nz_fen++;
                                     if(nz_fen<0)
                                             nz_fen=59;
                                           if(nz_fen>59)
                                             nz_fen=0;
                                           G12232_write_data(nz_fen/10+0x30);
                                           G12232_write_data(nz_fen%10+0x30);
                                           G12232_write_com(0x94);
                                           break;
                                case 5:nz_miao++;
                                           if(nz_miao<0)
                                             nz_miao=59;
                                           if(nz_miao>59)
                                             nz_miao=0;
                                           G12232_write_data(nz_miao/10+0x30);
                                           G12232_write_data(nz_miao%10+0x30);
                                           G12232_write_com(0x96);
                                           break;
                                default :break;
                        }
                        return ;
             
                }
                       
        }
}

/******************程序结束,谢谢观看,有错的地方请大家指出来,谢谢了******************/
//制作人 :谢钟满   
//联系QQ:176628757
//制作时间:2010年1月11日
/********************************************************************************/

beer 发表于 2010-1-11 23:35:04

学习一下。。

deiwgah 发表于 2010-1-11 23:48:45

如果这些都是你自己按照datasheet写的,而不是东拼西凑的,那么大二的楼主比较牛了

fuanzwg 发表于 2010-1-12 00:10:08

mark

xzm8469105 发表于 2010-1-12 00:32:00

绝对是看PDF自己写出来的,DS18B20的延时比较难控制

ju748 发表于 2010-1-12 02:23:44

很不错,要继续努力啊,好好看下C的“预处理命令”和宏定义,要学会做自己的头文件,这样对以后的发展会有好处的

wxfhw 发表于 2010-1-12 04:18:26

附件有病毒???

http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_525157.PNG
(原文件名:潜在危险!?.PNG)

wxfhw 发表于 2010-1-12 04:51:10

修改了xx.c 的文件名,就没有“危险”提示了。

wxfhw 发表于 2010-1-12 05:04:02

请问:
有没有液晶屏 G12232F 的资料?
谢谢!

xzm8469105 发表于 2010-1-12 18:29:16

回复【8楼】wxfhw
-----------------------------------------------------------------------
点击此处下载 ourdev_525378.pdf(文件大小:550K) (原文件名:液晶12232F.pdf)

液晶G12232F 的PDF

xzm8469105 发表于 2010-1-12 18:30:40

谢谢5楼的建议,其实我也正有此意

yqldt 发表于 2010-1-27 10:25:27

很不错

yh13y 发表于 2010-1-27 11:24:59

楼主自己写的话的确是很不错了的,尤其是ds18b20的时序是特别的严谨的,要写出来的确是不太容易的一件事……赞一个

bs1234 发表于 2010-2-9 00:06:45

楼主的程序模块化需要加强,那样才能让人看得清晰.

xiaolei0428 发表于 2010-2-21 17:20:54

看看

jeremygg 发表于 2010-3-2 16:39:03

mark

5irmb 发表于 2010-3-2 21:56:47

好东西

zhuoyue36524 发表于 2010-3-3 13:13:45

mark

cenkey 发表于 2010-3-3 17:04:26

MARK

ddlovepp 发表于 2010-3-8 23:33:57

mark

lizhenwei001 发表于 2010-3-9 10:45:37

夸一下!很棒!

baoxiuqiang520 发表于 2010-4-11 18:22:12

厉害啊,教教我啊

binaimei2007 发表于 2010-4-11 18:50:53

太厉害了我的榜样~~~学习个

longquan 发表于 2010-4-11 19:21:00

佩服楼主,我也大二,但我擅长抄

gpzdc986 发表于 2010-4-11 19:49:37

mark

wexm2005 发表于 2010-7-6 17:24:45

楼主有没有电路图,给我一个,邮箱:wexm2005@163.com

jlqamark 发表于 2010-8-14 11:34:25

传粉电路图吧

s3070419106 发表于 2010-8-15 00:16:30

mark

njlz0707mm 发表于 2010-8-15 03:25:39

非常怀疑是东拼西凑或者是直接改的别人的程序。不知是不是课程设计之类的

nswlp 发表于 2010-8-18 22:41:21

lpgyf 发表于 2010-8-20 13:56:14

mark

xtaens 发表于 2010-9-9 21:26:04

佩服

guxingganyue 发表于 2010-10-10 12:54:12

mark

wangma 发表于 2010-10-10 18:29:30

很不错的东西哟,学习了,也很佩服楼主的水平,学习的对象

happywolf999 发表于 2010-10-23 01:57:02

mark

huqiaoli3 发表于 2010-10-23 14:23:45

不错!如果是自己写的,那确实是很牛...

wang_mingyin 发表于 2010-11-6 16:57:23

楼主,有仿真过吗?还是做的实物啊?键盘程序功能ok?我自己写的键盘程序老错,望楼主指教

yeyo 发表于 2011-4-8 13:11:24

我学习了

ERDTxiduoduo 发表于 2011-4-8 14:58:49

mark

zsgood6688 发表于 2011-4-9 19:00:34

mark

bingshuihuo888 发表于 2011-4-9 22:25:09

好东东,记号一下.

x563110113 发表于 2011-4-10 21:34:03

好帅呀,,,我们也要弄一个这个,。,。我就借一下你这个了

raymond1981 发表于 2011-6-6 07:50:07

mark

liushiming82 发表于 2011-6-7 16:44:22

怎么还有效果图呀

cuikai12345 发表于 2011-6-7 19:02:53

mark

format 发表于 2011-6-7 19:30:58

当年我也是一句一句的汇编

敲了一个时钟,进入单片机的门槛

没有搭硬件吗?

jssz_hf 发表于 2011-6-12 11:13:48

厉害

dz20062008 发表于 2011-9-17 00:16:51

mark

nlls1990 发表于 2011-9-17 09:09:56

顶,不错

aikimi7 发表于 2011-11-28 19:14:05

mark

lhxr 发表于 2011-11-28 19:39:19

mark

rickly_hzy 发表于 2012-4-3 15:23:05

太强了…完全自己写!向你学习了

rickly_hzy 发表于 2012-4-3 15:24:28

太强了…完全自己写!向你学习了

rickly_hzy 发表于 2012-4-3 15:25:12

太强了…完全自己写!向你学习了

zhuiyi521 发表于 2012-4-3 16:50:11

MARK..........

闪耀的空白 发表于 2013-4-18 09:12:50

好东西,不错

mii 发表于 2013-4-18 09:37:59

大二一个星期就可以有作品了,算是牛了

jlian168 发表于 2013-4-18 10:37:56

mark,not bad.

zihan0855 发表于 2013-4-22 14:55:00

正在学习

miller8708 发表于 2013-4-24 00:27:52

收藏了,谢谢

zihan0855 发表于 2013-4-24 13:47:22

正在 学习中

墨绿三号 发表于 2013-4-24 17:29:50

好东西。

significance201 发表于 2013-4-25 13:02:30

刚刚学究这么厉害了,加油

gxlao6 发表于 2013-4-25 14:23:29

很厉害了,继续努力!

flotox 发表于 2013-5-5 15:49:52

MARKMARKMARK

创力电子 发表于 2013-5-5 18:18:22

   {:lol:}

huaxingniu 发表于 2013-7-12 23:52:34

显示用12232?不错哦,收藏下

351043597 发表于 2013-11-17 16:50:25

mark                  

Lboyve 发表于 2013-11-29 23:06:18

LZ大二就能达到这水平,确实不错。

INT0 发表于 2013-12-2 09:35:29

程序写的很中规中矩 一看就是科班出身啊,我们这种由汇编进C的人有时还在纠结一些小的规则

奮闘ing 发表于 2013-12-2 10:24:36

挺不错,学习下~~~

laokeiwang 发表于 2014-12-27 19:57:52

学习下,看看有没有我没有的

扬帆远航 发表于 2014-12-27 20:21:46

此处mark,为了这句话 “好好看下C的“预处理命令”和宏定义,要学会做自己的头文件”

AHTY 发表于 2014-12-27 20:36:21

可以配个图片吧,给个第一印象!

unnormal 发表于 2014-12-28 08:18:20

大一会这么多已经很牛了

100 发表于 2014-12-28 11:17:02

很不容易了,作为大一的学生

Arthur244 发表于 2014-12-28 13:44:38

代码格式不错。。调程序应该不是新手了吧。。

374533905 发表于 2014-12-29 17:17:41

学习一下

HMYJ 发表于 2014-12-29 19:24:12

厉害,我也正想做一个

tongli 发表于 2014-12-29 20:19:04

楼主加油,继续努力,看到楼主的帖子我想起上学时刚刚做东西的时候,一晃好多年过去了。

liuchg 发表于 2014-12-29 20:55:13

楼主前途无量

zjsdlt2013 发表于 2018-7-12 20:34:23

好样的,不错。。。
页: [1]
查看完整版本: 初学51,制作了一个电子钟,四个按键可设置时间和闹钟参数,用了AT89S52,DS1302,DS18B20,G