单片机计数脉冲
#include <pic.h>
__CONFIG(0x3004);//(0X30C4);
#define T0_40MS 100? ? // 定義 TMR0 延時10MS 的時間常數
#define T1_100MS 40536
#define? ? ? ? DN? ? ? ? ? ? ? ? ? ? ? ? RA5? ? ? ? //Motor rise ? ? ? ? ? ? ? ? 2? ? ? ? DN
#define? ? ? ? UP? ? ? ? ? ? ? ? ? ? ? ? RA0? ? ? ? //Motor decline? ? ? ? ? ? ? ? 13??UP
#define? ? ? ? MOTA? ? ? ? ? ? ? ? RC5? ? ? ? //Motor Forward? ? ? ? ? ? ? ? 5
#define? ? ? ? MOTB? ? ? ? ? ? ? ? RC4? ? ? ? //Motor Reversal? ? ? ? 6
bit rise;? ? ? ? //正反轉標志位
bit tmrl;? ? ? ? //正反轉標志位
bit tmrh;? ? ? ? //正反轉標志位
unsigned int num;??//脈沖總個數
unsigned int cnnt; //脈沖計數
unsigned int timerl; //TMR1脈沖上升沿時間
unsigned int timerh; //TMR1脈沖下降沿時間
unsigned int cnnt_timer;//TMR1脈沖總時間
unsigned int cnnt_tmr2;? ? ? ? //TMR2脈沖總時間
unsigned int signal_key();
unsigned int getkey() ;
void Delay_MS(unsigned int t);
void initial()
{
? ? ? ? TRISA=0x3D;//3D;RA2=1,
? ? ? ? TRISC=0X0E;
? ? ? ? OPTION=0x87;//RA2內部中斷時源
? ? ? ?
? ? ? ? INTCON=0xF0;//外圍中斷允許
? ? ? ? CMCON0 = 0X07;
? ? ? ? ANSEL = 0;
//? ? ? ? TMR0=T0_40MS;//啟動TMR0自帶振蕩器,分頻比為1:256
? ? ? ? T1CON=0X22;//2啟動TMR1自帶振蕩器,分頻比為1:4關閉TRM1ON=0;
? ? ? ? TMR1H=T1_100MS>>8;//0X80;? ? ? ???//設初值
? ? ? ? TMR1L==T1_100MS;//0X00;
? ? ? ? TMR1IE=1;? ? ? ???//TMR1中斷允許
? ? ? ? T2CON=0x63;??//TMR2 預分頻系數為1:16 ,后分頻系數為1:13,開始工作??關閉TRM2ON=0;
? ? ? ? PR2=239;? ?//TMR2的溢出值,當 TMR2 為此值+1時溢出
? ? ? ? TMR2IE=1;? ? ? ???//TMR1中斷允許??50MS
? ? ? ? cnnt=0;
? ? ? ? cnnt_timer=0;
? ? ? ? num=10;
}
void Delay_MS(unsigned int t)
{
? ? ? ? unsigned int a,b;
? ? ? ? for(a=t;a>0;a--)
? ? ? ? for(b=110;b>0;b--);
}
void Forward()
{
? ? ? ? rise=1;
? ? MOTB=1;? ? ? ?
? ? ? ? MOTA=0;
? ? ? ? signal_key();
}
void Reversal()
{
? ? ? ? rise=0;
? ? ? ? MOTB=0;
? ? ? ? MOTA=1;
? ? ? ? signal_key();
}
void Stop()
{
? ? ? ? MOTA=0;
? ? ? ? MOTB=0;
}
unsigned int getkey()
{
? ? ? ? if(!UP)
? ? ? ? {
? ? ? ? ? ? ? ? while(!UP)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if(cnnt==num){Stop();break;}
? ? ? ? ? ? ? ? ? ? ? ? Forward();
? ? ? ? ? ? ? ? }
? ? ? ? }? ? ? ?
? ? ? ?
? ? ? ? if(!DN)
? ? ? ? {
? ? ? ? ? ? ? ? while(!DN)
? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? if(cnnt==0){Stop();break;}
? ? ? ? ? ? ? ? ? ? ? ? Reversal();? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? }
? ? ? ? }
? ? ? ?
? ? ? ? while(DN&&UP)
? ? ? ? {
? ? ? ? ? ? ? ? tmrh=0;
? ? ? ? ? ? ? ? tmrl=0;
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ?
}
unsigned int signal_key()
{
//----------------------??信號下降沿檢測??--------------------------//
? ???? ? ? ? while(!RA2)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//再次確認信號,沒有按下信號則退出
? ?? ???{
? ? ? ? ? ? ? ? ? ? ? ? tmrh=0;
? ? ? ? ? ? ? ? ? ? ? ? if(tmrl) break;
? ? ? ? ? ? ? ? ? ? ? ? tmrl=1;
? ? ? ? ? ? ? ? ? ? ? ? RA1=0;
? ? ? ? ? ? ? ? ? ? ? ? INTF=0;? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? TMR1ON=0;
? ? ? ? ? ? ? ? ? ? ? ? TMR2ON=1;
? ? ? ? ? ? ? ? ? ? ? ? if(TMR2IF==1)//檢測是否50MS錯誤信號,停止運行
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TMR2ON=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TMR2IF=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PR2=239;? ? ? ???//設初值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Stop(); //停止電機運行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? }
//----------------------??信號上升沿檢測??--------------------------//
? ? ? ? ? ? ? ? while(RA2)
? ? ? ? ? ? ? ? {? ?
? ? ? ? ? ? ? ? ? ? ? ? tmrl=0;? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? if(tmrh) break;
? ? ? ? ? ? ? ? ? ? ? ? tmrh=1;
? ? ? ? ? ? ? ? ? ? ? ? TMR2ON=0;
? ? ? ? ? ? ? ? ? ? ? ? INTF=1;
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? if(TMR1IF==1)//檢測是否100MS錯誤信號,停止運行
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TMR1ON=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TMR1IF=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TMR1H=T1_100MS>>8;//0X80;? ? ? ???//設初值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TMR1L=T1_100MS;//0X00;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Stop(); //停止電機運行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
//----------------------? ?取出上升沿脈沖信號時間??--------------------------//
? ? ? ? ? ? ? ? if(TMR1ON==0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? timerh=TMR1H;
? ? ? ? ? ? ? ? ? ? ? ? timerl=TMR1L;
? ? ? ? ? ? ? ? ? ? ? ? cnnt_timer = timerh<<8;
? ? ? ? ? ? ? ? ? ? ? ? cnnt_timer += timerl;
? ? ? ? ? ? ? ? ? ? ? ? TMR1IF=0;
? ? ? ? ? ? ? ? ? ? ? ? TMR1H=T1_100MS>>8;//0X80;? ? ? ???//設初值
? ? ? ? ? ? ? ? ? ? ? ? TMR1L=T1_100MS;//0X00;? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? }
//----------------------??取出下降沿脈沖信號時間??--------------------------//
? ? ? ? ? ? ? ? if(TMR2ON==0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? cnnt_tmr2 = TMR2;
? ? ? ? ? ? ? ? ? ? ? ? TMR2IF=0;
? ? ? ? ? ? ? ? ? ? ? ? PR2=239;? ? ? ???//設初值? ? ? ?
? ? ? ? ? ? ? ? }
}
void interrupt ISR(void)
{
? ? ? ? if(INTF==1)? ? ? ? //脈沖開始計數,同時開啟TMR1上升降計時
? ? ? ? {
? ? ? ? ? ? ? ? INTF=0;
? ? ? ? ? ? ? ? RA1=1;
? ? ? ? ? ? ? ? if(rise) cnnt++;
? ? ? ? ? ? ? ? else cnnt--;? ? ? ?
? ? ? ? ? ? ? ? TMR1ON=1;
? ? ? ? }
? ? ? ? if(? ? ? ? TMR1IF==1)
? ? ? ? {
? ? ? ? ? ? ? ? TMR1IF=0;
? ? ? ? ? ? ? ? TMR1H=T1_100MS>>8;//0X80;? ? ? ???//設初值
? ? ? ? ? ? ? ? TMR1L=T1_100MS;//0X00;
? ? ? ? }
? ? ? ? if(? ? ? ? TMR2IF==1)
? ? ? ? {
? ? ? ? ? ? ? ? TMR2IF=0;? ? ? ?
? ? ? ? ? ? ? ? PR2=239;? ? ? ???//設初值? ? ? ?
? ? ? ? }
}
void main()
{
? ? ? ? initial();
? ? while (1)
? ? {
? ? ? ? ? ? ? ? getkey();? ???
? ? ? ? }? ? ? ?
}
?
/************************************************************************************
跳線設置:J7第一腳通過杜邦線連接到單片機?? ?P3.4(T0)
效果:轉動RP1精密電位器就可看到數碼管上顯示的ne555此時的頻率值
晶振:12MHz?? ??? ??? ??? ??? ??? ??? ??? ??? ?\
/?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?\
/?? ?4. 程序設計內容 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?\
/?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?\
/?? ?(1). 定時/計數器T0和T1的工作方式設置,由圖可知,T0是工作在計數狀態下,?? ??? ??? ??? ??? ?\
/?? ??? ??? ?對輸入的頻率信號進行計數,但對工作在計數狀態下的T0,?? ??? ??? ??? ??? ??? ??? ??? ? \
/?? ???????? 最大計數值為fOSC/24,由于fOSC=12MHz,因此:T0的最大計數頻率為250KHz。
/?? ??? ??? ?對于頻率的概念就是在一秒只數脈沖的個數,即為頻率值。?? ??? ??? ??? ??? ??? ??? ??? ?? \
/?? ??? ??? ?所以T1工作在定時狀態下,每定時1秒中到,就停止T0的計數,?? ??? ??? ??? ??? ??? ??? ??? ??? \
/?? ??? ??? ?而從T0的計數單元中讀取計數的數值,然后進行數據處理。送到數碼管顯示出來。 ?? ??? ??? ??? ?\
/?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? \
/?? ?(2). T1工作在定時狀態下,最大定時時間為65ms,達不到1秒的定時,?? ??? ??? ??? ??? ??? ??? ??? ?? \
/?? ??? ??? ?所以采用定時50ms,共定時20次,即可完成1秒的定時功能。?? ??? ??? ??? ??? ??? ??? ??? ??? ??? \
*********************************************************************************************************/
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long?? ??? ??? //(共陰)
sbit DUAN=P2^6;???? //74HC573的LE端? U5? LED的段選端
sbit WEI=P2^7;????? //74HC573的LE端? U4? LED的位選端
uchar code dispbit[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};?? ?// 定義位選
uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//定義段碼
uchar dispbuf[8]={0,0,0,0,0,0,0,0}; //顯示緩沖
uchar temp[8];
uchar dispcount;
uchar T0count;//T0計數
uchar timecount;//時間計數
bit flag;
ulong x;
void main(void)
{
?? ?TMOD=0x15;
?? ?TH0=0;
?? ?TL0=0;
?? ?TH1=(65536-4000)/256;
?? ?TL1=(65536-4000)%256;
?? ?TR1=1;
?? ?TR0=1;
?? ?ET0=1;
?? ?ET1=1;
?? ?EA=1;
?? ?while(1)
?? ?{
?? ??? ?uchar i;
?? ??? ?if(flag==1)
?? ??? ?{
?? ??? ??? ?flag=0;
?? ??? ??? ?x=T0count*65536+TH0*256+TL0;
?? ??? ??? ?for(i=0;i<8;i++)
?? ??? ??? ?{
?? ??? ??? ? temp[i]=0;
?? ??? ??? ?}
?? ??? ??? ?i=0;
?? ??? ??? ?while(x/10)
?? ??? ??? ?{
?? ??? ??? ??? ?temp[i]=x%10;
?? ??? ??? ??? ?x=x/10;
?? ??? ??? ??? ?i++;
?? ??? ??? ?}
?? ??? ??? ?temp[i]=x;
?? ??? ??? ?for(i=0;i<6;i++)
?? ??? ??? ?{
?? ??? ??? ??? ?dispbuf[i]=temp[i];
?? ??? ??? ?}
?? ??? ??? ?timecount=0;
?? ??? ??? ?T0count=0;
?? ??? ??? ?TH0=0;
?? ??? ??? ?TL0=0;
?? ??? ??? ?TR0=1;
?? ??? ?}
?? ?}
}
void t0(void) interrupt 1 using 1//T0工作在計數狀態下,T0的最大計數頻率為250KHz
{
??? T0count++;
}
void t1(void) interrupt 3 using 2
{
?? ?TH1=(65536-4000)/256;
?? ?TL1=(65536-4000)%256;
?? ?timecount++;
?? ?if(timecount==250)
?? ?{
?? ??? ?TR0=0;
?? ??? ?timecount=0;
?? ??? ?flag=1;
?? ?}
?? ?DUAN=1;
?? ?P0=dispcode[dispbuf[dispcount]];
?? ?DUAN=0;
??? ?
?? ?WEI=1;
?? ?P0=dispbit[dispcount];
?? ?WEI=0;
?? ?dispcount++;
?? ?if(dispcount==8)
?? ?{
?? ??? ?dispcount=0;
?? ?}
} ?
?
轉載于:https://www.cnblogs.com/zym0805/p/6229800.html
總結
- 上一篇: python基础学习笔记2
- 下一篇: 深圳锦弘霖是一清机吗