找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2766|回复: 2
收起左侧

Proteus仿真单片机+ULN2803驱动共阳12V数码管程序

[复制链接]
ID:705074 发表于 2021-12-29 00:34 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

电路图

电路图

  1. /*******************************************************************************
  2. *                 
  3. *        2021年11月28日写的程序                        
  4. --------------------------------------------------------------------------------

  5. *******************************************************************************/

  6. #include "STC15F2K.h"
  7. #include "epprom1.h"
  8. #include <ds1302.h>
  9. #include "timer1.h"
  10. #include "count_hanshu.h"
  11. //#include "intrins.h"
  12. //#include <math.h>

  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. //--定义使用的IO口--//
  16. #define IO_DUAN  P1    //段选
  17. sbit A1=P2^0;      //左1的数码管阳极
  18. sbit A2=P2^1;      //左2的数码管阳极
  19. sbit A3=P2^2;      //左3的数码管阳极
  20. sbit K1=P2^5;
  21. sbit K2=P2^6;
  22. sbit K3=P2^7;
  23. //--定义全局变量--//
  24. unsigned char code CODE_WEI[8] = {
  25. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制

  26. unsigned char code CODE_DUAN[19] = {
  27. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  28. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff,0x80};
  29. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  30. unsigned char DisplayData[8];
  31. //用来存放要显示的8位数的值
  32. void Ds1302ReadTime();
  33. //--声明全局函数--//
  34. void DigDisplay(); //动态显示函数
  35. uchar B1,B2,B3,aa,X1,X2,X3;
  36. uint chuzhi=0x0000,yy,DJS,count,count_djs;
  37. bit flag,TSJ=1;
  38. /*******************************************************************************
  39.    按K1键,输入epprom。
  40. ******************************************************************************/

  41. void epp()
  42. {
  43. if (K1==0)

  44. { while(!K1);
  45. if(aa<7)
  46. {Ds1302MF(aa);}
  47. else
  48. {
  49. if (aa==7)    B1++;
  50. if (aa==8)    B2++;
  51. if (aa==9)    B3++;
  52. if (B1>30)B1=21;
  53. if (B2>12)B2=1;
  54. if (B3>31)B3=1;
  55.   shanchu(chuzhi);
  56.   xieru(chuzhi+1,B1);
  57.   xieru(chuzhi+2,B2);
  58.   xieru(chuzhi+3,B3);
  59.    B1=duqu(chuzhi+1);
  60.    B2=duqu(chuzhi+2);
  61.    B3=duqu(chuzhi+3);
  62.    
  63.    }
  64. DJS= day_count(B1,B2,B3);
  65.    }
  66. }

  67. /*******************************************************************************
  68.    按K2键,增加aa值,0-6是秒分时日月周年。7-9是B1、B2、B3的值
  69. ******************************************************************************/
  70. uchar t=6;
  71. void MF()
  72. {

  73. if(TSJ==0){       //TSJ是开机时,检测K2键是否按下,按下,则调整time,否则 只调整倒计时日期
  74.   if (K2==0) {while(!K2);aa++;yy=0;}
  75.   if (aa==11)  aa=0    ;
  76.   }
  77.   else
  78.   {
  79.   if (t==10)  t=6    ;
  80.   if (K2==0) {while(!K2);t++;yy=0;aa=t;}
  81.   }
  82. }

  83. /*******************************************************************************
  84. 提供显示函数显示的值。
  85. ******************************************************************************/
  86. void XX()
  87. {
  88. unsigned int i;
  89. i++;
  90. if(i==1500){i=0;yy++; }
  91. if(yy==100){yy=0;aa=10;}

  92.             if(aa<7){
  93.             X1=TIME[aa]%16;
  94.             X2=TIME[aa]/16;
  95.             X3=aa;
  96.         
  97.             }
  98.             if(aa>=7) X3=aa+3;
  99.             
  100. if(aa==7){X1=B1%10;    X2=B1/10; }
  101. if(aa==8){X1=B2%10;    X2=B2/10; }
  102. if(aa==9){X1=B3%10;    X2=B3/10; }
  103.      if (i/500==0) {X1=17;X2=17;    }
  104. if(aa==10 )
  105. {

  106. X3=DJS/100%10;
  107. X2=DJS/10%10;
  108. X1=DJS%10;
  109. }
  110. //X3=aa;
  111. }

  112. /*******************************************************************************
  113. * 函 数 名         : main
  114. * 函数功能           : 主函数
  115. * 输    入         : 无
  116. * 输    出         : 无
  117. *******************************************************************************/

  118. void main(void)
  119. {     Ds1302ReadTime();
  120.    if(K2==0){while(!K2);TSJ=0;}
  121.    if(K1==0){while(!K1);Ds1302Init();}
  122. //
  123.    
  124.    aa=10;
  125.   
  126.    B1=duqu(chuzhi+1);
  127.    B2=duqu(chuzhi+2);
  128.    B3=duqu(chuzhi+3);
  129. //   day_count(B1,B2,B3);
  130.    DJS= day_count(B1,B2,B3);
  131. // P2=0xff;
  132. //    Ds1302MF(0);  
  133.   innt();//启动定时中断

  134.     while(1)
  135.     {
  136. //    DJS= day_count(B1,B2,B3);
  137.         MF();
  138.         epp();
  139. //        if(K1==0){while(!K1);}
  140.         XX();
  141.         DigDisplay();
  142.     }               
  143. }

  144. /*******************************************************************************
  145. * 函 数 名         : DigDisplay
  146. * 函数功能           : 使用数码管显示
  147. * 输    入         : 无
  148. * 输    出         : 无
  149. *******************************************************************************/

  150. void DigDisplay()
  151. {
  152.     unsigned int j,i;

  153. i++;
  154. if(i==2000)     i=0;


  155. //======================================
  156.         A1=0;
  157.         IO_DUAN=CODE_DUAN[X1];
  158.          j = 80;                         //扫描间隔时间设定
  159.         while(j--){};   
  160.         A1=1;// = 0xff;
  161.         IO_DUAN= 0xff;//消隐
  162. //===========================================
  163.         A2=0;
  164.         IO_DUAN=CODE_DUAN[X2];
  165.          j = 80;                         //扫描间隔时间设定
  166.         while(j--){};   
  167.         A2 = 1;
  168.         IO_DUAN= 0x00;//消隐
  169. //===========================================        
  170.          A3=0;
  171.         IO_DUAN=CODE_DUAN[X3];
  172.          j = 80;                         //扫描间隔时间设定
  173.         while(j--){};
  174.         A3 = 1;
  175.         IO_DUAN= 0x00;//消隐



  176. //===========================================
  177. //if (aa==10){
  178. //if(i%2000<1000)        
  179. //         A1=0;
  180. //        IO_DUAN=CODE_DUAN[18];
  181. //         j = 50;                         //扫描间隔时间设定
  182. //        while(j--){};
  183. //        A3 = 1;
  184. //        IO_DUAN= 0x00;//消隐
  185. //
  186. //}
  187. }
  188. /* Timer0 时间中断的例行程序 */
  189. void tm0_isr() interrupt 1 //using 1
  190. {
  191.     if (count-- == 0) //1ms * 1000 = 1s
  192.     {
  193.         count = 1000 ;//reset counter
  194.          Ds1302ReadTime();
  195.         count_djs++;
  196.         if(count_djs==21600){count_djs=0;DJS= day_count(B1,B2,B3);}
  197.      //X3=X3+1;if(X3==10)X3=0;   
  198.     }
  199. }



复制代码

Keil代码与Proteus仿真下载: 12V数码管 -共阳 ULN2803.7z (1.26 MB, 下载次数: 23)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:979299 发表于 2021-12-29 11:44 | 显示全部楼层
你这个电路作用是什么,P2和P1口的电阻完全可以用排阻啊,P2口用作位选和按键一定要上拉电阻吗,数码管也可以用4P的,这个仿真电路也没必要用12转5V,你贴出来的程序和电路也不怎么对得上
回复

使用道具 举报

ID:705074 发表于 2021-12-29 23:46 | 显示全部楼层
兴安xa 发表于 2021-12-29 11:44
你这个电路作用是什么,P2和P1口的电阻完全可以用排阻啊,P2口用作位选和按键一定要上拉电阻吗,数码管也可 ...

谢谢您的关注和建议。关于疑问,我做个简单的说明。这是一个 日期倒计时。3个 2.3寸白色的数码管显示剩余天数。驱动数码管需要9.6V电压,就用了一个12v电源。P2口不用上拉也可以的。另外,单片机是stc15f204ea,仿真用的是51单片机,是对不上的。P2和P1用排阻最好的,我是新手,当时手头没有排阻,旧凑合了。哈哈哈。谢谢!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表