在做一個調(diào)速電路的時候,需要使用計數(shù)器來統(tǒng)計機械往返運動的次數(shù),所以設計這個。使用15W408單片機,直接驅(qū)動數(shù)碼管顯示,電路非常簡單。傳感器使用的是磁力開關,需要重新計數(shù)的時候只要按一下復位鍵即可。使用了一個多月,效果很好。
制作出來的實物圖如下:
e5771861ad14b237cfdf9b7e22cad76.jpg (132.58 KB, 下載次數(shù): 84)
下載附件
2021-12-23 12:21 上傳
電路原理圖如下:
2021-12-23_12-05-19.jpg (88.79 KB, 下載次數(shù): 75)
下載附件
電路圖
2021-12-23 12:13 上傳
單片機源程序如下:- #include <STC15.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit FMQ=P3^4;//蜂鳴器
- sbit K1=P3^2; //按鍵加
- sbit K2=P3^5; //按鍵減
- sbit K3=P3^2; //復位
- bit flag_KEY=0; //按鍵松開標志位
- sbit DS1=P1^3;//數(shù)碼管第1位
- sbit DS2=P1^1;//數(shù)碼管第2位
- sbit DS3=P1^0;//數(shù)碼管第3位
- sbit DS4=P1^2;//數(shù)碼管第4位
- unsigned char ScanTime=1;
- unsigned int Num=0;
- //共陰數(shù)碼管段碼表,段接P2.0-2.7,位接P1.0-1.3
- unsigned char code SEG_Tab[]={
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- };
- /*---------------------數(shù)碼管顯示---------------------------------------*/
- void display()
- { //數(shù)碼管初始化
- P2=0x00;//P2=00000000
- P1=0xFF;//P1=11111111
- switch(ScanTime)
- {
- //----------數(shù)碼管第1位--------------
- case 1:
- if(Num==0)
- {
- P2=0x40;
- }
- else
- {
- P2=SEG_Tab[Num/1000];
- }
-
- DS1=0;
- break;
- //-----------數(shù)碼管第2位-------------
- case 2:
- if(Num==0)
- {
- P2=0x40;
- }
- else
- {
- P2=SEG_Tab[Num/100%10];
- }
-
- DS2=0;
-
- break;
- //-----------數(shù)碼管第3位-------------
- case 3:
- if(Num==0)
- {
- P2=0x40;
- }
- else
- {
- P2=SEG_Tab[Num/10%10];
- }
-
-
- DS3=0;
- break;
- //-----------數(shù)碼管第4位-------------
- case 4:
- if(Num==0)
- {
- P2=0x40;
- }
- else
- {
- P2=SEG_Tab[Num%10];
- }
-
- DS4=0;
- break;
- //------------------default---------------
- default: break;
- }
-
- //-----數(shù)碼管循環(huán)------
- ScanTime++;
- if(ScanTime>4)
- {
- ScanTime=1;//循環(huán)掃描
- }
- }
- /*-------------------------------------
- 按鍵掃描
- ---------------------------------------*/
- void keyscan()
- {
- if(K1==0)
- {
- if(flag_KEY==1)//按鍵只響應1次
- {
- flag_KEY=0;
-
- if(Num<999)
- {
- Num++;
- }
- }
- }
- else if(K2==0)
- {
- if(flag_KEY==1)//按鍵只響應1次
- {
- flag_KEY=0;
-
- if(Num>0)
- {
- Num--;
- }
- }
- }
- else if(K3==0)
- {
- if(flag_KEY==1)//按鍵只響應1次
- {
- flag_KEY=0;
-
- if(Num>0)
- {
- Num=0;
- }
- }
- }
- else//按鍵松開
- {
- flag_KEY=1;
- }
- }
- void delay_ms(unsigned int ms)// 延時子程序
- {
- unsigned int a,b;
- for(a=ms;a>0;a--)
- for(b=123;b>0;b--);
- }
- /*-------------------------------------
- 主函數(shù)
- ---------------------------------------*/
- void main()
- {
- P1M1 = 0x00; P1M0 = 0xFF; //P1口推挽模式
- P2M1 = 0x00; P2M0 = 0xFF; //P2口推挽模式
-
- while(1)
- {
- display();
- keyscan();
- delay_ms(10);
- if(Num>=100)
- {
- FMQ=0;
- }
- else
- {
- FMQ=1;
- }
- }
- }
復制代碼 |