|
旋转电子钟制作资料分享给大家
元件名称 | 型号 | 封装 | 数量 | 参数 | 单片机 | U1 | LQFP 44 | 1 | STC89C52 | 时钟芯片 | U2 | DIP 4 | 1 | DS1302 | 贴片电阻 | RO-R19 | O805 | 20 | 1K | 贴片电阻 | R22-R25 | O8O5 | 4 | 10K | 贴片LED | O8O5 | O8O5 | 20 | 红 | 电阻 | R20 | AXIAL0.2 | 1 | 470 | 瓷片电容 | C1-C4 | O8O5 | 4 | 33P | 红外接收 | Q1 | TO-220 | 1 | 3P | 晶振 | X1 | CC2 | 1 | 11.0592 MHZ | 晶振 | X2 | CC2 | 1 | 32.768 MHZ | 排插 | J1 | SIP | 1 | SIP4 | 电感线圈 | L2(次级) | L10 | 1 | 80匝 | 钮扣电池座 | Battay | AXIAL0.9 | 1 | 3V | 无线供电部份 | 三极管 | Q1 | TO92 | 1 | B772 | 三极管 | Q2 | TO92 | 1 | 9013 | 电容 | C1 | CC4 | 1 | 222 | 电阻 | R-R3 | RW10 | 3 | 470 | 电阻 | R4 | RW10 | 1 | 10K | 二极管 | D1-D2 | DW10 | 2 | 1N4007 | 二极管 | D3 | LED | 1 | 红外发射 | 插口 | J1-J2 | CON2 | 2 | 2P | 电感 | L1(初级线圈) | L10 | 1 | 100匝 |
PCB原理图,源程序都有,想要的同学可以下去参考下。本人做成功了。就不上图了。做的不好看。电源部分没做成
- /***************************************************************************************************/
- //指针式时钟 简单版 有待改进!
- #include
- #define uchar unsigned char //宏定义
- #define uint unsigned int
- //sbit KEY=P3^2 ;
- //sbit led1=P1^0 ;
- sbit ACC0=ACC^0; //1bit数据存储位
- sbit ACC7=ACC^7;
- sbit T_CLK=P3^5; //DS1302引脚连接
- sbit T_IO =P3^6;
- sbit T_RST=P3^7;
- uchar i=1 ;
- uint Pt,S ;
- uint D=0 ;
- uchar miao,Cent,Hour,Month,Day,Week,miaot,centt,hourt;
- void du1302();
- /*******************************************************************************/
- /*外部中断0处理函数*/
- void intersvr0(void)interrupt 0 using 0
- {
-
- // D=D+(S-180);
- //D=0;
- //修正值
- // Pt=580;
- //得到定时器T0的初设值
- S=0;
-
- //计数器清零,将重新计数
- }
- /*定时中断0处理函数*/
- void timer0(void)interrupt 1 using 1
- {
- TH0=(65536-630)/256 ;
- TL0=(65536-630)%256 ;
- //设置定时器T0的初设值
- S++;
- //计数
- switch(S)
- {
- case 15 :
- //0点
- case 30 :
- //1点
- case 45 :
- //2点
- case 60 :
- //3点
- case 75 :
- //4点
- case 90 :
- //5点
- case 105 :
- //6点
- case 120 :
- //7点
- case 135 :
- //8点
- case 150 :
- //9点
- case 165 :
- //10点
- case 1 :
- //11点
- P0=0xF8 ;
- while(i--);
- break ;
- }
- //0-180 0-60
- if((miaot==S/3)&&(S%3==1))
- {
- P0=0X07 ;
- P2=0X00 ;
- P1=0X00 ;
- while(i--);
- }
- //0-180 0-60
- if((centt==S/3)&&(S%3==1))
- {
- P0=0XFF ;
- P2=0X00 ;
- P1=0X00 ;
- while(i--);
- }
-
- //0-180 0-60
- if((hourt==S/3)&&(S%3==1))
- {
- P0=0XFF ;
- P2=0X0F ;
- P1=0X00 ;
- while(i--);
- }
- P0=0XFF ;
- P1=0XFF ;
- P2=0XFF ;
- }
- /*******************DS1302读写程序**********************************
- /********************************************************************
- 函 数 名:RTInputByte()
- 功 能:实时时钟写入一字节
- 说 明:往DS1302写入1Byte数据 (内部函数)
- 入口参数:d 写入的数据
- 返 回 值:无
- ***********************************************************************/
- void RTInputByte(uchar d)
- {
- uchar h;
- ACC = d;
- for(h=8; h>0; h--)
- {
- T_IO = ACC0; /*相当于汇编中的 RRC */
- T_CLK = 1;
- T_CLK = 0;
- ACC = ACC >> 1;
- }
- }
- /********************************************************************
- 函 数 名:RTOutputByte()
- 功 能:实时时钟读取一字节
- 说 明:从DS1302读取1Byte数据 (内部函数)
- 入口参数:无
- 返 回 值:ACC
- 设 计:zhaojunjie 日 期:2002-03-19
- 修 改: 日 期:
- ***********************************************************************/
- uchar RTOutputByte(void)
- {
- uchar h;
- for(h=8; h>0; h--)
- {
- ACC = ACC >>1; /*相当于汇编中的 RRC */
- ACC7 = T_IO;
- T_CLK = 1;
- T_CLK = 0;
- }
- return(ACC);
- }
- /********************************************************************
- 函 数 名:W1302()
- 功 能:往DS1302写入数据
- 说 明:先写地址,后写命令/数据 (内部函数)
- 调 用:RTInputByte() , RTOutputByte()
- 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
- 返 回 值:无
- ***********************************************************************/
- /*void W1302(uchar ucAddr, uchar ucDa)
- {
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); /* 地址,命令 */
- /* RTInputByte(ucDa); /* 写1Byte数据*/
- /* T_CLK = 1;
- T_RST = 0;
- /*}
- /********************************************************************
- 函 数 名:R1302()
- 功 能:读取DS1302某地址的数据
- 说 明:先写地址,后读命令/数据 (内部函数)
- 调 用:RTInputByte() , RTOutputByte()
- 入口参数:ucAddr: DS1302地址
- 返 回 值:ucData :读取的数据
- ***********************************************************************/
- uchar R1302(uchar ucAddr)
- {
- uchar ucData;
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); /* 地址,命令 */
- ucData = RTOutputByte(); /* 读1Byte数据 */
- T_CLK = 1;
- T_RST = 0;
- return(ucData);
- }
- /********************************************************************
- 函 数 名:Set1302()
- 功 能:设置初始时间
- 说 明:先写地址,后读命令/数据(寄存器多字节方式)
- 调 用:W1302()
- 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
- 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
- 返 回 值:无
- ***********************************************************************/
- /*void Set1302(uchar *pClock)
- {
- uchar h;
- uchar ucAddr = 0x80;
- W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
- /* for(h =7; h>0; h--)
- {
- /* W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
- /* pClock++;
- ucAddr +=2;
- /* }
- W1302(0xc0,0x01);
- W1302(0XC2,0X03); //初始自动转换显示时间为3秒。
- W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
- /*}
- /******************读取DS1302中的时间****************/
- void du1302()
- {
- miao=R1302(0x81); //对取 秒 分 时 日 月 星期 年
- Cent=R1302(0x83);
- Hour=R1302(0x85);
- //Day=R1302(0x87);
- //Month=R1302(0x89);
- //Week=R1302(0x8b);
-
- }
- /*****主函数*****/
- void main(void)
- {
- TMOD=0x01 ;
- //定时器0和1工作方式都为1
- EX0=1 ;
- //开外部中断0
- IT0=1 ;
- //外部中断0设置为下降沿中断
- ET0=1 ;
- //定时器0开中断
- // ET1=1; //定时器1开中断
- TH0=(65536-630)/256 ;
- TL0=(65536-630)%256 ;
- TR0=1 ;
- EA=1 ;
- //开总中断
-
- //无限循环
- while(1)
- {
- du1302();
- miaot=miao/16*10+miao%16 ;
- centt=Cent/16*10+Cent%16 ;
- hourt=Hour/16*10+Hour%16 ;
-
- }
- }
- /*****END*****/
复制代码
|
评分
-
查看全部评分
|