2012-10-31
基于KEIL4和C52的时钟设计 | ##
指导老师:##
软件课程设计——基于KEIL4和C52的时钟设计
序言
第一章设计思想…………1
第二章制作方法…………1-22
第三章演示………………22
第四章心得体会…………23
第一章设计思想
    在电子设计的初级世界里,万年历是最常拿来试手的程序,也有着丰富多彩新颖的设计火花,基于keil4和单片机的万年历设计大多是用DS1302加锂电池,我用延时程序和定时器写,
只是精度不太好,节约了成本!用DS12CR887写的万年历克服了需要锂电池搭配的缺点。希望以后能加入18B20模块和自动对时模块。
第二章制作方法
              第一种方法—— 延时程序和定时器
1、设备:keil4,c52单片机带lcd显示屏(图片见电子版)
2、源程序:(有视频详解)
          /*可调时钟*/
#include<reg52.h>
#define ui unsigned int
#define uc unsigned char
uc code table[]="  2012-01-01 MON";        //设置显示初值,初值函数中对应的变量赋值要一
uc code table1[]="    00:00:00";
int num,i,s,f,m,n,y,r,w,s1num;
sbit dula=P2^6;
sbit wela=P2^7;              //数码管位选和段选
sbit lcden=P3^4;          //LCD使能信号
sbit lcdrs=P3^5;          //LCD数据、命令选择端
sbit s1=P3^0;       
sbit s2=P3^1;
sbit s3=P3^2;              //键盘
sbit rd=P3^7;              //使能
void delay(ui y)          //延时函数,y=1时1ms
{
    ui x;
        for(y;y>0;y--)
            for(x=110;x>0;x--);
}
void write_date(uc date)      //写数据
{
    lcdrs=1;
    lcden=0;
    P0=date;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
void write_com(uc com)          //写命令
{
    lcdrs=0;
    lcden=0;
    P0=com;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}
void chuzhi()            //初值
{
    dula=0;
单片机编程100例详解
    wela=0;
    lcden=0;
    n=2012;
    y=1;
    r=1;
    w=1;
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
    write_com(0x80);
    for(num=0;num<16;num++)            //显示位置及数据
    {
        write_date(table[num]);
        delay(5);
    }
    write_com(0x80+0x40);
    for(num=0;num<13;num++)
    {
        write_date(table1[num]);
        delay(5);
    }
    TMOD=0x01;                //定时器0工作方式1
    TH0=0x4c;
    TL0=0x00;                //赋初值、50ms
    EA=1;
    ET0=1;
    TR0=1;
    i=0;
}
void write_sfm(uc add,uc date)        //时分秒
{
    uc shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x40+add);
    write_date(0x30+shi);    //    详见标准字符库 ,地址已经自动加了一位
    write_date(0x30+ge);
}
void write_yr(uc add,uc date)      //月日
{
    uc shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+add);
    write_date(0x30+shi);