找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3633|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

STC15單片機(jī)計(jì)數(shù)器制作 附源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:95809 發(fā)表于 2021-12-23 12:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
在做一個(gè)調(diào)速電路的時(shí)候,需要使用計(jì)數(shù)器來統(tǒng)計(jì)機(jī)械往返運(yùn)動的次數(shù),所以設(shè)計(jì)這個(gè)。使用15W408單片機(jī),直接驅(qū)動數(shù)碼管顯示,電路非常簡單。傳感器使用的是磁力開關(guān),需要重新計(jì)數(shù)的時(shí)候只要按一下復(fù)位鍵即可。使用了一個(gè)多月,效果很好。

制作出來的實(shí)物圖如下:


電路原理圖如下:


單片機(jī)源程序如下:
  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; //復(fù)位

  8. bit flag_KEY=0; //按鍵松開標(biāo)志位

  9. sbit DS1=P1^3;//數(shù)碼管第1位
  10. sbit DS2=P1^1;//數(shù)碼管第2位
  11. sbit DS3=P1^0;//數(shù)碼管第3位
  12. sbit DS4=P1^2;//數(shù)碼管第4位

  13. unsigned char ScanTime=1;

  14. unsigned int Num=0;


  15. //共陰數(shù)碼管段碼表,段接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. /*---------------------數(shù)碼管顯示---------------------------------------*/        
  29. void display()
  30. {        //數(shù)碼管初始化
  31.         P2=0x00;//P2=00000000
  32.         P1=0xFF;//P1=11111111

  33.   switch(ScanTime)
  34.         {
  35.           //----------數(shù)碼管第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.           //-----------數(shù)碼管第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.                 //-----------數(shù)碼管第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.                 //-----------數(shù)碼管第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.         //-----數(shù)碼管循環(huán)------        
  94.         ScanTime++;
  95.         if(ScanTime>4)
  96.         {
  97.                 ScanTime=1;//循環(huán)掃描        
  98.         }
  99. }

  100. /*-------------------------------------
  101.                             按鍵掃描
  102. ---------------------------------------*/        
  103. void keyscan()
  104. {
  105.         if(K1==0)
  106.         {
  107.                 if(flag_KEY==1)//按鍵只響應(yīng)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)//按鍵只響應(yīng)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)//按鍵只響應(yīng)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)// 延時(shí)子程序
  147. {   
  148.   unsigned int a,b;
  149.   for(a=ms;a>0;a--)
  150.   for(b=123;b>0;b--);
  151. }
  152. /*-------------------------------------
  153.                             主函數(shù)
  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. }
復(fù)制代碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:352736 發(fā)表于 2022-5-20 16:43 來自手機(jī) | 只看該作者
版主你好,請問下載時(shí)單片機(jī)的晶振頻率設(shè)置多少?
回復(fù)

使用道具 舉報(bào)

板凳
ID:352736 發(fā)表于 2022-5-22 19:00 來自手機(jī) | 只看該作者
版主,照電路搭建數(shù)碼管沒有顯示
回復(fù)

使用道具 舉報(bào)

地板
ID:235691 發(fā)表于 2024-1-29 16:12 | 只看該作者
數(shù)碼管不要限流電阻嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:352736 發(fā)表于 2024-8-21 15:32 來自手機(jī) | 只看該作者
沒有任何顯示
回復(fù)

使用道具 舉報(bào)

6#
ID:352736 發(fā)表于 2024-9-13 17:36 | 只看該作者
ID95809樓主你好,我仿制你的計(jì)數(shù)器程序計(jì)數(shù)沒反應(yīng),把K3復(fù)位按鈕那段程序刪了才可以計(jì)數(shù)不知道是什么原因
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表