找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1405|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的日历

[复制链接]
跳转到指定楼层
楼主
#include<reg51.h>
#include <intrins.h>
sbit rs= P3^0;
sbit rw= P3^1;
sbit ep= P3^2;
void delay(unsigned char n)         //延时n毫秒
{
while(n--);
}
bit lcd_bz()  //检测LCD是否忙
{
  bit result;
  rs=0;
  rw=1;
  ep=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  result=(bit)(P2&0x80);
  ep=0;
  return(result);
}
void lcd_wcmd(unsigned char cmd)  //写指令到LCD子程序
{
  while(lcd_bz());
  rs=0;
  rw=0;
  ep=0;
  _nop_();
  _nop_();
  P2=cmd;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  ep=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  ep=0;}
void lcd_pos(unsigned char pos)          //写显示位置子程序
{
  lcd_wcmd(pos|0x80);
}
void lcd_wdat(unsigned char dat)  //写显示数据到LCD子程序
{
while(lcd_bz());
rs=1;
rw=0;
ep=0;
P2=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
void lcd_init()           //LCD初始化子程序
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
delay(1);
}
#include<reg51.h>
sbit IO=P3^5;
sbit CLK=P3^4;
sbit RST=P3^3;
void writebyte(unsigned char Data) //写数据到1302程序
{
        unsigned char i;
        for(i=8;i>0;i--)
        {
                Data>>=1;
                IO=CY;
                CLK=1;
                CLK=0;
        }
}
unsigned char readbyte()         //读数据
{
        unsigned char i,t=0;
                for(i=0;i<8;i++)
        {
                CLK=0;
                if(IO!=0)
                t|=(1<<i);
                CLK=1;
        }       
        return t;
}
void write(unsigned char address,unsigned char DATA) //写地址,写数据
{
        RST=0;
        CLK=0;
        RST=1;
        writebyte(address);
        writebyte(DATA);
        CLK=1;
        RST=0;
}
unsigned char read(unsigned char address)          //读某地址的数据
{
        unsigned char DATA;
        RST=0;
        CLK=0;
        RST=1;
        writebyte(address);
        DATA=readbyte();
        CLK=1;
        RST=0;
        return DATA;
}
void gettime(unsigned char timedata[])          //读取时间
{
        unsigned char i;
        unsigned char address=0x81;
        for(i=0;i<7;i++)
        {
                timedata[i]=read(address);
                address+=2;
        }
}
void settime(unsigned char timedata[])                //设置时间
{
        unsigned char i;
        unsigned char address=0x80;
        write(0x8e,0x00);
        for(i=0;i<7;i++)
        {
                write(address,timedata[i]);
                address+=2;
        }
        write(0x8e,0x80);

}

#include<reg51.h>
sbit DQ=P0^7;
int k=1;
void delay2(unsigned char us)  //延时
{
        while(us--);
}
bit init(void)                   //初始化
{
        bit x=0;
        DQ=1;
        delay2(8);
        DQ=0;
        delay2(80);
        DQ=1;
        delay2(14);
        x=DQ;
        delay2(20);
        return ~x;

}
unsigned char read2(void)           //读数据
{
        unsigned char i,d=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                d>>=1;
                DQ=1;
                delay2(1);
                if(DQ)
                d|=0x80;
                delay2(4);
        }
        return(d);
}
void write2(unsigned char d)           //写数据
{
        unsigned char i;
        for(i=8;i>0;i--)
        {
                DQ=0;
                DQ=d&0x01;
                delay2(5);
                DQ=1;
                d>>=1;
        }
}
unsigned int readt(void)        //读温度
{        float tt;
        unsigned char tl,th;
        unsigned int t=0;
        init();
        write2(0xCC);
        write2(0x44);
        init();
        write2(0xCC);
        write2(0xBE);
        tl=read2();
        th=read2();
        t=th;
        t=(t<<8)+tl;
        if(t&0x8000)
        {
                k=0;
                t=~t;
                t++;               
        }
        else k=1;       
        tt=t*0.0625;  
    t=tt*10+0.5;
        return t;               
}

