仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
- /*******************************************************************************
- *
- * 2021年11月28日写的程序
- --------------------------------------------------------------------------------
- *******************************************************************************/
- #include "STC15F2K.h"
- #include "epprom1.h"
- #include <ds1302.h>
- #include "timer1.h"
- #include "count_hanshu.h"
- //#include "intrins.h"
- //#include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- //--定义使用的IO口--//
- #define IO_DUAN P1 //段选
- sbit A1=P2^0; //左1的数码管阳极
- sbit A2=P2^1; //左2的数码管阳极
- sbit A3=P2^2; //左3的数码管阳极
- sbit K1=P2^5;
- sbit K2=P2^6;
- sbit K3=P2^7;
- //--定义全局变量--//
- unsigned char code CODE_WEI[8] = {
- 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制
- unsigned char code CODE_DUAN[19] = {
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff,0x80};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
- unsigned char DisplayData[8];
- //用来存放要显示的8位数的值
- void Ds1302ReadTime();
- //--声明全局函数--//
- void DigDisplay(); //动态显示函数
- uchar B1,B2,B3,aa,X1,X2,X3;
- uint chuzhi=0x0000,yy,DJS,count,count_djs;
- bit flag,TSJ=1;
- /*******************************************************************************
- 按K1键,输入epprom。
- ******************************************************************************/
- void epp()
- {
- if (K1==0)
- { while(!K1);
- if(aa<7)
- {Ds1302MF(aa);}
- else
- {
- if (aa==7) B1++;
- if (aa==8) B2++;
- if (aa==9) B3++;
- if (B1>30)B1=21;
- if (B2>12)B2=1;
- if (B3>31)B3=1;
- shanchu(chuzhi);
- xieru(chuzhi+1,B1);
- xieru(chuzhi+2,B2);
- xieru(chuzhi+3,B3);
- B1=duqu(chuzhi+1);
- B2=duqu(chuzhi+2);
- B3=duqu(chuzhi+3);
-
- }
- DJS= day_count(B1,B2,B3);
- }
- }
- /*******************************************************************************
- 按K2键,增加aa值,0-6是秒分时日月周年。7-9是B1、B2、B3的值
- ******************************************************************************/
- uchar t=6;
- void MF()
- {
- if(TSJ==0){ //TSJ是开机时,检测K2键是否按下,按下,则调整time,否则 只调整倒计时日期
- if (K2==0) {while(!K2);aa++;yy=0;}
- if (aa==11) aa=0 ;
- }
- else
- {
- if (t==10) t=6 ;
- if (K2==0) {while(!K2);t++;yy=0;aa=t;}
- }
- }
- /*******************************************************************************
- 提供显示函数显示的值。
- ******************************************************************************/
- void XX()
- {
- unsigned int i;
- i++;
- if(i==1500){i=0;yy++; }
- if(yy==100){yy=0;aa=10;}
- if(aa<7){
- X1=TIME[aa]%16;
- X2=TIME[aa]/16;
- X3=aa;
-
- }
- if(aa>=7) X3=aa+3;
-
- if(aa==7){X1=B1%10; X2=B1/10; }
- if(aa==8){X1=B2%10; X2=B2/10; }
- if(aa==9){X1=B3%10; X2=B3/10; }
- if (i/500==0) {X1=17;X2=17; }
- if(aa==10 )
- {
- X3=DJS/100%10;
- X2=DJS/10%10;
- X1=DJS%10;
- }
- //X3=aa;
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main(void)
- { Ds1302ReadTime();
- if(K2==0){while(!K2);TSJ=0;}
- if(K1==0){while(!K1);Ds1302Init();}
- //
-
- aa=10;
-
- B1=duqu(chuzhi+1);
- B2=duqu(chuzhi+2);
- B3=duqu(chuzhi+3);
- // day_count(B1,B2,B3);
- DJS= day_count(B1,B2,B3);
- // P2=0xff;
- // Ds1302MF(0);
- innt();//启动定时中断
- while(1)
- {
- // DJS= day_count(B1,B2,B3);
- MF();
- epp();
- // if(K1==0){while(!K1);}
- XX();
- DigDisplay();
- }
- }
- /*******************************************************************************
- * 函 数 名 : DigDisplay
- * 函数功能 : 使用数码管显示
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void DigDisplay()
- {
- unsigned int j,i;
- i++;
- if(i==2000) i=0;
- //======================================
- A1=0;
- IO_DUAN=CODE_DUAN[X1];
- j = 80; //扫描间隔时间设定
- while(j--){};
- A1=1;// = 0xff;
- IO_DUAN= 0xff;//消隐
- //===========================================
- A2=0;
- IO_DUAN=CODE_DUAN[X2];
- j = 80; //扫描间隔时间设定
- while(j--){};
- A2 = 1;
- IO_DUAN= 0x00;//消隐
- //===========================================
- A3=0;
- IO_DUAN=CODE_DUAN[X3];
- j = 80; //扫描间隔时间设定
- while(j--){};
- A3 = 1;
- IO_DUAN= 0x00;//消隐
- //===========================================
- //if (aa==10){
- //if(i%2000<1000)
- // A1=0;
- // IO_DUAN=CODE_DUAN[18];
- // j = 50; //扫描间隔时间设定
- // while(j--){};
- // A3 = 1;
- // IO_DUAN= 0x00;//消隐
- //
- //}
- }
- /* Timer0 时间中断的例行程序 */
- void tm0_isr() interrupt 1 //using 1
- {
- if (count-- == 0) //1ms * 1000 = 1s
- {
- count = 1000 ;//reset counter
- Ds1302ReadTime();
- count_djs++;
- if(count_djs==21600){count_djs=0;DJS= day_count(B1,B2,B3);}
- //X3=X3+1;if(X3==10)X3=0;
- }
- }
复制代码
Keil代码与Proteus仿真下载:
12V数码管 -共阳 ULN2803.7z
(1.26 MB, 下载次数: 23)
|