ds1302数码管显示

合集下载

ds1302数码管显示应用

ds1302数码管显示应用
buff=ReadByte(Read_Min); //分
scanbuff[2]=buff/16;//十位
scanbuff[3]=buff%16;//个位
buff=ReadByte(Read_Sec); //秒
scanbuff[4]=buff/16;//十位
scanbuff[5]=buff%16;//个位
void WriteDS1302(void);//向DS1302写入时间。
void ReadDS1302(void);//读取DS1302中的年,月,日,星期几,小时,分钟和秒.
void SendCmd(unsigned char cmd);//传送地址
void delayus(unsigned char tt);
}
//读取地址RCmd的时间/数据
unsigned char ReadByte(unsigned char RCmd)
{
unsigned char valu=0x00,temp;
CE=0;//初使化
SCLK=0;//初使化,并为rise edge做准备
CE=1;//初使化,传输开始。The SCLK must be low when CE is driven to high level.
#defineRead_Mon0x89
#defineRead_Day0x8b
#defineRead_Yea0x8d
#define CLK_BurstW0xbf//时钟突发模式写
#define CLK_BurstR0xbf//时钟突发模式读
#define Write_RAM_Begin0xc0//RAM第一个字节写指令
sbit _74hc154_D = P1^3;

ds1302时钟数码管显示时分秒

ds1302时钟数码管显示时分秒

ds1302时钟数码管显示时分秒单片机原理课程设计课题名称:基于DS1302的数码管显示数字钟专业班级:电子信息工程学生学号:0414070126学生姓名:张向阳指导教师:张云马崇霄设计时间:2010年6月21日--2010年6月25日目录摘要 ...................................................................................1 设计任务和要求 ...........................................................2 方案论证 .......................................................................3 系统硬件设计 ...............................................................3.1................................................................. 系统总原理图3.2元器件清单...................................................................................... ................................................3.3 PCB板图...................................................................................... .................................................3.4................................................................ P roteus仿真图3.5.......................................................... 分电路图及原理说明3.5.1 主控部分(单片机MCS-51)..............................................................................3.5.2 计时部分(实时时钟芯片DS1302)..................................................................3.5.3 显示部分(共阳极数码管)................................................................................3.5.4 调时部分(按键)................................................................................................4系统软件设计 ...............................................................4.1................................................................... 程序流程图4.2........................................................... 程序源代码5心得体会 ....................................................................... 6参考文献 ....................................................................... 7结束语 ...........................................................................基于DS1302的数码管显示数字钟设计摘要本次课程设计的是使用专门的时钟芯片DS1302在数码管上显示的数字电子钟,并能通过按键对其进行调时和校准。

ds1302原理及管脚图

ds1302原理及管脚图

5脚
//地址、数据发送子程序
void Write1302 ( unsigned char addr,dat )
{
unsigned char i,temp;
SCLK=0;
//清零时钟总线
CE = 1;
//CE 引脚为高,逻辑控制有效
//发送地址
for ( i=8; i>0; i-- ) //循环 8 次移位
void led_disp(unsigned char *poi)
{
P0=seg[*poi % 16];
//第 1 个数码管:显示秒(个位);
delay(2);
//持续 2ms
P0=0xff;
//消影
P0=seg[*poi /16]^0x10; delay(2); P0=0xff; poi++;
//第 2 个数码管:显示秒(十位);
unsigned char i; ACC=da; for(i=8;i>0;i--) {
T_IO=ACC0; T_CLK=0;
T_CLK=1; ACC=ACC>>1; } }
/******************DS1302:读取操作(下降沿)*****************/ unsigned char read_byte(void) {
unsigned char Read1302 ( unsigned char addr ) {
unsigned char i,temp,dat1,dat2; CE=0;
SCLK=0;
CE = 1; //发送地址
for ( i=8; i>0; i-- )
//循环 8 次移位
{
SCLK = 0;

DS1302可调时钟+DS18B20温度数码管切换显示

DS1302可调时钟+DS18B20温度数码管切换显示

DS1302可调时钟+DS18B20温度数码管切换显示(2013-01-04 15:30:28)转载▼标签:校园#include#include#define uchar unsigned char#define uint unsigned int#define Write_Protect 0x8e //写保护#define OutPut P2 //显示输出sbit DQ=P1^7; //ds18b20单总线定义为P1.7sbit Beep=P3^2; //蜂鸣器输出端定义为P3.2sbit RST=P1^2; //复位端口定义在P1.2引脚sbit IO=P1^1; //数据输出端定义在P1.1引脚sbit SCLK=P1^0; //时钟输出端口定义在P1.0引脚sbit key=P1^3; //时间调节控制键sbit key1=P1^5; //每按一次位加一sbit key2=P1^4; //每按一次位减一sbit key3=P1^6; //显示切换uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志uchar code Wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位选数据uchar code Duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0--9共阴代码code uchar Waddr[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};code uchar Raddr[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};uchar timeset[]={0x01,0x02,0x03,0x04,0x05,0x00,0x01};uchar time_buf[7];uchar time_disp[7];uchar dispdat[8];uchar Btdis=0,k=0,z;bit btx,btx1,btx2,btx3,bt1,bt2,bt3;bit Btread;void ex_model(); //显示模式切换void delaynms(uchar n){uchar i,j;for(i=n;i>0;i--)for(j=125;j>0;j--);}void Ds1302_Write_Byte(unsigned char addr, unsigned char d){unsigned char i;RST=1;//写入目标地址:addraddr = addr & 0xFE; //最低位置零for (i = 0; i < 8; i++){if (addr & 0x01){IO=1;}else{IO=0;}SCLK=1;SCLK=0;addr = addr >> 1; }//写入数据:dfor (i = 0; i < 8; i++){if (d & 0x01){IO=1;}else{IO=0;}SCLK=1;SCLK=0;d = d >> 1;}RST=0; //停止DS1302总线}uchar Ds1302_Read_Byte(unsigned char addr){unsigned char i;unsigned char temp;RST=1;//写入目标地址:addraddr = addr | 0x01; //最低位置高for (i = 0; i < 8; i ++){if (addr & 0x01)IO=1;}else{IO=0;}SCLK=1;SCLK=0;addr = addr >> 1;}//输出数据:tempfor (i = 0; i < 8; i++){temp = temp >> 1;if (IO){temp |= 0x80;}else{temp &= 0x7F;SCLK=1;SCLK=0;}RST=0; //停止DS1302总线return temp;}void Write1302(uchar dat){uchar i;SCLK=0;for(i=0;i<8;i++){IO=dat&0x01;SCLK=1;SCLK=0;dat=dat>>1;}}uchar Readset1302(uchar Cmd){uchar dat;SCLK=0;RST=1;Write1302(Cmd);SCLK=1;RST=0;return dat;}void Ds1302_Write_Time(void){unsigned char i,tmp;uchar flag;flag=Readset1302(0x81);if(flag&0x80) //判断时钟芯片是否停止,为1时时钟停止{//掉电保存for(i=0;i<7;i++) //BCD 处理{tmp=timeset[i]/10;//timeset[]={0x01,0x02,0x03,0x04,0x05,0x06,0x01}time_buf[i]=timeset[i]; //time_buf[7]time_buf[i]=time_buf[i]+tmp*16;}Ds1302_Write_Byte(0x8e,0x00); //关闭写保护Ds1302_Write_Byte(Waddr[6],time_buf[6]); //周Ds1302_Write_Byte(Waddr[5],time_buf[0]); //年Ds1302_Write_Byte(Waddr[4],time_buf[1]); //月Ds1302_Write_Byte(Waddr[3],time_buf[2]); //日Ds1302_Write_Byte(Waddr[2],time_buf[3]); //时Ds1302_Write_Byte(Waddr[1],time_buf[4]); //分Ds1302_Write_Byte(Waddr[0],time_buf[5]); //秒Ds1302_Write_Byte(0x8e,0x80); //打开写保护}}void Ds1302_Read_Time(void){unsigned char i,tmp;// Ds1302_Write_Byte(0x8e,0x00); //关闭写保护time_buf[0]=Ds1302_Read_Byte(Raddr[5]); //年time_buf[1]=Ds1302_Read_Byte(Raddr[4]); //月time_buf[2]=Ds1302_Read_Byte(Raddr[3]); //日time_buf[3]=Ds1302_Read_Byte(Raddr[2]); //时time_buf[4]=Ds1302_Read_Byte(Raddr[1]); //分time_buf[5]=(Ds1302_Read_Byte(Raddr[0]))&0x7F; //秒time_buf[6]=Ds1302_Read_Byte(Raddr[6]); //周// Ds1302_Write_Byte(0x8e,0x80); //打开写保护for(i=0;i<8;i++) //BCD 处理{tmp=time_buf[i]/16;//time_buf[]={年,月,日,时,分,秒,周}time_buf[i]=time_buf[i];time_disp[i]=time_buf[i]+tmp*10;}}void Ds1302_Init(void){RST=0;//RST脚置低SCLK=0;//SCK脚置低Ds1302_Write_Byte(0x80,0x00);}void display(){uchar i;if(Btdis==0){if(bt2==0){dispdat[0]=Duan[time_disp[3]/10]; //时dispdat[1]=Duan[time_disp[3]];}else{dispdat[0]=0xff;dispdat[1]=0xff;}dispdat[2]=0xbf; //"-"if(bt3==0){dispdat[3]=Duan[time_disp[4]/10]; //分dispdat[4]=Duan[time_disp[4]];}else{dispdat[3]=0xff;dispdat[4]=0xff;}dispdat[5]=0xbf;dispdat[6]=Duan[time_disp[5]/10]; //秒dispdat[7]=Duan[time_disp[5]];}if(Btdis==1){if(bt1==0){dispdat[0]=Duan[time_disp[0]/10]; //年dispdat[1]=Duan[time_disp[0]];}else{dispdat[0]=0xff;dispdat[1]=0xff;}dispdat[2]=0xbf; //"-"if(bt2==0){dispdat[3]=Duan[time_disp[1]/10]; //月dispdat[4]=Duan[time_disp[1]];}else{dispdat[3]=0xff;dispdat[4]=0xff;}dispdat[5]=0xbf;if(bt3==0){dispdat[6]=Duan[time_disp[2]/10]; //日dispdat[7]=Duan[time_disp[2]];}else{dispdat[6]=0xff;dispdat[7]=0xff;}}if(Btdis==2){dispdat[0]=0xff;if(bt1==0){dispdat[1]=Duan[time_disp[6]]; //周}else{dispdat[1]=0xff;}dispdat[2]=0xbf; //"-" dispdat[3]=0xbf;dispdat[4]=0xbf;dispdat[5]=0xbf;dispdat[6]=Duan[time_disp[5]/10];dispdat[7]=Duan[time_disp[5]];}if(Btdis==3){ds1820disp();}for(i=0;i<8;i++){P0=dispdat[i];OutPut=Wei[i]; //Wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}delaynms(1);P0=0xff;}}void baoshi(){ uchar i;if(((time_disp[4])==59)&&((time_disp[5])>=55)&&((time_disp[5])<=60))//分和秒的报时条件{for(i=0;i<8;i++) //小灯轮流点亮,蜂鸣器发出滴答声{P3=Duan[i];delaynms(300);}}elseP3=0xdb;}void keyscan(){display();if(!key){if(btx==0){if(!key){btx=1;k++;}while(k==1){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[0]<99){time_disp[0]++;}else{time_disp[0]=0;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[0]>0){time_disp[0]--;}else{time_disp[0]=99;}}}}else{btx2=0;}}while(k==2){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[1]<12){time_disp[1]++;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>29){time_disp[2]=29;}}else if(time_disp[2]>28){time_disp[2]=28;}}}else{time_disp[1]=1;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[1]>1){time_disp[1]--;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>29){time_disp[2]=29;}}else if(time_disp[2]>28){time_disp[2]=28;}}}else{time_disp[1]=12;}}}}else{btx2=0;}}while(k==3){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]<29){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[2]<28){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[1]<8){if(time_disp[1]%2==0) //小于8月的月份除以2的余数为0则为小月{if(time_disp[2]<30){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[1]%2==1) //小于8月的月份除以2的余数为1则为大月{if(time_disp[2]<31){time_disp[2]++;}else{time_disp[2]=1;}}}else if(time_disp[1]>7){if(time_disp[1]%2==0){if(time_disp[2]<31){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[1]%2==1){if(time_disp[2]<30){time_disp[2]++;}else{time_disp[2]=1;}}}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>1){time_disp[2]--;}{time_disp[2]=29;}}else if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=28;}}else if(time_disp[1]<8){if(time_disp[1]%2==0){if(time_disp[2]>1){time_disp[2]--;}{time_disp[2]=30;}}else if(time_disp[1]%2==1){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=31;}}}else if(time_disp[1]>7){if(time_disp[1]%2==0){if(time_disp[2]>1)time_disp[2]--;}else{time_disp[2]=31;}}else if(time_disp[1]%2==1){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=30;}}}}}else{btx2=0;}}while(k==4){Btdis=2;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[6]<7){time_disp[6]++;}else{time_disp[6]=1;}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[6]>1){time_disp[6]--;}else{time_disp[6]=7;}}}}else{btx2=0;}}while(k==5){Btdis=0;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[3]<23){time_disp[3]++;}else{time_disp[3]=0;}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[3]>0){time_disp[3]--;}else{time_disp[3]=23;}}}}else{btx2=0;}}while(k==6){Btdis=0;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[4]<59){time_disp[4]++;}else{time_disp[4]=0;}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[4]>0){time_disp[4]--;}else{time_disp[4]=59;}}}}else{btx2=0;}}while(k==7){uchar tmp;uchar i;for(i=0;i<7;i++){timeset[i]=time_disp[i];}//将调整后的时候写入DS1302for(i=0;i<7;i++) //BCD 处理{tmp=timeset[i]/10;//timeset[]={0x01,0x02,0x03,0x04,0x05,0x06,0x01}time_buf[i]=timeset[i]; //time_buf[7]time_buf[i]=time_buf[i]+tmp*16;}Ds1302_Write_Byte(0x8e,0x00); //关闭写保护Ds1302_Write_Byte(Waddr[6],time_buf[6]); //周Ds1302_Write_Byte(Waddr[5],time_buf[0]); //年Ds1302_Write_Byte(Waddr[4],time_buf[1]); //月Ds1302_Write_Byte(Waddr[3],time_buf[2]); //日Ds1302_Write_Byte(Waddr[2],time_buf[3]); //时Ds1302_Write_Byte(Waddr[1],time_buf[4]); //分Ds1302_Write_Byte(Waddr[0],time_buf[5]); //秒Ds1302_Write_Byte(0x8e,0x80); //打开写保护k=0;}}else{btx=0;}if(!key3){if(btx3==0){if(!key3){btx3=1;if(Btdis<3){Btdis++;}else{Btdis=0;}}}}else{btx3=0;}}void ex_model(){if(((time_disp[5])>=0)&&((time_disp[5])<=8)) //前八秒显示温度Btdis=3;if(((time_disp[5])>=9)&&((time_disp[5])<=12)) //显示周Btdis=2;if(((time_disp[5])>=13)&&((time_disp[5])<=18)) //显示年Btdis=1;if(((time_disp[5])>=19)&&((time_disp[5])<=59)) //显示当前时间Btdis=0;}void tiaoshidisplay(){if(z==15){z=0;switch(k){case 1:bt1=~bt1;P3=~P3;break; //年case 2:bt2=~bt2;bt1=0;P3=~P3;break; //月case 3:bt3=~bt3;bt2=0;P3=~P3;break; //日case 4:bt1=~bt1;bt3=0;P3=~P3;break; //周case 5:bt2=~bt2;bt1=0;P3=~P3;break; //时case 6:bt3=~bt3;bt2=0;P3=~P3;break; //分default:bt3=0;break;}}}void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst(){ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd(){ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata){unsigned char i=0;for (i=8; i>0; i--) { DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp(){uchar a,b;ds1820rst();ds1820wr(0xcc);/ds1820wr(0x44);/ds1820rst();ds1820wr(0xcc);/ds1820wr(0xbe);/a=ds1820rd();。

课程设计——DS1302数码管显示数字钟的设计1

课程设计——DS1302数码管显示数字钟的设计1

××大学××学院××系课程设计报告××大学××学院××系××课程设计DS1302数码管显示数字钟的设计学生姓名学号所在系专业名称班级指导教师成绩××大学××学院二〇一二年六月摘要:本课程设计要求基于STC89C52单片机实现用8位数码管进行时钟显示。

采用STC89C52单片机和DS1302实时时钟芯片,使用5V电源供电。

时钟可以通过按键切换,数码管显示时、分、秒以及年、月、日,并且可以实现时钟的校准功能。

包括时钟芯片驱动程序,数码管显示及驱动程序。

关键字:单片机,DS1302,时钟电路,数码管显示Abstract: This course is designed 8 digital tube clock display requirements based STC89C52 microcontroller. Using STC89C52 microcontroller and DS1302 real time clock chip, using a 5V power supply. Design of the clock by means of the key switches, digital tube display hours, minutes, seconds, and the year, month, day, and can achieve clock calibration function. Including the driver of the clock chip, digital display and driver.Key words: single chip macrocomputer;DS1302;clock circuit;digital tube display目录1. 总体设计方案 (1)1.1 电子钟功能介绍1.1.1 基本功能介绍 (1)1.1.2 扩展功能介绍 (1)1.2 总体设计方案 (1)1.2.1 计时方案 (1)1.2.2 按键方案 (1)1.2.3 显示方案 (2)2. 单元模块设计 (2)2.1 硬件总电路设计 (2)2.2 显示模块电路设计 (2)2.3 按键调时电路设计 (3)2.4 时钟芯片通信电路 (3)3. 软件模块设计 (4)3.1 主程序设计 (4)3.2 时钟芯片 (5)3.2.1 DS1302内部结构 (5)3.2.2 DS1302的读时序 (6)3.2.3 DS1302的写时序 (6)3.3 键盘调时 (7)4. 设计总结 (8)5. 参考文献 (8)6. 附录 (9)前言数字钟是采用数字电路实现对时、分、秒及数字显示的计时装置,广泛用于个人家庭、车站、办公室等公共场所,成为人们日常生活中的必需品。

万年历时钟(ds1302)+温度显示(ds18b20)原理图

万年历时钟(ds1302)+温度显示(ds18b20)原理图
A X1 19 18
P3.0 (RXD) P3.1 (TXD) P3.2 (INT0) P3.3 (INT1) P3.4 (T0) P3.5 (T1) X1 X2 IC2 89C51 P27 P26 P25 P24 P23 P22 P21 P20
Байду номын сангаас
28 27 26 25 24 23 22 21
LED2
DIG0_C
DIG4_B
DIG0_B
SD3
DP3
SG3
SD2
DP2
SG2
SD2
DP2
SG2
SD1
DP1
SG1
SD1
DP1
SC3
SC2
SC2
SC1
SC1
SE3
SE2
SE2
SE1
SE1
6
A4
d
h
g
d
h
g
d
h
g
d
h
g
d
h
g
e
c
e
c
e
c
e
c
e
c
R12 1.5k
S7 DP3 S6 SA3 S16 S5:减键,代码05 C S8 S6:加键,代码06 S7:调节时间,代码 07
R12 1.5k C7 104 C7 15P
5V 5V 1 2 3 4 5 CS1 6 CLK1 7 DATA1 8 9 KEY1 10 11 12 13 14 驱动第一排 VDD VDD NC VSS NC CS CLK DATA KEY SG SF SE SD SC HD7279A RESET RC CLKO DIG7 DIG6 DIG5 DIG4 DIG3 DIG2 DIG1 DIG0 DP SA SB 28 27 26 25 24 23 22 21 20 19 18 17 16 15

基于DS1302的万年历毕业论文 数码管显现 附程序 硬件电路图

基于DS1302的万年历毕业论文 数码管显现 附程序 硬件电路图

XX学院毕业论文作者:学号: .学系:电子信息工程与技术系 .专业:应用电子 .题目:电子万年历指导者:2011 年 01月长沙XX学院专科生毕业论文评语系部:电子信息工程与技术专业:应用电子学生姓名:班级学号题目:电子万年历题目:电子万年历论文摘要单片机应用技术飞速发展,纵观我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设计通过对它的学习和应用,从而达到学习、设计、开发软、硬的能力。

本文通过对一个基于单片机实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关方面的应用。

系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,通过按键能对年、月、日、时、分、秒进行修改。

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

该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。

关键词:万年历,AT89C51,时钟日历芯片Title:Electronic calendar papersAbstractMicrocomputer application technology rapid development, throughout our lives is widely used in all kinds of intelligent IC card, electronic pets, etc, these are inseparable from microcontroller. SCM is set for the CPU, RAM, ROM, time, count and multiple interface in the integration of micro controller. Its small size, low cost, the function is strong, widely used in intelligent industry and industrial automation. And 51 series microcontroller is the most typical and various microcontroller most representative one. The graduation design through to its learning and application, thus achieved the study, design, development, soft and hard ability.This article through to one based on SCM realizing calendar function electronic clock design, so as to achieve the learning, single-chip technique related applications. System consists of the main controller AT89C51, clocking circuit DS1302, display circuit, key circuits, and reset circuit etc components, can realize the function of clock calendar displays, through the keys to date and time, minutes and seconds modified. The approach is the advantage of circuit is simple, reliable performance, good real-time, high precision time, simple operation and programming of easy.The electronic clock can be applied to general life and work, also can improve performance by disguised himself, and adding new functions, thus to people's life and work to bring more convenient.Keywords: calendar, AT89C51,clock calendar chip目录一、设计要求与方案论证 (1)1.1 设计要求 (1)1.2 方案设计与论证 (1)1.2.1单片机芯片的选择方案和论证 (1)1.2.2 显示模块选择方案和论证 (1)1.2.3时钟芯片的选择方案和论证 (2)1.2.4 电路设计最终方案决定 (2)二、基于单片机的万年历硬件设计 (2)2.1 主要IC芯片选择 (2)2.1.1单片机 (2)2.1.2 DS1302 (4)2.2 万年历硬件电路设计 (8)2.2.1时钟电路设计 (9)2.2.2显示电路 (9)2.2.3按键电路 (10)2.2.4复位电路 (11)三、万年历软件设计 (13)3.1 主程序设计 (13)3.2 子程序设计 (14)3.2.1 实时时钟日历子程序设计 (14)3.2.2 显示子程序设计 (14)3.2.3 中断0子函数设计 (14)3.2.4 时间设置函数ftion0 (14)3.2.5 加1修改时间功能函数cum (15)3.2.6 日期设置函数ftion1 (15)3.2.7 加1修改日期功能函数cum1 (15)四、系统调试 (20)4.1 单片机基础电路测试 (21)4.2 显示电路调试 (21)4.3 DS1302电路调试 (22)结论 (23)致谢 (24)参考文献 (25)附录A 程序 (26)附录B万年历硬件电路原理图 (38)第一章设计要求与方案论证1.1 设计要求:(1)基本要求①显示准确的北京时间(时、分、秒),可用24小时制式;②随时可以调校时间。

DS1302汇编数码管显示8位

DS1302汇编数码管显示8位

/*****************************************电路P1口接74HC573锁存4位数码管位远,P0接4位数码管段选。

P2.5,p2.6,p2.7接DS1302. *****************************************/ORG 0000HAJMP STARTORG 000BHAJMP TIM0SCLK EQU P2^7IO EQU P2^6RST EQU P2^5ALL_FLAG EQU 31H ;标志位SEC EQU 32H ;秒MIN EQU 33H ;分HOUR EQU 34H ;时DAY EQU 35H ;日MON EQU 36H ;月WEEK EQU 37H ;星期YEAR EQU 38H ;年DS_DAT EQU 39HDS_ADD EQU 3AHDS_DATA EQU 3BHS1 EQU r7ORG 70HSTART:MOV TMOD ,#00000001BMOV TH0 ,#HIGH(65536-1000);HIGH和LOW写反了会错MOV TL0 ,#LOW(65536-1000)SETB EASETB ET0SETB TR0LCALL DS_INITLOOP2:CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYLCALL DS_R_TIMEsjmp LOOP2DELAY:MOV R1,#10 ;1ms延时子程序D0: MOV R2,#248DJNZ R2,$DJNZ R1,D0RET/***************************************** DS1302写字节函数*****************************************/ DS_W_BYTE:MOV R0,#08MOV A,DS_DATDS_W1:RRC AMOV IO,CNOPSETB SCLKnopCLR SCLKDJNZ R0,DS_W1RET/***************************************** DS1302读字节函数*****************************************/ DS_R_BYTE:SETB IOMOV A,#00HMOV R0,#08DS_R1:MOV C,IORRC ASETB SCLKNOPCLR SCLKNOPDJNZ R0,DS_R1MOV DS_DA T,ARET/***************************************** DS1302读数据函数入口地址存至DS_ADD;读取到的数据存入DS_DA T *****************************************/ DS_R_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTELCALL DS_R_BYTESETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOPCLR IONOPNOPsetb IONOPNOPRET/***************************************** DS1302写数据函数入口地址DS_ADD,入口数据DS_DA TA*****************************************/ DS_W_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTEMOV DS_DA T,DS_DATALCALL DS_W_BYTEMOV DS_DA T,ASETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOP ;加了延时CLR IONOPNOPsetb IONOPNOPRET/*****************************************DS1302读时间函数入口地址DS_ADD,*****************************************/DS_R_TIME:MOV DS_ADD,#81HLCALL DS_R_DATMOV SEC,DS_DATMOV DS_ADD,#83HLCALL DS_R_DATMOV MIN,DS_DATMOV DS_ADD,#85HLCALL DS_R_DATMOV HOUR,DS_DATMOV DS_ADD,#87HLCALL DS_R_DATMOV DAY,DS_DATMOV DS_ADD,#89HLCALL DS_R_DATMOV MON,DS_DATMOV DS_ADD,#8BHLCALL DS_R_DATMOV WEEK,DS_DATMOV DS_ADD,#8DHLCALL DS_R_DATMOV YEAR,DS_DATRET/*****************************************DS1302写时间函数入口地址DS_ADD,入口数据*****************************************/DS_W_TIME:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;语序写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,SECLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,MINLCALL DS_W_DA TMOV DS_ADD,#84HMOV DS_DATA,HOURLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,DAYLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,MONLCALL DS_W_DA TMOV DS_ADD,#8AHMOV DS_DATA,WEEKLCALL DS_W_DA TMOV DS_ADD,#8CHMOV DS_DATA,YEARLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRET/*****************************************DS1302初始化*****************************************/DS_INIT:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;允许写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#90HMOV DS_DATA,0xa5LCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,#00HLCALL DS_W_DATMOV DS_ADD,#84HMOV DS_DATA,#23HLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,#16HLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,#12HLCALL DS_W_DA TMOV DS_ADD,#8aHMOV DS_DATA,#02HLCALL DS_W_DA TMOV DS_ADD,#8cHMOV DS_DATA,#14HLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRETTIM0:PUSH ACCPUSH PSWPUSH DPHPUSH DPLPUSH BMOV TH0 ,#HIGH(65536-1000) MOV TL0 ,#LOW(65536-1000) MOV A ,SECMOV B,#16DIV ABMOV 50H ,BMOV 51H, AMOV A,MINMOV B,#16DIV ABMOV 52H,BMOV 53h,AMOV A,HOURMOV B ,#16DIV ABMOV 54H,BMOV 55H,AINC S1MOV DPTR,#TABMOV P1,#0HCJNE S1,#1H,Z1NOPNOPMOV A ,50HMOVC A,@A+DPTRMOV P0,ASETB P1.0SJMP LOOPZ1:CJNE S1,#02H,Z2MOV A,51H MOVC A,@A+DPTRMOV P0,ASETB P1.1SJMP LOOPZ2:CJNE S1,#03H,Z3MOV P0,#0BFH SETB P1.2SJMP LOOPZ3:CJNE S1,#04H,Z4MOV A,52H MOVC A,@A+DPTRMOV P0,ASETB P1.3SJMP LOOPZ4:CJNE S1,#05H,Z5MOV A,53H MOVC A,@A+DPTRMOV P0,ASETB P1.4SJMP LOOPZ5:CJNE S1,#06H,Z6MOV P0,#0BFHSETB P1.5SJMP LOOPZ6:CJNE S1,#07H,Z7MOV A,54HMOVC A,@A+DPTRMOV P0,ASETB P1.6SJMP LOOPZ7:CJNE S1,#08H,Z8MOV A,55HMOVC A,@A+DPTRMOV P0,ASETB P1.7MOV S1,#0HSJMP LOOPZ8:LJMP 00HLOOP:POP BPOP DPLPOP DPHPOP PSWPOP ACCRETITAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFHEND。

基于51与DS1302时钟芯片数码管显示万年历

基于51与DS1302时钟芯片数码管显示万年历
{
year=read_ds1302(0x8d);//年
mon=read_ds1302(0x89);//月
day=read_ds1302(0x87);//日
week=read_ds1302(0x8b);//星期
hour=read_ds1302(0x85);//时
min=read_ds1302(0x83);//分
void main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
while (1)
{
set_rtc();//按键
read_rtc();//读取时间
display();//延时函数
dsbz();//判断函数
TR0=1;
}
}
/****************************************判断语句*******************************************************/
void dsbz();//判断语句定义
/**********************************DS1302单字节写入***********************************/
void write_ds1302_byte(uchar dat)
{
uchar i;
for (i=0;i<8;i++)
void set_rtc()
{
if (shi==0)
delay(100);
if (shi==0)
{
hour=(hour>>4)*10+(hour&0x0f);

ds1302用法

ds1302用法

时钟IC_DS1302的应用之一……基础知识2009-11-06 13:09在网上看了很久,发现初学者最有兴趣的就是DS1302时钟电路,也很自然,它是个做出来就让你觉得最实用的电路了,但实际上制做上并不简单,首先你要让你的显示部分(不管是数码管还是LCD)调试通过。

然后把DS1302接好,调试正确了才能在成功显示时间和日期。

下面我们就来说说DS1302的用法。

DS1302的图如下:DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

工作电压宽达2.5~5.5V。

采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。

下面是标准的接线电路图:各引脚功能如下:引脚号名称功能①Vcc2 主电源②、③X1,X2 接32768Hz晶振④GND 地线⑤RST 复位⑥I/0 数据输入输出⑦SCLK 串行时钟⑧Vccl 后备电源DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch)是存放秒、分,小时、日、月、年、周数据的,存放的数据格式为BCD码形式它的内部时间寄存器如下:这张表呢是DS1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。

这几个寄存器的说明如下:1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。

当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行。

2、小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。

ds1302显示时间课程设计

ds1302显示时间课程设计

ds1302显示时间课程设计一、课程目标知识目标:1. 学生能理解DS1302时钟芯片的基本原理,掌握其引脚功能及电路连接方式。

2. 学生能够掌握DS1302芯片的寄存器配置方法,并运用此知识读取和显示时间。

3. 学生能够解释时间格式,并掌握如何在LCD显示屏上正确显示时间。

技能目标:1. 学生能够独立完成DS1302模块与微控制器的连接,进行基本的电路搭建。

2. 学生能够编写程序,通过I2C或SPI接口与DS1302通信,读取实时时间数据。

3. 学生能够通过调试程序,解决显示时间中的常见问题,确保显示时间的准确性。

情感态度价值观目标:1. 学生能够培养对电子技术的兴趣,激发学习嵌入式系统的热情。

2. 学生能够在项目合作中发展团队协作精神,提高沟通与解决问题的能力。

3. 学生能够认识到时间管理的重要性,通过技术手段加强对时间的认识和尊重。

课程性质分析:本课程为中学信息技术或电子技术相关课程内容,结合实践操作,旨在让学生通过具体的项目实践,掌握DS1302芯片的应用,增强理论与实践相结合的能力。

学生特点分析:考虑到学生所在年级,课程设计需结合学生的认知水平,注重知识技能的逐步引导与提升,同时注重激发学生的学习兴趣,提高自主学习和探究的能力。

教学要求:1. 教学过程中应注重理论与实践相结合,强调动手能力。

2. 通过任务驱动的教学方法,引导学生主动探索,合作学习。

3. 教学评估应基于学生在电路搭建、程序编写、问题解决等方面的具体表现,确保学习目标的达成。

二、教学内容1. 引入DS1302时钟芯片的基础知识,包括芯片特性、引脚功能及其在电路中的作用。

- 课本章节:第三章,第二节“实时时钟芯片DS1302”2. 介绍DS1302的内部寄存器结构,解释各寄存器功能及配置方法。

- 课本章节:第三章,第三节“DS1302的寄存器及其设置”3. 指导学生完成DS1302与微控制器(如Arduino)的电路连接。

- 教学大纲:实践活动一“DS1302电路连接与测试”4. 讲解I2C或SPI通信协议,并运用此协议实现微控制器与DS1302的数据交换。

单片机学习项目 (12) 实时时钟DS1302的原理与应用

单片机学习项目 (12) 实时时钟DS1302的原理与应用

单片机学习项目项目12-实时时钟DS1302的原理与应用一:电路原理图利用数码管显示时间,可以在电子表电路基础上连接DS1302完成,见图5-3-3所示。

6反相器74HC04为动态显示的数码管阳极驱动,中间非门省略。

图中数码管的驱动采用74HC573。

DS1302的SCLK接单片机P3.7, I/O(SDA)端口接P1.0,RST接P1.1;DS1302的X1和X2接32768Hz的标准时钟晶振。

一:程序设计主程序主用作用是调用DS1302子程序,把读取到的是时间信息通过数码管显示出来,由于采用动态显示,因此主程序中要用到定时器中断。

分页显示在定时器中断服务函数中进行。

程序清单如下:#include<reg51.h>#include”ds1302.c”uchar cp1,cp2,cp3;code uchar seven_seg[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};code uchar seg_bit[] ={0x01,0x02,0x04,0x08,0x10,0x20};uchar flash;bit conv;void time0_isr(void) interrupt 1 //利用中断对数码管上显示的数据进行刷新{TH0= (65536 –2000) / 256;TL0= (65536 –2000) % 256;cp1++;if(cp1>= 250)//0.5秒{cp1= 0;flash= ~flash; //产生小数点闪烁变量cp2++;if(cp2>= 5){conv= !conv;//产生交替显示变量cp2= 0;}}P0= 0xff;//消隐if(conv== 1){switch(cp3){case0:P0 = seven_seg[sec % 10];break;case1:P0 = seven_seg[sec / 10];break;case2:P0 = seven_seg[min % 10] & (0x7f | flash);break;case3:P0 = seven_seg[min / 10];break;case4:P0 = seven_seg[hour % 10] & (0x7f | flash);break;case5:P0 = seven_seg[hour / 10];break;} }else{switch(cp3){case0:P0 = seven_seg[date % 10];break;case1:P0 = seven_seg[date / 10];break;case2:P0 = seven_seg[month % 10];break;case3:P0 = seven_seg[month / 10];break;case4:P0 = seven_seg[year % 10];break;case5:P0 = seven_seg[year / 10];break;}}P2= seg_bit[cp3];cp3++;if(cp3>= 6)cp3 = 0;}void timer0_init(void) //Timer0初始化{TMOD= 0x01;TH0= (65536 –2000) / 256;TL0= (65536 –2000) % 256;TR0= 1;ET0= 1;EA = 1;}void main(void){uchari = 46;//举例,比如要调整时间,分钟设定为46分i= DEC_BCD_conv(i);timer0_init();write_ds1302_add_dat(0x8e,0x00); //写操作,可以对DS1302调整write_ds1302_add_dat(0x80,0x30); //写秒,30秒write_ds1302_add_dat(0x82,i); //写分,46分write_ds1302_add_dat(0x84,0x12); //写时,12时write_ds1302_add_dat(0x86,0x28); //写日,28日write_ds1302_add_dat(0x88,0x05); //写月,5月write_ds1302_add_dat(0x8a,0x03); //写星期,星期三write_ds1302_add_dat(0x8c,0x12); //写年,(20)12年write_ds1302_add_dat(0x8e,0x80); //写保护while(1){get_ds1302_time();}}一、DS1302驱动程序DS1302驱动程序包含以上操作函数,程序完成后存放在DS1302.c中,用于带有DS1302芯片的单片机系统中。

数码管显示DS1302

数码管显示DS1302

/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit beep=P3^5;sbit ds1302_RST=P2^5;sbit ds1302_IO=P2^6;sbit ds1302_SCLK=P2^7;sbit ACC0=ACC^0;sbit ACC7=ACC^7;void init();void delay_50us(uint t);void display();uchar read_Byte();void write_Byte(uchar tdata);void write_data_ds1302(uchar taddr,uchar tdata);uchar read_data_ds1302(uchar taddr);void set_ds1302(uchar *P1302);void get_ds1302() ;void init_ds1302();uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};uchar initial_time[]={0x00,0x00,0x12};// 秒分时日月周年uchar data now_time[3];/******************************************//* 主函数*//******************************************/void main(){init();init_ds1302();set_ds1302(initial_time);while(1){get_ds1302();display();}}/******************************************/ /* 延时子程序*/ /******************************************/ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************/ /* 初始化子程序*/ /******************************************/ void init(){P0=0xff;P2=0xff;P1=0x00;}/******************************************/ /* 数码管显示子程序*/ /******************************************/ void display(){uchar i;P1=0x01;i=now_time[0]%16; //显示秒个P0=table[i];delay_50us(20);P1=0x02;i=now_time[0]/16; //显示秒十P0=table[i];delay_50us(20);P1=0x04;P0=table[10];//显示"-"delay_50us(20);P1=0x08;i=now_time[1]%16; //显示分个P0=table[i];delay_50us(20);P1=0x10;i=now_time[1]/16; //显示分十P0=table[i];delay_50us(20);P1=0x20;P0=table[10]; //显示"-"delay_50us(20);P1=0x40;i=now_time[2]%16; //显示时个P0=table[i];delay_50us(20);P1=0x80;i=now_time[2]/16; //显示时十P0=table[i];delay_50us(10);}/*ds1302模块部分*//******************************************//* 读数据*//******************************************/uchar read_Byte(){uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=ds1302_IO;//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿ds1302_SCLK=1;ds1302_SCLK=0;//产生下降沿输出一位数据}return(ACC);}/******************************************//* 写字节*//******************************************/void write_Byte(uchar tdata){uchar i;ACC=tdata;for(i=8;i>0;i--){ds1302_IO=ACC0;ds1302_SCLK=1;ds1302_SCLK=0;//产生上升沿输入数据ACC=ACC>>1;}}/******************************************//* 写数据*//******************************************/void write_data_ds1302(uchar taddr,uchar tdata){ds1302_RST=0;ds1302_SCLK=0;ds1302_RST=1;write_Byte(taddr);write_Byte(tdata);ds1302_RST=0;ds1302_SCLK=1;}/******************************************//* 读数据*//******************************************/uchar read_data_ds1302(uchar taddr){uchar tdata;ds1302_RST=0;ds1302_SCLK=0;ds1302_RST=1;write_Byte(taddr);tdata=read_Byte();ds1302_RST=0;ds1302_SCLK=1;return(tdata);}/******************************************//* 设置初始时间*//******************************************/void set_ds1302(uchar *P1302){uchar i;uchar taddr = 0x80;write_data_ds1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/ for(i =3; i>0; i--){write_data_ds1302(taddr,*P1302); /* 秒分时日月星期年*/P1302++;taddr+=2;}write_data_ds1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/}/*********************************************************************函数名:get_ds1302()*功能描述:设置初始时间*函数说明:先写地址,后读命令/数据*调用函数:*全局变量:*输入:now_time[];*返回:***********************************************************************/void get_ds1302(){uchar k;uchar taddr = 0x81;for (k=0; k<3.; k++){now_time[k] = read_data_ds1302(taddr);/*格式为: 秒分时日月星期年*/taddr+= 2;}}/******************************************//* 1302初始化*//******************************************/void init_ds1302(){ds1302_RST=0;ds1302_SCLK=0;write_data_ds1302(0x8e,0x00);write_data_ds1302(0x90,0xa5);//打开充电二级管一个二级管串联一个2K电阻}。

用DS1302与数码管设计的可调电子表设计与仿真

用DS1302与数码管设计的可调电子表设计与仿真

目录摘要 (2)1 引言 (3)2 设计方案与要求 (4)2.1 功能要求 (4)2.2 系统基本方案选择和论证 (4)2.2.1 单片机芯片的选择和论证 (4)2.2.2 显示模块的选择和论证 (5)2.2.3 时钟芯片的选择和论证 (5)2.3 电路设计最终方案决定 (5)2.4 各硬件基本原理及介绍 (6)2.4.1 AT89C51单片机原理及介绍 (6)2.4.2 LED数码管显示原理及介绍 (6)2.4.3 DS1302原理及介绍 (7)3 硬件设计部分 (8)3.1 电路设计框图 (8)3.2 系统硬件概述 (8)3.3 主要单元电路的设计 (8)3.3.1 单片机主控制模块的设计 (8)3.3.2 时钟电路DS1302的设计 (10)3.3.3 显示模块的设计 (11)3.3.4 锁存器模块的设计 (12)4 软件设计部分 (13)4.1 软件设计概述 (13)4.2 Keil C51和Proteus介绍 (13)4.2.1 Keil C51的介绍 (13)4.2.2 Proteus的介绍 (13)4.3 整体设计 (14)5 结束语 (17)基于DS1302与数码管设计的电子表摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子产品等,这些都离不开单片机。

单片机是将CPU、RAM、ROM、定时器、计数器和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上,而51系列单片机是各单片机中最为典型和最有代表性的一种。

本文通过对一个基于DS1302与数码管的电子表的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C51、实时钟电路DS1302、显示电路组成,能实现时钟显示的功能,能进行时、分、秒的显示。

18B20温度加ds1302时钟数码管显示,三按钮控制设置

18B20温度加ds1302时钟数码管显示,三按钮控制设置
}
}
}
if(shezhi==2)//分钟设置
{
if(sb2==0)//加控制
{
delay(30);
if(sb2==0)
{
x5=0;
a1=(shijian[1]&0x7f)>>4;
a2=shijian[1]&0x0f;
}
void wendu()//温度读取时序
{
unsigned char x,y,w,e,r;
fuwei();
wdxiesj(0xcc);
wdxiesj(0x44);
delay(1);
fuwei();
wdxiesj(0xcc);
wdxiesj(0xbe);
w=wddsj();//温度高四位,
{
uchar i;
rst=0;
write_1302(0x8e);
write_1302(0x00);
rst=0;
write_1302(0x90);
write_1302(0x5a);
rst=0;
write_1302(0xbe);
for(i=0;i<7;i++)
write_1302(shijian[i]);//时间写入
TR0=1;
}
void xianshi1()//小时显示
{
if(((shijian[2]&0x7f)>>4)!=0) shuma((shijian[2]&0x7f)>>4,0x7f);
shuma(shijian[2]&0x0f,0xbf);

DS1302时钟数码管显示

DS1302时钟数码管显示

DS1302时钟数码管显示DS1302时钟芯片,大家都知道是什么来的。

不懂的百度下就知道了。

这个只是读取出时间,其它功能没有写出来,用了四位共阳数码管显示。

具体电路和仿真可以到中国电子DIY之家论坛搜索/*********************************** DS1302简单时间显示** 数码管显示************************************/#include#define uchar unsigned char#define uint unsigned int#define W P2 //位选#define D P0 //段选sbit IO=P1^0; //数据口sbit SCLK=P1^1; //控制数据时钟sbit RST=P1^2; //使能端、复位端/************按键引脚定义***********/sbit s1=P1^5; //按键加sbit s2=P1^6; //按键减sbit s3=P1^7; //按键选择char knum=0,snum,fnum;/***********写时分秒地址************/#define write_shi 0x84#define write_fen 0x82#define write_miao 0x80/***********读时分秒地址************/#define read_shi 0x85#define read_fen 0x83#define read_miao 0x81char shi,fen,miao; //读出数据存储变量uchard[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点uchardd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.{ //delay(500);大约延时500ms.uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar read_1302(uchar add) //读函数{uchar i,date;RST=0; //禁止读写数据for(i=0;i<8;i++){RST=1;SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++){if(IO)date=date|0x80;elsedate=date|0x00;SCLK=1;date>>=1;SCLK=0;}RST=0;date=date/16*10+date%16; //进制转换16转10进制IO=0; //数据读完后,IO口必须为0,不然小时一直显示85 return date;}void write_1302(uchar add,uchar dat) //写函数{uchar i;RST=0; //禁止读写数据// SCLK=0;for(i=0;i<8;i++) //写地址{RST=1; //允许读写数据SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++) //写数据{RST=1; //允许读写数据SCLK=0;IO=dat&0x01;dat>>=1;SCLK=1;}RST=0;}void init_1302() //初始化函数设置时间{write_1302(0x8e,0x00); //保护取消,可以进行读写操作write_1302(write_miao,0x56);write_1302(write_fen,0x49);write_1302(write_shi,0x14);write_1302(0x8e,0x80); //保护启动,不能进行读写操作}void display(uchar shi,uchar fen,uchar miao) //显示函数{if(knum==0){snum=30;fnum=30;}if(knum==1){fnum++;snum=30;}if(knum==2){snum++;fnum=30;}if(snum>=30){W=0x01; //位选D=d[shi/10]; //段选delay(5);D=0XFF; //消隐if(miao%2==0) //小数点闪烁{W=0x02;D=dd[shi%10];delay(5);D=0XFF; //消隐}else{W=0x02;D=d[shi%10];delay(5);D=0XFF; //消?}if(snum==60)snum=0;}if(fnum>=30){W=0x04;D=d[fen/10];delay(5);D=0XFF; //消隐W=0x08;D=d[fen%10];delay(5);D=0XFF; //消隐if(fnum==60)fnum=0;}}void read_sf(){shi=read_1302(read_shi);fen=read_1302(read_fen);miao=read_1302(read_miao);display(shi,fen,miao);}void keyscan() //按键扫描函数{if(s3==0) //选择按键按下{delay(10);if(s3==0){while(!s3)display(shi,fen,miao); //加上这句,按键按下就不会闪knum++; if(knum==1) //分闪烁{write_1302(0x8e,0x00); //保护取消write_1302(write_miao,0x80);}if(knum==3) //时钟启动{knum=0;write_1302(write_miao,0x00);write_1302(0x8e,0x80); //保护启动}}}if(knum==1) //分钟调节{if(s1==0) //加{delay(10);if(s1==0){while(!s1)display(shi,fen,miao); //加上这句,按键按下就不会闪fen++; fen=fen/10*16+fen%10; //转为16进制if(fen==0x60)fen=0x00;write_1302(write_fen,fen); //写入1302read_sf(); //读出时间,然后显示}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen,miao); //加上这句,按键按下就不会闪fen--; fen=fen/10*16+fen%10; //转为16进制if(fen==-1)fen=0x59;write_1302(write_fen,fen);read_sf();}}}if(knum==2){if(s1==0){delay(10);if(s1==0){while(!s1)display(shi,fen,miao); //加上这句,按键按下就不会闪shi++; shi=shi/10*16+shi%10; //转为16进制if(shi==0x24)shi=0x00;write_1302(write_shi,shi);read_sf();}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen,miao); //加上这句,按键按下就不会闪shi--;shi=shi/10*16+shi%10; //转为16进制if(shi==-1)shi=0x23;write_1302(write_shi,shi);read_sf();}}}}void main(){// init_1302();while(1){read_sf();keyscan();}}。

(完整版)DS1302数码管显示程序

(完整版)DS1302数码管显示程序
clock_s2=clock_s2&0xff;
clock_s1<<=4;
clock_s1=clock_s1|clock_s2;// 10to16
clock_f1=mie/10;
clock_f2=mie%10;
clock_f1=clock_f1&0xff; //全1出1与运算
clock_f2=clock_f2&0xff;
delay(1);P0=0X00;}
if(cant1==5)
cant1=0;
P2=2;
P0=ledmap[10];//显示"-"数组里的0x40
delay(1);
P0=0X00;
if(cant2<=3)
{
P2=3;
P0=ledmap[clock_fs];//分十位
delay(1);
P0=0X00;
P2=4;
if(mie>=60)
{
mie=0;
}
delayAJ(10);
}//以上时钟+设定
}
}
if(down==0)
{
delayAJ(5);//消抖
if(down==0)
{
delayAJ(5);
if(b==1)
{
hour--;
if(hour<0)
{
hour=23;
}
delayAJ(10);
}
if(b==2)
delayAJ(5);
}
while(!set)
{
delayAJ(5);
}
}
if(b!=0)//时分设定
{
if(up==0)

ds1302数码管显示

ds1302数码管显示

DS1302应用刚学单片机,好多好奇,所以想做个简单的时钟。

下面是PROTEUS仿真电路和电路图,简单易懂。

文笔不好,说了多余。

下面是程序。

#include<reg52.h>#include<intrins.h>#include<ds1302.h>#define uint unsigned int#define uchar unsigned char#define BCDTUAN(str) (str/10*16+str%10) //定义宏,将要写入DS1302的时间转化为BCD码#define Write_Sec 0x80#define Write_Min 0x82#define Write_Hou 0x84#define Write_Dat 0x86#define Write_Mon 0x88#define Write_day 0x8a#define Write_Yea 0x8c#define Write_WP 0x8e //写保护位#define Write_TCR 0x90#define Read_Sec 0x81#define Read_Min 0x83#define Read_Hou 0x85#define Read_Dat0x87#define Read_Mon 0x89#define Read_Day 0x8b#define Read_Yea 0x8d#define CLK_BurstW 0xbf //时钟突发模式写#define CLK_BurstR 0xbf //时钟突发模式读#define Write_RAM_Begin 0xc0 //RAM第一个字节写指令#define Read_RAM_Begin 0xc1 //RAM第一个字节读指令#define RAM_BurstW 0xfe //突发模式写RAM#define RAM_BurstR 0xff //突发模式读RAMsbit _74hc154_A = P1^0;sbit _74hc154_B = P1^1;sbit _74hc154_C = P1^2;sbit _74hc154_D = P1^3;sbit CE =P1^6;sbit SCLK=P1^5;sbit IO =P1^4;uchar code scan[][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};uchar scanbuff[]={0,0,0,0,0,0,0,0,0,0,0,0};uchar code dispdate[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void WriteDS1302(void); //向DS1302写入时间。

ds1302显示时间

ds1302显示时间
}
}
setds1302();//设置时间初值,
while(1)
{
getds1302();//循环显示时间
ledbuf[0]=ledmap[timebuf[0]%16];//显示秒个位
ledbuf[1]=ledmap[timebuf[0]/16];//显示秒十位
ledbuf[2]=ledmap[timebuf[1]%16]&0x7f;//显示分个位,并显示小数点
ledbuf[3]=ledmap[timebuf[1]/16];//显示分十位
ledbuf[4]=ledmap[timebuf[2]%16]&0x7f;//显示小时个位,并显示小数点
ledbuf[5]=ledmap[timebuf[2]/16];//显示小时十位
disp();//调数码管上显示时间程序
void delay(unsigned int z)
{
unsigned char i;
while(z--)//显示要用的延时程序
for(i=110;i>0;i--);
}
void writebyte(unsigned char date)
{
unsigned char j;
//1302写子程序
for(j=0;j<8;j++)
_nop_();
dat=1;
_nop_();
_nop_();
return date;
}
addr,unsigned char date)
{ ce=0;
_nop_();
clk=0;
_nop_();
ce=1;
_nop_();//1302写某个地址数据子程序
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档