#include<reg51.h>
#define Adjust(Item,Max,Min)do{unsigned char temp;temp=(Item>>4)*10;temp+=Item&0x0f;if(++temp==Max)temp=Min;Item=temp/10*16;Item+=temp%10;}while(0)
sbit K1=P3^6;
sbit K2=P3^7;
unsigned char code du[]={0x10,6,9,8,8,9,6,0};
unsigned char code year[]={8,31,2,15,10,31,2,0};
unsigned char code mouth[]={15,9,15,9,15,9,19,0};
unsigned char code day[]={15,9,9,15,9,9,15,0};
unsigned char s,c;
bit f;
unsigned char datatime[7];
unsigned char displaybuffer[32];
unsigned char week[7][3]={"SUN","MON","TUS","WED","THR","FRI","SAT"};
unsigned int t;
extern void gettime(unsigned char *);
extern void settime(unsigned char *);
extern void lcd_init();
extern void lcd_wdat(unsigned char);
extern void lcd_wcmd(unsigned char);
extern void delay(unsigned char);
extern unsigned int readt(void);
extern int k;
void display()
{       
        unsigned char i;
        displaybuffer[0]='0'+2;
        displaybuffer[1]='0'+0;
        displaybuffer[2]='0'+datatime[6]/16;
        displaybuffer[3]='0'+datatime[6]%16;
        displaybuffer[4]=1;
        displaybuffer[5]='0'+datatime[4]/16;
        displaybuffer[6]='0'+datatime[4]%16;
        displaybuffer[7]=2;
        displaybuffer[8]='0'+datatime[3]/16;
        displaybuffer[9]='0'+datatime[3]%16;
        displaybuffer[10]=3;
        displaybuffer[11]=' ';
        displaybuffer[12]=week[datatime[5]-1][0];
        displaybuffer[13]=week[datatime[5]-1][1];
        displaybuffer[14]=week[datatime[5]-1][2];
        displaybuffer[15]=' ';
        displaybuffer[16]='0'+datatime[2]/16;
        displaybuffer[17]='0'+datatime[2]%16;
        displaybuffer[18]=':';
        displaybuffer[19]='0'+datatime[1]/16;
        displaybuffer[20]='0'+datatime[1]%16;
        displaybuffer[21]=':';
        displaybuffer[22]='0'+datatime[0]/16;
        displaybuffer[23]='0'+datatime[0]%16;
        displaybuffer[24]=' ';
        if(s&&f)
        {
                if(s==1)
                        displaybuffer[0]=displaybuffer[1]=displaybuffer[2]=displaybuffer[3]=' ';       
                else if(s==2)
                        displaybuffer[5]=displaybuffer[6]=' ';
                else if(s==3)
                        displaybuffer[8]=displaybuffer[9]=' ';
                else if(s==4)
                        displaybuffer[12]=displaybuffer[13]=displaybuffer[14]=' ';
                else if(s==5)
                        displaybuffer[16]=displaybuffer[17]=' ';
                else if(s==6)
                        displaybuffer[19]=displaybuffer[20]=' ';       
                else if(s==7)
                        displaybuffer[22]=displaybuffer[23]=' ';                               
        }
        displaybuffer[25]=' ';
        displaybuffer[26]=displaybuffer[27]=' ';
        displaybuffer[28]='0'+t%100/10;
        displaybuffer[29]='.';
        displaybuffer[30]='0'+t%10;
        displaybuffer[31]=0x00;

        if(!k)
        {
                displaybuffer[25]='-';               
        }
       
        if(t/1000)
                displaybuffer[26]='0'+t/1000;
        if(t/100)
                displaybuffer[27]='0'+t%1000/100;
        lcd_wcmd(0x80);
        for(i=0;i<16;i++)
                lcd_wdat(displaybuffer[i]);
        lcd_wcmd(0xC0);
        for(;i<32;i++)
                lcd_wdat(displaybuffer[i]);
}
void delayms(unsigned char n)         
{
unsigned char i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
void key()
{
        if(K1)
        return;
        delayms(20);
        if(K1)
        return;
        if(++s==8)
        s=0;
        while(!K1);
}
void key2()
{
        if(K2)
        return;
        delayms(20);
        if(K2)
        return;
        switch(s)
        {
                case 1:                Adjust(datatime[6],100,0);
                                break;
                case 2:                Adjust(datatime[4],13,1);
                                break;
                case 3:                Adjust(datatime[3],32,1);
                                break;
                case 4:                Adjust(datatime[5],8,1);
                                break;
                case 5:                Adjust(datatime[2],24,0);
                                break;
                case 6:                Adjust(datatime[1],60,0);
                                break;
                case 7:                datatime[0]=0;
                                break;
        }
        settime(datatime);
        while(!K2);
}
void main()
{
        unsigned char i;
        lcd_init();
        delay(100);

        for(i=0;i<32;i++)
        {lcd_wcmd(0x40+i),
        lcd_wdat(du[i]); }
        TMOD=1;
        ET0=1;
        EA=1;
        TR0=1;
        while(1)
        {
                key();
                key2();
        }
}
void t0s() interrupt 1
{
        TH0=15536/256;
        TL0=15536%256;
        if(++c==5)
        {
                c=0;
                f=~f;
                gettime(datatime);
                t=readt();
                display();
        }
}


L@QS7[7NKCLRC$H}XDVT$~O.png (17.71 KB, 下载次数: 36)

L@QS7[7NKCLRC$H}XDVT$~O.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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