本帖最后由 陈润源home 于 2019-5-20 19:42 编辑
说明:开机显示当前计算机时间(若下载到开发板上请手动调节时间)
第1次按下MODE键,如果此时按下 S+ /S-,则秒的值 +1/ -1,按下yes保存设定值
第2次按下MODE键,如果此时按下 S+ /S-,则分的值 +1/ -1,按下yes保存设定值
第3次按下MODE键,如果此时按下 S+ /S-,则时的值 +1/ -1,按下yes保存设定值
第4次按下MODE键,如果此时按下 S+ /S-,则天的值 +1/ -1,按下yes保存设定值
第5次按下MODE键,如果此时按下 S+ /S-,则月的值 +1/ -1,按下yes保存设定值
第6次按下MODE键,如果此时按下 S+ /S-,则周的值 +1/ -1,按下yes保存设定值
第7次按下MODE键,如果此时按下 S+ /S-,则年的值 +1/ -1,按下yes保存设定值
第8次按下MODE键,开始正常计时。
本程序已通过“清翔电子”开发板完美验证,请坛友放心下载。用其他开发板的童鞋请自行修改端口。
附件还内附DS1302资料+标准程序,需要的小伙伴请下载
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- //说明:开机显示当前PC时间
- // 第1次按下MODE键,如果此时按下 S+ /S-,则秒的值 +1/ -1,按下yes保存设定值
- // 第2次按下MODE键,如果此时按下 S+ /S-,则分的值 +1/ -1,按下yes保存设定值
- // 第3次按下MODE键,如果此时按下 S+ /S-,则时的值 +1/ -1,按下yes保存设定值
- // 第4次按下MODE键,如果此时按下 S+ /S-,则天的值 +1/ -1,按下yes保存设定值
- // 第5次按下MODE键,如果此时按下 S+ /S-,则月的值 +1/ -1,按下yes保存设定值
- // 第6次按下MODE键,如果此时按下 S+ /S-,则周的值 +1/ -1,按下yes保存设定值
- // 第7次按下MODE键,如果此时按下 S+ /S-,则年的值 +1/ -1,按下yes保存设定值
- // 第8次按下MODE键,开始正常计时。
- //
- //------------------------------------------------------------------------
- #include <reg51.h> //调用含有51专用寄存器的头文件
- #define uchar unsigned char //用uchar代替unsigned char
- #define uint unsigned int //用uint代替unsigned int
- #define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
- #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
- char a,sec,min,hour,day,mouth,week,year,temp,n; //定义变量
- sbit rw=P3^6; //液晶读写端
- sbit rs=P3^5; //液晶指令/数据输入控制
- sbit en=P3^4; //液晶使能端
- sbit sda=P1^1; //数据线
- sbit clk=P1^0; //时钟线
- sbit rst=P1^2; //使能
- sbit mode=P3^0; //设置键
- sbit s1 =P3^1; //加键
- sbit s2 =P3^2; //减键
- sbit yes =P3^3; //调整确认键
- sbit ACC0=ACC^0; //累加器A低位
- sbit ACC7=ACC^7; //累加器A高位
- uchar code tab1[]={"20 - - "}; //年显示的固定字符
- uchar code tab2[]={" : : "}; //时间显示的固定字符
- /***********************延时子程序********************/
- void delay(uint xms)
- {
- uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- /****************液晶写入指令函数*******************/
- void write_1602com(uchar com)
- {
- rs=0; //数据/指令选择置为指令
- rw=0; //读写选择置为写
- P0=com; //送入数据
- delay(1);
- en=1; //拉高使能端,为制造有效的下降沿做准备
- delay(1);
- en=0; //en由高变低,产生下降沿,液晶执行命令
- }
- /********************液晶写入数据函数***************/
- void write_1602dat(uchar dat)
- {
- rs=1; //数据/指令选择置为数据
- rw=0; //读写选择置为写
- P0=dat; //送入数据
- delay(1);
- en=1; //en置高电平,为制造下降沿做准备
- delay(1);
- en=0; //en由高变低,产生下降沿,液晶执行命令
- }
- /**************液晶初始化函数**********************/
- void lcd_init()
- {
- write_1602com(0x38); //设置液晶工作模式,
- write_1602com(0x0c); //开显示不显示光标
- write_1602com(0x06); //整屏不移动,光标自动右移
- write_1602com(0x01); //清显示
- write_1602com(yh+1); //日历显示固定符号从第一行第1个位置之后开始显示
- for(a=0;a<14;a++)
- {
- write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分
- }
- write_1602com(er+2); //时间显示固定符号写入位置,从第2个位置后开始显示
- for(a=0;a<8;a++)
- {
- write_1602dat(tab2[a]); //写显示时间固定符号,两个冒号
- }
- }
- /***************写数据********************/
- void write_byte(uchar dat)
- {
- ACC=dat;
- rst=1;
- for(a=8;a>0;a--)
- {
- sda=ACC0;
- clk=0;
- clk=1;
- ACC=ACC>>1;
- }
- }
- /******************读数据********************/
- uchar read_byte()
- {
- rst=1;
- for(a=8;a>0;a--)
- {
- ACC7=sda;
- clk=1;
- clk=0;
- ACC=ACC>>1;
- }
- return (ACC);
- }
- /*********向1302芯片写函数,指定写入地址,数据*********/
- void write_1302(uchar add,uchar dat)
- {
- rst=0;
- clk=0;
- rst=1;
- write_byte(add);
- write_byte(dat);
- clk=1;
- rst=0;
- }
- /*********从1302读数据函数,指定读取数据来源地址*******/
- uchar read_1302(uchar add)
- {
- uchar temp;
- rst=0;
- clk=0;
- rst=1;
- write_byte(add);
- temp=read_byte();
- clk=1;
- rst=0;
- return(temp);
- }
- /****************BCD码转十进制函数,输入BCD,返回十进制*******/
- uchar BCD(uchar m)
- {
- uchar x;
- x=m>>4;
- return(x=x*10+(m&=0x0f));
- }
- /********1302芯片初始化子函********/
- void ds1302_init()
- {
- rst=0;
- clk=0;
- write_1302(0x8e,0x00); //允许写,禁止写保护
- delay(50);
复制代码
所有资料51hei提供下载:
DS1302 1602液晶.rar
(600.95 KB, 下载次数: 706)
|