51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

合集下载

ds1302的12864液晶按键可调显示实时时钟程序(word文档良心出品)

ds1302的12864液晶按键可调显示实时时钟程序(word文档良心出品)

一.绪言1.在信息显示技术中,人们发现了信息数字化的重要作用和意义。

数字化的信息更加准确,同一性,更易传输和识别。

很多信息可以直接由数字表示,从而数字化信息显示又成为信息显示的又一个重要内容。

又从数字化显示发展到字符显示,它把人类特有的语言文字用于显示,这种显示与数字显示合在一起用途更广用量更大。

在这同时,人们还希望用图形和图像进行显示,且显示的内容为五彩缤纷,并且可以实时活动和具有三维立体效果。

这些在二十世纪尾声时都已经陆续实现。

LCD的计算机器,半导体发光数码管显示(LED)的汽车计价器,商场的大屏幕广告。

这零零总总的各类显示正为你做着各种各样的服务,相信在不久的将来显示技术的发展将会为人类做出更大的贡献。

Ds1302时钟芯片现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。

这些电路的接口简单、价格低廉、使用方便,被广泛地采用。

本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。

采用普通32.768kHz晶振。

(一)设计任务本课题采用ds1302的时钟芯片为主要的的设计来源,采用显示是1cd1602的图形点阵液晶显示。

,(二)提出方案及方案论证在设计中,我主要是考虑ds1302的时间显示问题,因为网上也有ds1302的读写和显示程序,但是至于怎样才能显示详细信息,我提出了两个方案,一个是LCD1602来显示,一个是LCD12864,其中1602是个字符型的点阵,而1CD12864是个图形的点阵,相比之下12864能够更好显示数据,而CPU都采用89C52的单片机(三)原理说明:原理其实很简单,LCD12864的各种指令先进行宏定义和ds1302的读写指令也进行宏定义,从ds1302的读出数据显示在lcd上(二)程序流程图(三)C51程序设计,重要的代码要有注释。

采用51单片机控制的DS1302时钟程序

采用51单片机控制的DS1302时钟程序

采用51单片机控制的DS1302时钟程序/*********************************************************************/ /* 实时时钟模块时钟芯片型号:DS1302 *//*//*********************************************************************/ sbit T_CLK = P2^7; /*实时时钟时钟线引脚 */sbit T_IO = P1^4; /*实时时钟数据线引脚 */sbit T_RST = P1^5; /*实时时钟复位线引脚 *//******************************************************************** ** 名称: 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_BurstW1302T* 说明: 先写地址,后写数据(时钟多字节方式)* 功能: 往DS1302写入时钟数据(多字节方式)* 调用: v_RTInputByte()* 输入: pSecDa: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B* 返回值: 无***********************************************************************/ void v_BurstW1302T(uchar *pSecDa){uchar i;v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/{v_RTInputByte(*pSecDa);/* 写1Byte数据*/pSecDa++;}T_CLK = 1;T_RST =0;}/******************************************************************** ** 名称: v_BurstR1302T* 说明: 先写地址,后读命令/数据(时钟多字节方式)* 功能: 读取DS1302时钟数据* 调用: v_RTInputByte() , uc_RTOutputByte()* 输入: pSecDa: 时钟数据地址格式为: 秒分时日月星期年* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B* 返回值: ucDa :读取的数据***********************************************************************/ void v_BurstR1302T(uchar *pSecDa){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */for (i=8; i>0; i--){*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */pSecDa++;}T_CLK = 1;T_RST =0;}/******************************************************************** ** 名称: v_BurstW1302R* 说明: 先写地址,后写数据(寄存器多字节方式)* 功能: 往DS1302寄存器数写入数据(多字节方式)* 调用: v_RTInputByte()* 输入: pReDa: 寄存器数据地址* 返回值: 无***********************************************************************/ void v_BurstW1302R(uchar *pReDa){uchar i;v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */for (i=31;i>0;i--) /*31Byte 寄存器数据 */{v_RTInputByte(*pReDa); /* 写1Byte数据*/pReDa++;}T_CLK = 1;T_RST =0;}/******************************************************************** ** 名称: uc_BurstR1302R* 说明: 先写地址,后读命令/数据(寄存器多字节方式)* 功能: 读取DS1302寄存器数据* 调用: v_RTInputByte() , uc_RTOutputByte()* 输入: pReDa: 寄存器数据地址* 返回值: 无***********************************************************************/ void v_BurstR1302R(uchar *pReDa){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */for (i=31; i>0; i--) /*31Byte 寄存器数据 */{*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */pReDa++;}T_CLK = 1;T_RST =0;}/******************************************************************** ** 名称: v_Set1302* 说明:* 功能: 设置初始时间* 调用: v_W1302()* 输入: pSecDa: 初始时间地址。

DS1302数码管电子闹钟程序

DS1302数码管电子闹钟程序

/*****************************************************///DS1302+数码管+3个独立按键//// 精确定时/////*****************************************************/ /****************************************************************/// 利用ds1302精确定时,同时按键可调时间。

//// 每操作一次时钟,都会有蜂鸣器响大约200ms,以提示操作。

