找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2996|回复: 6
打印 上一主题 下一主题
收起左侧

STC15单片机计数器制作 附源程序

[复制链接]
跳转到指定楼层
楼主
在做一个调速电路的时候,需要使用计数器来统计机械往返运动的次数,所以设计这个。使用15W408单片机,直接驱动数码管显示,电路非常简单。传感器使用的是磁力开关,需要重新计数的时候只要按一下复位键即可。使用了一个多月,效果很好。

制作出来的实物图如下:


电路原理图如下:


单片机源程序如下:
  1. #include <STC15.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int


  4. sbit FMQ=P3^4;//蜂鸣器

  5. sbit K1=P3^2; //按键加
  6. sbit K2=P3^5; //按键减
  7. sbit K3=P3^2; //复位

  8. bit flag_KEY=0; //按键松开标志位

  9. sbit DS1=P1^3;//数码管第1位
  10. sbit DS2=P1^1;//数码管第2位
  11. sbit DS3=P1^0;//数码管第3位
  12. sbit DS4=P1^2;//数码管第4位

  13. unsigned char ScanTime=1;

  14. unsigned int Num=0;


  15. //共阴数码管段码表,段接P2.0-2.7,位接P1.0-1.3
  16. unsigned char code SEG_Tab[]={      
  17.         0x3F,/*0*/
  18.         0x06,/*1*/
  19.         0x5B,/*2*/
  20.         0x4F,/*3*/
  21.         0x66,/*4*/
  22.         0x6D,/*5*/
  23.         0x7D,/*6*/
  24.         0x07,/*7*/
  25.         0x7F,/*8*/
  26.         0x6F,/*9*/
  27. };

  28. /*---------------------数码管显示---------------------------------------*/        
  29. void display()
  30. {        //数码管初始化
  31.         P2=0x00;//P2=00000000
  32.         P1=0xFF;//P1=11111111

  33.   switch(ScanTime)
  34.         {
  35.           //----------数码管第1位--------------               
  36.                 case 1:
  37.                         if(Num==0)
  38.                         {
  39.                                 P2=0x40;
  40.                         }
  41.                         else
  42.                         {
  43.                                 P2=SEG_Tab[Num/1000];
  44.                         }
  45.                                 
  46.                                 DS1=0;

  47.                 break;

  48.           //-----------数码管第2位-------------               
  49.                 case 2:
  50.                         if(Num==0)
  51.                         {
  52.                                 P2=0x40;
  53.                         }
  54.                         else
  55.                         {
  56.                                 P2=SEG_Tab[Num/100%10];
  57.                         }                        
  58.                                 
  59.                         DS2=0;
  60.                                 
  61.                 break;

  62.                 //-----------数码管第3位-------------               
  63.                 case 3:  
  64.                         if(Num==0)
  65.                         {
  66.                                 P2=0x40;
  67.                         }
  68.                         else
  69.                         {
  70.                                 P2=SEG_Tab[Num/10%10];
  71.                         }                        
  72.                         
  73.                
  74.                           DS3=0;                        
  75.                 break;

  76.                 //-----------数码管第4位-------------               
  77.                 case 4:  
  78.                         if(Num==0)
  79.                         {
  80.                                 P2=0x40;
  81.                         }
  82.                         else
  83.                         {
  84.                                 P2=SEG_Tab[Num%10];
  85.                         }                        
  86.                         
  87.                         DS4=0;               
  88.                 break;

  89.          //------------------default---------------        
  90.                 default: break;        
  91.         }
  92.         
  93.         //-----数码管循环------        
  94.         ScanTime++;
  95.         if(ScanTime>4)
  96.         {
  97.                 ScanTime=1;//循环扫描        
  98.         }
  99. }

  100. /*-------------------------------------
  101.                             按键扫描
  102. ---------------------------------------*/        
  103. void keyscan()
  104. {
  105.         if(K1==0)
  106.         {
  107.                 if(flag_KEY==1)//按键只响应1次
  108.                 {
  109.                         flag_KEY=0;
  110.                         
  111.                         if(Num<999)
  112.                         {
  113.                                 Num++;
  114.                         }
  115.                 }
  116.         }


  117.         else if(K2==0)
  118.         {
  119.                 if(flag_KEY==1)//按键只响应1次
  120.                 {
  121.                         flag_KEY=0;
  122.                         
  123.                         if(Num>0)
  124.                         {
  125.                                 Num--;
  126.                         }
  127.                 }
  128.         }


  129.                 else if(K3==0)
  130.         {
  131.                 if(flag_KEY==1)//按键只响应1次
  132.                 {
  133.                         flag_KEY=0;
  134.                         
  135.                         if(Num>0)
  136.                         {
  137.                                 Num=0;
  138.                         }
  139.                 }
  140.         }

  141.   else//按键松开
  142.   {        
  143.           flag_KEY=1;
  144.   }
  145. }







  146. void delay_ms(unsigned int ms)// 延时子程序
  147. {   
  148.   unsigned int a,b;
  149.   for(a=ms;a>0;a--)
  150.   for(b=123;b>0;b--);
  151. }
  152. /*-------------------------------------
  153.                             主函数
  154. ---------------------------------------*/        
  155. void main()
  156. {
  157.         P1M1 = 0x00; P1M0 = 0xFF; //P1口推挽模式
  158.         P2M1 = 0x00; P2M0 = 0xFF; //P2口推挽模式
  159.    
  160.         while(1)
  161.         {
  162.                 display();
  163.                 keyscan();
  164.                 delay_ms(10);
  165.                 if(Num>=100)
  166.                 {
  167.                         FMQ=0;
  168.                 }
  169.                 else
  170.                 {
  171.                         FMQ=1;
  172.                 }
  173.         }
  174. }
复制代码

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:352736 发表于 2022-5-20 16:43 来自手机 | 只看该作者
版主你好,请问下载时单片机的晶振频率设置多少?
回复

使用道具 举报

板凳
ID:352736 发表于 2022-5-22 19:00 来自手机 | 只看该作者
版主,照电路搭建数码管没有显示
回复

使用道具 举报

地板
ID:235691 发表于 2024-1-29 16:12 | 只看该作者
数码管不要限流电阻吗
回复

使用道具 举报

5#
ID:352736 发表于 2024-8-21 15:32 来自手机 | 只看该作者
没有任何显示
回复

使用道具 举报

6#
ID:352736 发表于 2024-9-13 17:36 | 只看该作者
ID95809楼主你好,我仿制你的计数器程序计数没反应,把K3复位按钮那段程序删了才可以计数不知道是什么原因
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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