///***************************************************************/#include<reg52.h>#include"ds1302.h"uchar code tab[]={ 0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/} ;//共阴码char clock1[3]={0};int i,j=0,flag1=0;void delay(uint xms){uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void init()//初始化{//RST=0;//SCLK=0;//write_1302(0x80,0x00);//写控制字,允许写//write_1302(0x90,0x00);//禁止涡流充电TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void display(uchar miaog,uchar miaos,uchar feng,uchar fens,uchar shig,uchar shis)//数码管动态显示{P2=0x7f;P0=tab[miaog];delay(5);P2=0xbf;P0=tab[miaos];delay(5);P2=0xdf;P0=0xc0;delay(5);P2=0xef;P0=tab[feng];delay(5);P2=0xf7;P0=tab[fens];delay(5);P2=0xfb;P0=0xc0;delay(5);P2=0xfd;P0=tab[shig];delay(5);P2=0xfe;P0=tab[shis];delay(5);}write_sfm(uchar miao,uchar fen,uchar shi) //写入到数码管{uchar miaog,miaos,feng,fens,shig,shis;miaog=miao%10;miaos=miao/10;feng=fen%10;fens=fen/10;shig=shi%10;shis=shi/10;display(miaog,miaos,feng,fens,shig,shis);}void didi() //发声程序{buzzer=0;delay(50);buzzer=1;}void keyscan()//按键扫描程序{uchar temp;if(key1==0) //功能键{if(key1==0){while(!key1);key1n=key1n++;if(key1n==5)key1n=1;switch(key1n){case 1://didi();temp=(miao)/10*16+(miao)%10;//将秒转化成bcd码,没这句秒就变化,不知为什么write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp); //时钟暂停write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();break;case 3 ://didi();break;case 4 ://didi();temp=miao/10*16+miao%10;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x00|temp);//时钟开始write_1302 (0x8e,0x80); //允许写保护break;}}}if(key4==0) //闹钟键{if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;while(keyn){EA=0; //闹钟键if(key4==0)if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;}write_sfm(clock1[2],clock1[1],clock1[0]);if(keyn==1) //时修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[0]--;if(clock1[0]<0)clock1[0]=24;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[0]++;if(clock1[0]>24)clock1[0]=0;}}}if(keyn==2) //分修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[1]--;if(clock1[1]<0)clock1[1]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[1]++;if(clock1[1]>59)clock1[1]=0;}}}if(keyn==3) //秒修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[2]--;if(clock1[2]<0)clock1[2]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[2]++;if(clock1[2]>59)clock1[2]=0;}}}}} EA=1;}if(key1n!=0) //当按下功能键key1,按以下才有用{if(key2==0) //加键{delay(3);if(key2==0){while(!key2);switch(key1n){case 1 : //didi(); //秒temp=(miao+1)/10*16+(miao+1)%10;if(miao==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 : // didi(); //分temp=(fen+1)/10*16+(fen+1)%10;if(fen==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 :// didi();temp=(shi+1)/10*16+(shi+1)%10; //时if(shi==23)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}if(key3==0) //减键{delay(3);if(key3==0){while(!key3);switch(key1n){case 1 ://didi();temp=(miao-1)/10*16+(miao-1)%10; //秒if(miao==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();temp=(fen-1)/10*16+(fen-1)%10; //分if(fen==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 ://didi();temp=(shi-1)/10*16+(shi-1)%10; //时if(shi==0)temp=35;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}}//write_1302(0x80,miao|0x80);//miao++;/* if(key2==0){if(key2==0){while(!key2);write_1302(0x80,miao|0x00);//打开1302振荡器}}*/}void main(){init();//buzzer=0;//miao=20;//fen=10;//shi=23;while(1){miao = BCD_Decimal(read_1302(0x81));fen = BCD_Decimal(read_1302(0x83));shi = BCD_Decimal(read_1302(0x85));keyscan();if((miao==clock1[2])&&(fen==clock1[1])&&(shi==clock1[0])) {flag1=1;for(i=0;i<10;i++)didi();}if(j==100) for(i=0;i<10;i++) didi();if(j==200) {for(i=0;i<10;i++)didi();flag1=0;j=0;}}}void tiemr0() interrupt 1{if(flag1) j++;TH0=(65536-50000)/256;TL0=(65536-50000)%256;write_sfm(miao,fen,shi); }。

51单片机万年历实验DS1302可按键设置时钟

51单片机万年历实验DS1302可按键设置时钟

*选择设置加 1。
* 注意

*******************************************************************************
/
#include<reg51.h> #include"lcd.h" #include"ds1302.h"
sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3;
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{ if(K1==0)
//检测按键 K1 是否按下
{ Delay10ms(); //消除抖动
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下是 主文件 main.c 的内容
void Int0Configuration();
void LcdDisplay();
unsigned char SetState,SetPlace; void Delay10ms(void); //误差 0us
/******************************************************************************

实时时钟芯片DS1302 C51源程序

实时时钟芯片DS1302 C51源程序
函数名:RTInputByte()
功能:实时时钟写入一字节
说明:往DS1302写入1Byte数据(内部函数)
入口参数:d写入的数据
返回值:无
***********************************************************************/
void RTInputByte(uchar d)
函数名:W1302()
功能:往DS1302写入数据
说明:先写地址,后写命令/数据(内部函数)
调用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData:要写的数据
返回值:无
***********************************************************************/
允许写保护:W1302(0X8E,0X80)读月:R1302(0X89)
慢充电控制:W1302(0X90,0XAA)写秒(起振):W1302(0X80,0X00)
写秒(停振):W1302(0X80,0X80)
函数名:R1302()
功能:读取DS1302某地址的数据
说明:先写地址,后读命令/数据(内部函数)
调用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返回值:ucData :读取的数据
***********************************************************************/
返回值:无
***********************************************************************/

51单片机带字库12864液晶动态汉字显示C语言源程序

51单片机带字库12864液晶动态汉字显示C语言源程序

51单片机带字库12864液晶动态汉字显示C语言源程序2009-10-17 19:36实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。

其实和显示汉字的程序一样,只是稍做一下修改即可。

C语言源程序如下:#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>sbit RS=P2^4;sbit WRD=P2^5;sbit E=P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT[]={"我是一个中国人啊"};void initinal(void){delay(40);PSB=1; //并口工作模式delay(1);RES=0; //复位delay(1);RES=1; //复位置高delay(10);TransferData(0x30,0);delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);}void main(void){while(1){initinal();//调用LCD字库初始化程序delay(100);lcd_mesg003(IC_DAT);}}void lcd_mesg003(unsigned char code *addr1){unsigned char i;//第一行TransferData(0x80,0);delay(100);for(i=0;i<16;i++){TransferData(*addr1,1);addr1++;delayms(50);}}void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}原理就是在显示每个汉字的时候加了一个延时程序,当然可以用定时器来实现,这样的话,不占用CPU处理时间。

DS1302时钟程序(完整版),液晶显示

DS1302时钟程序(完整版),液晶显示

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar table0[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //液晶显示数字0——9代码sbit SCLK=P1^0;sbit DATA=P1^1;sbit CE=P1^2;sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit FB=P0^7;sbit start=P1^4;sbit stop=P1^5;uchar i;/*******************延时n微秒函数*****************/void delaynus(uchar n) //n us延时函数{// uchar i;for(i=n;i>0;i--);}/*******************写数据函数*****************/void write1302(uchar add,uchar dat){CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=0;i<8;i++) //写入数据{DATA=dat&0x01;SCLK=1;SCLK=0;dat>>=1;}SCLK=1;CE=0;}/*******************读数据函数*****************/uchar read1302(uchar add){uchar dat;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=8;i>0;i--) //读出数据/********************为神马???**************************/{dat>>=1;if(DATA==1)dat=dat|0x80;SCLK=1;SCLK=0;}SCLK=1;CE=0;return dat;}/*******************DS1302初始化函数*****************/void init1302(){uchar flag;flag=read1302(0x81);if(flag&0x80){write1302(0x8e,0x00);write1302(0x80,0x00);write1302(0x82,(((1/10)<<4)|(1%10)));write1302(0x84,(((20/10)<<4)|(20%10)));write1302(0x86,(((19/10)<<4)|(19%10)));write1302(0x88,(((7/10)<<4)|(7%10)));write1302(0x8a,((2/10)<<4)|(2%10));write1302(0x8c,(((11/10)<<4)|(11%10)));write1302(0x90,0xa5); //充电。

51单片机带字库液晶12864ds1302数字时钟c源程序(无按键修改功能)

51单片机带字库液晶12864ds1302数字时钟c源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C 源程序(无按键修改功 能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了 这个程序。

目前还不能修改时间与日期,只是以预定时间以始。

适用于开发板:51单片机(AT89S52 +带字库液晶12864(ST7920)+DS1302实时时钟)实现功能:简单,数字时钟 +日期(以后会不断完美)。

C 语言源程序如下:#include <reg52.h>#include <intrins.h> #define uchar unsigned char #define uint unsigned int /*DS1302 端 口设置 */sbit SCK=P3A 6;sbit SDA=P3A4;sbit RST = P3A5;bitReadRTC_Flag;/* 12864 端口定义 */ #define LCD_data P0 sbit LCD_RS = P2A4;sbit LCD_RW = P2A5; sbit LCD_EN = P2A 6;//液晶使能控制sbit PSB 二卩2八1; //并口控制 //DS1302 时钟 //DS1302 IO // DS1302 复位 //读DS1302全局变量//带字库液晶 12864数据口// 寄存器选择输入// 液晶读/写控制sbit RES=P2A3;uchar code dis1[] = {"电子设计天地"};// 液晶显示的汉字uchar code dis2[] = {"有志者,事竟成!"};uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'};unsigned char temp;#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};void lcd_pos(uchar X,uchar Y); //确定显示位置unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};〃秒分时日月周年09-10-19 16:07:00code unsigned charwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位code unsigned charread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);//read RTCvoid Set_RTC(void); //set RTCvoid InitTIMER0(void);//inital timer0/*******************************************************************//**//* 延时函数 *//* *//******************************************************************* /void delay(unsigned int m) // 延时程序 {unsigned int i,j;for(i=0;i<m;i++)**************************************************//*检查LCD 忙状态*//*lcd_busy 为1时,忙,等待。

51单片机控制DS1302在液晶12864上的时间显示

51单片机控制DS1302在液晶12864上的时间显示
delay(2); sclk=0;
} return DAT; }
/******************************************************************* 函数名称: UCHAR 1302_read( UCHAR add )
函数功能: 读出指定位置的数据 输入参数: add,地址; 输出函数: Temp
********************************************************************/
UCHAR DS1302_read( UCHAR add )
{
UCHAR Temp;
ce=0;
sclk=0;
ce=1; DS1302write_byte( add );
/******************************************************************* 函数名称:1302write_byte( UCHAR dat)
函数功能: 写入一个字节( 在 sclk 的上升沿写入,最低位先写入 ) 输入参数: dat 要写入的字节 输出函数: 无
********************************************************************/
UCHAR DS1302read_byte( ) { int i; UCHAR DAT;
sclk=0; for(i=0;i<8;i++)
{ DAT=DAT>>1; if(io==1) DAT|=0x80; sclk=1;
********************************************************************/ห้องสมุดไป่ตู้

用51单片机控制12864显示数字时钟

用51单片机控制12864显示数字时钟

用51单片机控制12864显示数字时钟用51单片机控制12864显示数字时钟里面有128564显示汉字的程序,自己研究下,不过是用msp430控制的,你改改端口i就可以了。

#include "msp430x26x.h"#define uchar unsigned char#define uint unsigned int#define iDat 1 //数据标志#define iCmd 0 //指令标志#define LCDb_RS 0x20 //定义四个控制引脚#define LCDb_RW 0x40#define LCDb_E 0x80#define LCDb_RST 0x04#define LCDb_L1 0x80 //第一行的地址#define LCDb_L2 0x90 //第二行的地址#define LCDb_L3 0x88 //第三行的地址#define LCDb_L4 0x98 //第四行的地址#define LCDb_SET_RS P1OUT|=LCDb_RS //四个控制管脚的控制操作#define LCDb_SET_RW P1OUT|=LCDb_RW#define LCDb_SET_E P1OUT|=LCDb_E#define LCDb_SET_RST P8OUT|=LCDb_RST#define LCDb_CLR_RS P1OUT&=~LCDb_RS#define LCDb_CLR_RW P1OUT&=~LCDb_RW#define LCDb_CLR_E P1OUT&=~LCDb_E#define LCDb_CLR_RST P8OUT&=~LCDb_RST#define LCDb_DO P4OUT //输出数据总线端口定义#define LCDb_FUNCTION 0x38 // 液晶模式为8位,2行,5*8字符#define LCDb_BASCMD 0x30 // 基本指令集#define LCDb_CLS 0x01 // 清屏#define LCDb_HOME 0x02 // 地址返回原点,不改变DDRAM 内容#define LCDb_ENTRY 0x06 // 设定输入模式,光标加,屏幕不移动#define LCDb_C2L 0x10 // 光标左移#define LCDb_C2R 0x14 // 光标右移#define LCDb_D2L 0x18 // 屏幕左移#define LCDb_D2R 0x1C // 屏幕又移#define LCDb_ON 0x0C // 打开显示#define LCDb_OFF 0x08 // 关闭显示unsigned char RXData;unsigned char Seg_Data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x 6f} ; //数码管编码unsigned char Result[5]; //整数转化成字符串,给LCD显示void Delayms(uint MS){uint i,j;for( i=0;i<ms;i++)< bdsfid="104" p=""></ms;i++)<>for(j=0;j<1141;j++);}void Delayus(uint US){uint i;US=US*5/4;for( i=0;i<us;i++);< bdsfid="112" p=""></us;i++);<>}void LCD12864_portini()P1DIR=0xFF;P4DIR=0xFF;P5DIR=0xFF;P8DIR=0xFF;P8OUT |=LCDb_RST;// P1OUT=0xFF;}/*函数名称: LCD12864_sendbyte功能: 向12864液晶写入一个字节数据或者指令*/void LCD12864_sendbyte(uchar DatCmd, uchar dByte) {if (DatCmd == iCmd) //指令操作LCDb_CLR_RS;elseLCDb_SET_RS;LCDb_CLR_RW; //写操作LCDb_SET_E;LCDb_DO = dByte; //写入数据//Delayus(500);Delayms(1);LCDb_CLR_E;}/*函数名称: LCD12864_sendstr功能: 向12864液晶写入一个字符串参数: ptString--字符串指针返回值 : 无*/void LCD12864_sendstr(uchar *ptString)while((*ptString)!='\0') //字符串未结束一直写{LCD12864_sendbyte(iDat, *ptString++);}}/*函数名称: LCD12864_clear功能: 12864液晶清屏参数: 无返回值 : 无*/void LCD12864_clear(void){LCD12864_sendbyte(iCmd,LCDb_CLS);Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的}/*函数名称: LCD12864_gotoXY功能: 移动到指定位置参数: Row--指定的行Col--指定的列返回值 : 无*/void LCD12864_gotoXY(uchar Row, uchar Col){switch (Row) //选择行{case 2:LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break; //写入第2行的指定列case 3:LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break; //写入第3行的指定列case 4:LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break; //写入第4行的指定列default:LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break; //写入第1行的指定列}}/*函数名称: LCD12864_initial功能: 12864液晶初始化*/void LCD12864_initial(void){Delayms(100); // 等待内部复位LCD12864_portini(); //端口初始化LCD12864_sendbyte(iCmd, LCDb_FUNCTION); //功能、模式设定LCD12864_sendbyte(iCmd, LCDb_ON); //打开显示LCD12864_clear(); //清屏LCD12864_sendbyte(iCmd, LCDb_ENTRY); // 输入模式设定}void Int_char(int data){if(data/1000){Result[0]=data/1000+'0';Result[1]=data/100%10+'0';Result[2]=data/10%10+'0';Result[3]=data%10+'0';Result[4]=0;}else if(data/100){Result[0]=data/100+'0';Result[1]=data/10%10+'0';Result[2]=data%10+'0';Result[3]=0;}else if(data/10){Result[0]=data/10%10+'0';Result[1]=data%10+'0';Result[2]=0;}else{Result[0]=data%10+'0';Result[1]=0;}}unsigned char Key_Press(void){P7OUT=0xF0;if((P7IN&0x10)&&(P7IN&0x20)&&(P7IN&0x40)&&(P7IN&0 x80)) return 0x00; else return 0xFF;}unsigned char Get_Keycode(void){while(1)P7OUT=0xFE; //扫描第一列if((P7IN&0x10)==0) return 0;else if((P7IN&0x20)==0) return 4;else if((P7IN&0x40)==0) return 8;else if((P7IN&0x80)==0) return 12;P7OUT=0xFD; //扫描第二列if((P7IN&0x10)==0) return 1;else if((P7IN&0x20)==0) return 5;else if((P7IN&0x40)==0) return 9;else if((P7IN&0x80)==0) return 13;P7OUT=0xFB; //扫描第三列if((P7IN&0x10)==0) return 2;else if((P7IN&0x20)==0) return 6;else if((P7IN&0x40)==0) return 10;else if((P7IN&0x80)==0) return 14;P7OUT=0xF7; //扫描第四列if((P7IN&0x10)==0) return 3;else if((P7IN&0x20)==0) return 7;else if((P7IN&0x40)==0) return 11;else if((P7IN&0x80)==0) return 15;}}void Init_compa(){CACTL1 = CAON+CAREF_2+CARSEL; // Enable Comp, ref = 0.5*Vcc = Vin- CACTL2 = P2CA0; // Pin to CA0P1DIR |= 0x01; // P1.0 = o/p direction(CAOUT - LED) P1SEL |= 0x01; // P1.0 - CAOUT, option select}** 函数名称:初始化函数*/void Init_IIC(void){P3SEL |= 0x06; // Assign I2C pins to USCI_B0UCB0CTL1 |= UCSWRST; // Enable SW resetUCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous modeUCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW resetUCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHzUCB0BR1 = 0;UCB0I2CSA = 0x50; // Slave Address is 048hUCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation IE2 |= UCB0RXIE; // Enable RX interrupt_BIS_SR(GIE);// RXCompare = 0x0; // Used to check incoming data }/** 函数名称:字节写函数*/void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word){while (UCB0CTL1 & UCTXSTP); // 确定总线空闲UCB0CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为发送模式UCB0TXBUF = high_Address; // 发送高位地址while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕UCB0TXBUF = low_Address; // 发送低位地址while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕UCB0TXBUF = Word; // 发送数据while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕UCB0CTL1 |= UCTXSTP; // 发送停止位while((UCB0CTL1 & UCTXSTP)==1); // 判断停止位是否发送完毕}/**** 函数名称:字节读函数*/void EEPROM_readmore(){UCB0CTL1 &= ~UCTR; // 确定为读while (UCB0CTL1 & UCTXSTP); // 总线是否空闲UCB0CTL1 |= UCTXSTT; // 发送开始位}/*** 函数名称:字节写函数**/void EEPROM_read(unsigned char high_Address,unsigned char low_Address){while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为写UCB0TXBUF = high_Address; // 发送地址位高位while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕UCB0TXBUF = low_Address; // 发送地址位低位while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕UCB0CTL1 &= ~UCTR; // 确定为接收while (UCB0CTL1 & UCTXSTP); //UCB0CTL1 |=UCTXSTT ;while((UCB0CTL1 & UCTXSTT)==1);for(unsigned char i=0x0;i<0x2f;i++); // 延时确定数据已经被发送出去UCB0CTL1 |=UCTXSTP + UCTXNACK; // 发送停止位和NACK 位}/*** 函数名称:接收中断函数**/// USCI_B0 Data ISR#pragma vector = USCIAB0TX_VECTOR__interrupt void USCIAB0TX_ISR(void){RXData = UCB0RXBUF; // Get RX dataInt_char(RXData);LCD12864_gotoXY(2,0); //第2行,第1列显示LCD12864_sendstr(Result);/*key_code[0]=RXData%10+'0';key_code[1]=0;LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr(key_code);*/// __bic_SR_register_on_exit(CPUOFF); // Exit LPM0}void Init_UART(){P3OUT &= ~(BIT4+BIT5+BIT6+BIT7);P3SEL = 0xF0; // P3.4,5,6,7 = USCI_A0 TXD/RXD USCI_A1 TXD/RXDUCA0CTL1 |= UCSSEL_1; // CLK = ACLKUCA0BR0 = 0x03; // 32kHz/9600 = 3.41UCA0BR1 = 0x00; //UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt UCA1CTL1 |= UCSSEL_1; // CLK = ACLKUCA1BR0 = 0x03; // 32kHz/9600 = 3.41UCA1BR1 = 0x00; //UCA1MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UC1IE |= UCA1RXIE; // Enable USCI_A0 RX interrupt _BIS_SR(GIE); //使能中断}void Init_ADC(){ADC12CTL0 = SHT0_2 + ADC12ON; // Set sampling time, turn on ADC12 ADC12CTL1 = SHP; // Use sampling timer ADC12IE = 0x01; // Enable interruptADC12CTL0 |= ENC; // Conversion enabledP6DIR &= 0x01; // P6.0, i/pP6SEL |= 0x01; // P6.0-ADC option select_BIS_SR(GIE); //使能中断}void Start_ADC(){ADC12CTL0 |= ADC12SC; // Start convn, software controlled }#pragma vector=USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF; // TX -> RXed characterLCD12864_sendbyte(iDat,UCA0RXBUF);}#pragma vector=USCIAB1RX_VECTOR__interrupt void USCI1RX_ISR(void){while (!(UC1IFG&UCA1TXIFG)); // USCI_A0 TX buffer ready? UCA1TXBUF = UCA1RXBUF; // TX -> RXed characterLCD12864_sendbyte(iDat,UCA0RXBUF);//UCA1TXBUF = 'z';}// ADC12 interrupt service routine#pragma vector=ADC12_VECTOR__interrupt void ADC12_ISR (void){int i=ADC12MEM0;Int_char(i);LCD12864_gotoXY(2,0); //第1行,第1列显示LCD12864_sendstr(Result);/*key_code[0] =i/1000+'0';key_code[1] =i/100%10+'0';key_code[2] =i/10%10+'0';key_code[3] =i%10+'0';key_code[4] =0;LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr(key_code);*/}void Init_all(){LCD12864_initial(); //LCD初始化,包含了数码管和LED灯初始化P7DIR=0x0F; //键盘扫描初始化P7REN=0xF0; //输入上下拉电阻使能,输出上下拉不使能P7OUT=0xF0; //输入上拉Init_UART(); //串口初始化Init_compa(); //比较器初始化Init_ADC(); //ADC初始化Init_IIC(); //IIC初始化}void Test_Led(){unsigned char i=0;LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr("1.Test_LED");for(;i<16;i++){P8OUT=0xF0|i;Delayms(50);}}void Test_Seg(){int i;LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr("2.Test_SEG");for(i=0;i<500;i++){//4,3,2,1P1OUT&=~0x02;P1OUT|=0x10|0x08|0x04;P5OUT=Seg_Data[9]; //清楚数码管显示Delayms(1); P1OUT&=~0x04;P1OUT|=0x10|0x08|0x02;P5OUT=Seg_Data[8]; //清楚数码管显示Delayms(1); P1OUT&=~0x08;P1OUT|=0x10|0x04|0x02;P5OUT=Seg_Data[7]; //清楚数码管显示Delayms(1); P1OUT&=~0x10;P1OUT|=0x08|0x04|0x02;P5OUT=Seg_Data[6]; //清楚数码管显示Delayms(1); }P5OUT=0x00; //熄灭所有数码管}void Test_Key(){unsigned char i=0;LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr("3.Test_KEY");LCD12864_gotoXY(2,0); //第2行,第1列显示LCD12864_sendstr("按键:");for(;i<16;i++){Int_char(Get_Keycode());LCD12864_gotoXY(2,3);LCD12864_sendstr(" ");LCD12864_gotoXY(2,3);LCD12864_sendstr(Result);Delayms(100); //防抖}}void Test_Uart(){LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr("4.Test_UART");LCD12864_gotoXY(2,0); //第2行,第1列显示}void Test_Compa(){LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr("5.Test_COMPA");}void Test_ADC(){int i=0;LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr("6.Test_ADC");for(;i<200;i++){Start_ADC();Delayms(10);}}void Test_IIC(){LCD12864_gotoXY(1,0); //第1行,第1列显示LCD12864_sendstr("7.Test_IIC");EEPROM_Write(0x00,0x40,7); // 字节写Delayms(10);EEPROM_read(0x00,0x40);}void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗Init_all();while(1){Test_Led(); //1.测试LEDLCD12864_gotoXY(2,0); //第1行,第1列显示LCD12864_sendstr("请按16键!");while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子LCD12864_clear();Test_Seg(); //2.测试数码管LCD12864_gotoXY(2,0); //第1行,第1列显示LCD12864_sendstr("请按16键!");while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子LCD12864_clear();Test_Key(); //3.测试按键扫描LCD12864_gotoXY(2,0); //第1行,第1列显示LCD12864_sendstr("请按16键!");while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子LCD12864_clear();LCD12864_gotoXY(3,0); //第3行,第1列显示LCD12864_sendstr("请按16键!");Test_Uart(); //4.测试串口while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子LCD12864_clear();Test_Compa(); //5.测试比较器LCD12864_gotoXY(2,0); //第2行,第1列显示LCD12864_sendstr("请按16键!");while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子LCD12864_clear();Test_ADC(); //6.测试ADCLCD12864_gotoXY(3,0); //第3行,第1列显示LCD12864_sendstr("请按16键!");while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子LCD12864_clear();Test_IIC(); //7.测试IICDelayms(100);LCD12864_gotoXY(3,0); //第3行,第1列显示LCD12864_sendstr("测试完成");while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子LCD12864_clear();}}。

ds1302显示在12864的c语言程序

ds1302显示在12864的c语言程序
dat1 = dat / 10;
dat2 = dat % 10;
dat2 = dat2 + dat1 * 16;
return dat2;
}
//BCD码转换为数据
uchar BCD_Chg_Dat(uchar dat)
{
uchar dat1, dat2;
dat1 = dat / 16;
dat2 = dat % 16;
TSCLK = 1;//拉高时钟总线,产生上升沿数据被DS1302读走
cmd >>=1;//右移一位
}
for(i = 0; i < 8; i++)//每次写1位,写8次
{
TSCLK = 0;//拉低时钟总线
TIO = dat & 0x01; //写1位数据,从最低位开始写
TSCLK = 1;//拉高时钟总线,产生上升沿数据被DS1302读走
{
uchar i;
TRST = 0; //拉低使能端
TSCLK = 0;//拉低数据总线
TRST = 1; //拉高使能端,产生上升沿开始写数据
for(i = 0; i < 8; i++)//每次写1位,写8次
{
TSCLK = 0;//拉低时钟总线
TIO = cmd & 0x01; //写1位数据,从最低位开始写
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define MAIN_Fosc11059200UL//宏定义主时钟HZ

(完整版)基于51系列单片机及DS1302时钟芯片的电子时钟_C语言毕业论文

(完整版)基于51系列单片机及DS1302时钟芯片的电子时钟_C语言毕业论文

实时时钟DS1302应用设计高也(陕西理工学院物理与电信工程学院电子信息工程专业,2011级3班,陕西汉中723000)指导教师:王文洋[摘要] 本设计主要为实现一款可正常显示时钟日历、带有定时闹铃的多功能电子时钟。

本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。

本设计应用AT89C52芯片作为核心,LM016L液晶屏显示,使用DS1302实时时钟日历芯片完成时钟日历的基本功能。

这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。

[关键词] AT89C52;DS1302;LM016L目录1、基于单片机的电子时钟硬件选择分析..............................................................................1.1主要IC芯片选择.......................................................................................................1.1.1微处理器选择.................................................................................................1.1.2 DS1302简介...................................................................................................2、电子时钟硬件电路设计......................................................................................................2.1.主控部分(单片机MCS-51).......................................................................................2.2时钟电路设计.............................................................................................................2.3整点报时功能.............................................................................................................2.4 LED显示电路.............................................................................................................3、proteus软件仿真及调试 (1)3.1电路板的仿真 (1)3.2软件调试....................................................................................................................4、硬件调试与功能说明 (1)4.1 硬盘调试 (1)4.2 系统性能测试与功能说明 (1)4.3 系统时钟误差分析 (1)5、课设心得 (1)参考文献 (1)附录A 硬件电路原理图 (1)附录B源程序 (1)附录C 元器件清单 (2)1、基于单片机的电子时钟硬件选择分析考虑单片机货源充足、价格低廉,可软硬件结合使用,能够较方便的实现系统的多功能性,故采用单片机作为本设计的硬件基础。

DS1302时钟芯片C51驱动程序

DS1302时钟芯片C51驱动程序

DS1302时钟芯片C51驱动程序/**********************************************程序名称:DS1302时钟芯片C51驱动程序简要说明:read_clockS函数为读取时钟数据调用Set_time即可调整时间并写入DS1302sel为调整标志,可通过外部按键来更改其值来源:整理杜洋程序文档所得**********************************************///定义头文件#include/************************************************************** ****///定义DS1302时钟接口sbit clock_clk = P1 ^ 0; //ds1302_clk(时钟线)sbit clock_dat = P1 ^ 1; //ds1302_dat(数据线)sbit clock_Rst = P1 ^ 2; //ds1302_Rst(复位线)/************************************************************** ****///定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/************************************************************** ****///定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss; //定义时间映射全局变量/************************************************************** ****///声明unsigned char clock_in(void);void clock_out(unsigned char dd);void Init_1302(void);unsigned char read_clock(unsigned char ord);void read_clockS(void);void Set_time(unsigned char sel);void write_clock(unsigned char ord, unsigned char dd);/************************************************************** ****///常用时钟数据读取void read_clockS(void){ss = read_clock(0x81); //读取秒数据mm = read_clock(0x83); //读取分钟数据hh = read_clock(0x85); //小时dd = read_clock(0x87); //日mo = read_clock(0x89); //月xq = read_clock(0x8b); //星期yy = read_clock(0x8d); //年}/************************************************************** ****///调时用加1或减1程序void Set_time(unsigned char sel){//根据选择调整的相应项目加1或减1并写入DS1302,sel为调整项标志,通过外部程序来影响它signed char address,item;signed char max,mini;if(sel==6) {address=0x80; max=0;mini=0;} //秒7if(sel==5) {address=0x82; max=59;mini=0;} //分钟6if(sel==4) {address=0x84; max=23;mini=0;} //小时5if(sel==3) {address=0x8a; max=7;mini=1;} //星期4if(sel==2) {address=0x86; max=31;mini=1;} //日3if(sel==1) {address=0x88; max=12;mini=1;} //月2if(sel==0) {address=0x8c; max=99; mini=0;} //年1//读取1302某地址上的数值转换成10进制赋给itemitem=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;if(ADD_KEY == 0){item++;} //增加键(ADD_KEY)按下,数加1if(DEC_KEY == 0){item--;} //减少键(DEC_KEY)按下,数减 1 if(item>max) item=mini; //查看数值有效范围if(itemwrite_clock(0x8e,0x00); //允许写操作write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302write_clock(0x8e,0x80); //写保护,禁止写操作}/************************************************************** ****///设置1302的初始时间void Init_1302(void)//(2009年1月1日00时00分00秒星期一){write_clock(0x8e,0x00); //允许写操作write_clock(0x8c,0x09); //年write_clock(0x8a,0x01); //星期write_clock(0x88,0x01); //月write_clock(0x86,0x01); //日write_clock(0x84,0x00); //小时write_clock(0x82,0x00); //分钟write_clock(0x80,0x00); //秒write_clock(0x90,0xa5); //充电write_clock(0x8e,0x80); //禁止写操作}/************************************************************** ****///DS1302写数据(底层协议)void write_clock(unsigned char ord, unsigned char dd){clock_clk=0;clock_Rst=0;clock_Rst=1;clock_out(ord);clock_out(dd);clock_Rst=0;clock_clk=1;}/************************************************************** ****///1302驱动程序(底层协议)void clock_out(unsigned char dd){ACC=dd;clock_dat=a0; clock_clk=1; clock_clk=0;clock_dat=a1; clock_clk=1; clock_clk=0;clock_dat=a2; clock_clk=1; clock_clk=0;clock_dat=a3; clock_clk=1; clock_clk=0;clock_dat=a4; clock_clk=1; clock_clk=0;clock_dat=a5; clock_clk=1; clock_clk=0;clock_dat=a6; clock_clk=1; clock_clk=0;clock_dat=a7; clock_clk=1; clock_clk=0;}/************************************************************** ****///DS1302写入字节(底层协议)unsigned char clock_in(void){clock_dat=1;a0=clock_dat;clock_clk=1; clock_clk=0; a1=clock_dat;clock_clk=1; clock_clk=0; a2=clock_dat;clock_clk=1; clock_clk=0; a3=clock_dat;clock_clk=1; clock_clk=0; a4=clock_dat;clock_clk=1; clock_clk=0; a5=clock_dat;clock_clk=1; clock_clk=0; a6=clock_dat;clock_clk=1; clock_clk=0; a7=clock_dat;return(ACC);}/************************************************************** ****///DS1302读数据(底层协议)unsigned char read_clock(unsigned char ord){unsigned char dd=0;clock_clk=0;clock_Rst=0;clock_Rst=1;clock_out(ord);dd=clock_in();clock_Rst=0;clock_clk=1;return(dd);}/************************************************************** ****/。

DS1302时钟芯片51单片机c语言程序

DS1302时钟芯片51单片机c语言程序

#ifndef __DS1302_H__#define __DS1302_H__#define uchar unsigned char#define uint unsigned int#includesbit SCLK = P3^2;sbit IO = P2^4;sbit RST = P3^3;#define R_Second 0x81#define W_Second 0x80#define R_Minute 0x83#define W_Minute 0x82#define R_Hour 0x85#define W_Hour 0x84h#define R_Day 0x87#define W_Day 0x86_n_#define R_Month 0x89澝儙#define W_Month 0x88 #define R_Week 0x8B#define W_Week 0x渢#define R_Year 0x8D#define W_Year 0x8C?^•#define R_Control 0xu _簭_•void DS1302_Write_Byte(uchar Date;?void Write_DS1302(uchar Adr,uchar Date;uchar Read_DS1302(uchar Adr;void Init_DS1302(;'#endifW燊/************************************************************** 函數名稱 _Z_k謃?缧?_恄漀騋单字节写葅发亽輸入參數:写的字节U輸出參數 -_无M;1,?備<5%注:**************************************************************/F _void DS1302_Write_Byte(uchar Date{琿彆 uchar i;G for(i = 0;i < 8;i++{ if(Date & 0x01IO = 1;else_鞺穢齄 IO = 0;O _ SCLK = 1;3┋SCLK = 0;}诰搕謃鋃乓莗れ擾葞U/************************************************************** : uchar DS1302_Read_Byte(•函數功能:单字节读恳輸入參數蛈w{-无E轆儡:|3?o读出的数据備注:**************************************************************/ uchar DS1302_Read_Byte(!b{uchar i,Temp = 0;for(i = 0;i < 8;i++{ Temp = Temp >> 1;(_eTemp = Temp | 0x80;SCLK = 1;}return Temp;Y仞_Gv'€+枊瞒~0壇糪f?_6篢2擺Pz;函數功能:写数据輸入參數 &率郷骋確_F澼 G?_弒]u_q无蘤窓膠注巓钌鑪**************************************************************/v嗣趉{藁mSCLK = 0;RST = 1;DS1302_Write_Byte(Adr;濒 DS1302_Write_Byte(Date;i Mc}n/************************************************************** 殧泛曋ㄖ嬪i: uchar Read_DS1302(uchar Adr齙鳑扼蝊_╛嵖??>輸入參數檟_范:U?T啃禈輸出參數:读出的数据拥&__ 注:_**************************************************************/ uchar Read_DS1302(uchar Adr{uchar Temp = 0;RST = 0;4_RST = 1;DS1302_Write_Byte(Adr;Temp = DS1302_Read_Byte(;RST = 0;潵擾?_獐衉}悱qG_?帶燙ㄚ負焉/************************************************************** 函數名稱:_函數功能陕鮛€_kE_P_w?鋃DS1302o齙:无?輸出參數: U _?眶備注:@_2•蒧void Init_DS1302(癬窥Q_u瞪I _%~唼? _镈 Write_DS1302(W_Month,0x09;中_# 疴FWrite_DS1302(W_Minute,0x11;Write_DS1302(W_Second,0x23;Write_DS1302(W_Control,0x80;_Ts}<。

51单片机驱动DS1302时间模块

51单片机驱动DS1302时间模块

51单片机驱动DS1302时间模块+DS18B20温度传感器模块+12864液晶显示完整程序设计作者:jdzj868 来源:机电之家下载站录入:jdzj868 更新时间:2010-1-26 16:34:51点击数:0【字体:】程序说明:这是一个用51单片机驱动DS1302时间模块+DS18B20温度传感器模块+12864液晶显示完整程序设计实例,有四个键盘KEY0 到KEY3,key0是修改时间的首先是秒到分到时到年到月到日到星期 key1是加1 key2是减一在修改时间状态再按一下key3的时候就出去并修改时间日期,在平时状态按着key3再按着key2 就会打开lcd 的灯单单是只按key3那就是把灯关了。

文件一:DS1302驱动.c#include//ds1302sbit sclk=P0^3;sbit io=P0^4;sbit rst=P0^5;sbit acc0=ACC^0;sbit acc1=ACC^1;sbit acc2=ACC^2;sbit acc3=ACC^3;sbit acc4=ACC^4;sbit acc5=ACC^5;sbit acc6=ACC^6;sbit acc7=ACC^7;delay(){unsigned char i;i=10;i=10;i=10;i=10;i=10;i=10;i=10;}w_1302(unsigned char dat,unsigned char shu){//写一个八位的数去DS1302 //上升效 ;;;选写地址再写数据ACC=dat;//地址sclk=0;rst=1;//io=acc0;///sclk=0;delay();sclk=1;io=acc1;sclk=0;delay();sclk=1;io=acc2;sclk=0;delay();sclk=1;io=acc3;sclk=0;delay();io=acc4;sclk=0;delay();sclk=1;io=acc5;sclk=0;delay();sclk=1;io=acc6;sclk=0;delay();sclk=1;io=acc7;sclk=0;delay();sclk=1;/////sclk=0; ACC=shu; //数据io=acc0;/// sclk=0;delay();sclk=1;io=acc1;sclk=0;delay();sclk=1;sclk=0;delay();sclk=1;io=acc3;sclk=0;delay();sclk=1;io=acc4;sclk=0;delay();sclk=1;io=acc5;sclk=0;delay();sclk=1;io=acc6;sclk=0;delay();sclk=1;io=acc7;sclk=0;delay();sclk=1;///rst=0;sclk=0;} ///写完毕unsigned char r_1302(unsigned char ADD){sclk=0;rst=1;ACC=ADD; //地址io=acc0;/// sclk=0;delay();sclk=1;io=acc1;sclk=0;delay();sclk=1;io=acc2;sclk=0;delay();sclk=1;io=acc3;sclk=0;delay();sclk=1;io=acc4;sclk=0;delay();sclk=1;io=acc5;sclk=0;delay();sclk=1;io=acc6;delay(); sclk=1;io=acc7; sclk=0;///// delay(); sclk=1; delay(); sclk=0;acc0=io; delay(); sclk=1; delay(); sclk=0;acc1=io; delay(); sclk=1; delay(); sclk=0;acc2=io; delay(); sclk=1; delay(); sclk=0;acc3=io; delay(); sclk=1; delay(); sclk=0;delay();sclk=1;delay();sclk=0;acc5=io;delay();sclk=1;delay();sclk=0;acc6=io;delay();sclk=1;delay();sclk=0;acc7=io;delay();rst=0;sclk=0;return(ACC);}ds1302_c(){w_1302(0x80,0x80);w_1302(0x8e,0x00);w_1302(0x80,0x50); //;秒w_1302(0x82,0x06); // 分=0w_1302(0x84,0x01); //时 =0w_1302(0x86,0x22); //w_1302(0x88,0x11);//w_1302(0x8a,0x04);//w_1302(0x8b,0x07);//w_1302(0x8e,0x80);w_1302(0x90,0xa6);w_1302(0x80,0x00);}main(){rst=0;ds1302_c();for(;;){P2=r_1302(0x81);}}---------------------------------------------------------------------------------------------------------------文件2:完全版有关灯键.c#includesbit di = P2^7; ////////定义引脚sbit rw = P2^6;sbit e = P2^5;sbit cs1 = P2^4;sbit cs2 = P2^1;sbit lcd_d = P2^0;sbit key0 = P2^3;sbit key1 = P2^2;sbit key2 = P1^0;sbit key3 = P1^1;sbit P07 = P0^7;sbit P06 = P0^6;sbit P05 = P0^5;sbit P04 = P0^4;sbit P03 = P0^3;//ds1302sbit sclk=P1^4;sbit io=P1^3;sbit rst=P1^2;sbit acc0=ACC^0;sbit acc1=ACC^1;sbit acc2=ACC^2;sbit acc3=ACC^3;sbit acc4=ACC^4;sbit acc5=ACC^5;sbit acc6=ACC^6;sbit acc7=ACC^7;typedef unsigned char byte;typedef unsigned int word;sbit KEY=P3^7;//根据实际情况定义端口ds1820 unsigned char key_time=0; //全局变量//////////////////////////////////温度//ds18b20数字温度传感器模块程序void delay1(word useconds){for(;useconds>0;useconds--);}//复位byte ow_reset(void){byte presence;KEY = 0; //pull DQ line lowdelay1(29); // leave it low for 480usKEY = 1; // allow line to return highdelay1(3); // wait for presencepresence = KEY; // get presence signaldelay1(25); // wait for end of timeslotreturn(presence); // presence signal returned } // 0=presence, 1 = no part//从 1-wire 总线上读取一个字节byte read_byte(void){byte i;byte value = 0;for (i=8;i>0;i--){value>>=1;KEY = 0; // pull DQ low to start timeslotKEY = 1; // then return highdelay1(1); //for (i=0; i<3; i++);if(KEY)value|=0x80;delay1(6); // wait for rest of timeslot}return(value);}//向 1-WIRE 总线上写一个字节void write_byte(char val){byte i;for (i=8; i>0; i--) // writes byte, one bit at a time {KEY = 0; // pull DQ low to start timeslotKEY = val&0x01;delay1(5); // hold value for remainder of timeslot KEY = 1;val=val/2;}delay1(5);}//读取温度float wendu(void){float tem;union{byte c[2];}temp;ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0xBE); // Read Scratch Pad temp.c[1]=read_byte(); //lsdtemp.c[0]=read_byte(); //msdow_reset();write_byte(0xCC); //Skip ROMwrite_byte(0x44); // Start Conversiontem=0.0;if(temp.x & 0x01) tem+=0.0625;temp.x>>=1; if(temp.x & 0x01) tem+=0.125;temp.x>>=1; if(temp.x & 0x01) tem+=0.25;temp.x>>=1;if(temp.x & 0x01) tem+=0.5;temp.x>>=1; tem+=temp.x;return tem;}void cs1_lcd(){ ////////选择左边bit a=1;cs1=a;cs2=!a;}void cs2_lcd(){ ////////选择右边cs1=!a;cs2=a;}void busy_lcd(){//////判断忙bit a=1;di=!a;rw=a;e=a;while(P07==a);}w_lcd(unsigned b){ ///写a到12864bit a=1;busy_lcd();rw =!a;di =a;P0=b;e=a;e=!a;}void dis_lcd(){//打开显示选择第一行显示bit a=1;busy_lcd();rw=!a;di=!a;P0=0x3f;e=a;e=!a;P0=0xc0;e=a;e=!a;}y_lcd(unsigned a){///由A确定y轴bit b=1;busy_lcd();rw=!b;di=!b;P0=a;P07=b;P06=!b;P05=b;P04=b;P03=b;e=b;e=!b;}x_lcd(unsigned a){//由a确定X轴bit b=1;busy_lcd();rw=!b;di=!b;P0=a;P07=!b;P06=b;e=b;e=!b;}void clr_lcd(){///清屏bit a=0;unsigned x,y,date,i;cs1_lcd();date=0x00;for(i=0;i<2;i++){for(y=0;y<8;y++)for(x=0;x<64;x++){x_lcd(x);y_lcd(y);w_lcd(date);}cs2_lcd();}}unsigned char code shu[18][16]={///0到9数字{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0 {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1 {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},//2 {0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},//3 {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},///4 {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5 {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6 {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7 {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8 {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},//9 {0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},// : {0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00},// / };unsigned char code shu1[9][32]={///{0x02,0x42,0x42,0xFE,0x42,0x42,0xFE,0x02,0x02,0xFA,0x02,0x02,0xFE,0x00,0x00,0x00,0x08,0x08,0x 08,0x07,0x84,0x44,0x23,0x18,0x06,0x01,0x3E,0x40,0x43,0x40,0x78,0x00},//现12{0x00,0x04,0x04,0xC4,0x64,0x9C,0x87,0x84,0x84,0xE4,0x84,0x84,0x84,0x84,0x04,0x00,0x04,0x02,0x 01,0x7F,0x00,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x00},//在 13{0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,0x00,0x07,0x 04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00},//时 14{0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,0x00,0xFF,0x 00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00},//间 15{0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,0x48,0x 46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00},//星 16{0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x42,0x22,0x 1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00},//期 17{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,0x02,0xFE,0x 01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00},//温18{0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,0x80,0x60,0x 1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00},//度19};unsigned char time1[7]={0x30,0x00,0x16,8,7,2,8};//分别是秒,分,时,日,月,星期,年次子程序出自 hkcd斑竹,已通过测试无误。

DS1302 12864lcd单片机智能闹钟日期温度程序

DS1302 12864lcd单片机智能闹钟日期温度程序

/****************************************************************************/ //头文件#include <AT89X52.h>#include <string.h>/*****************************************************************************/ //灯与蜂鸣器定义sbit led_b = P2^7;sbit led_r = P1^4;sbit led_g1 = P1^3;sbit led_g2 = P1^2;sbit led_g3 = P1^0;sbit led_g4 = P1^1;sbit beep = P3^1;/*****************************************************************************/ //温度传感器定义sbit DQ = P3 ^ 0;//ds18B20/*****************************************************************************/ //键盘引脚定义sbit KEY_1 = P2^3; //左上sbit KEY_2 = P2^4; //左下sbit KEY_3 = P2^6; //右上sbit KEY_4 = P2^5; //右下sbit KEY_I = P3^2; //常0/****************************************************************************/ //引脚定义sbit SID = P2^1; //数据sbit SCLK = P2^2; //时钟/*****************************************************************************/ //定义DS1302时钟接口sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)/*****************************************************************************/ //定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/****************************************************************************/ //定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)bit w = 0; //调时标志位static unsigned char menu = 0;//定义静态小时更新用数据变量static unsigned char keys = 0;//定义静态小时更新用数据变量static unsigned char timecount = 0;//定义静态软件计数器变量/****************************************************************************/ void DelayM(unsigned int a){//延时函数1MS/次unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。

51单片机ds1302时钟

51单片机ds1302时钟
sbit runing0=runing^0;
sbit runing1=runing^1;//菜单
sbit runing2=runing^2;
sbit runing3=runing^3;
sbit runing4=runing^4;
sbit runing5=runing^5;//help
sbit runing6=runing^6;//闹铃
18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ复位
DelayUs2x(5); //稍做延时
DQ = 0; //单片机将DQ拉低
DelayUs2x(200); //精确延时大于480us小于960us
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档