日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机计数脉冲

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机计数脉冲 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#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

總結

以上是生活随笔為你收集整理的单片机计数脉冲的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜在线观看免费视频 | 亚洲成年人网站在线观看 | 黄色片网战 | www成人啪啪18软件 | 一区二区日韩电影 | 51调教丨国产调教视频 | 天天操天天舔天天干 | 日韩中文字幕免费 | 日本伦理片在线看 | 强伦人妻一区二区三区 | 另类小说久久 | 亚洲国产一区二区三区四区 | 波多野在线视频 | 日韩av三级在线观看 | 久久免费视频2 | 精品一区亚洲 | 国产成人无码一区二区在线播放 | 国产69精品久久久久久久久久 | 波多野结衣伦理 | 成人综合区 | 又黄又爽又刺激的视频 | 麻豆av电影网 | 国产一区二区三区四区五区 | 国产精品乱码久久久久 | aa一级黄色片 | 国产男男chinese网站 | 精品国产aⅴ一区二区三区四川人 | 欧美精品一区二区在线观看 | 免费视频一二三区 | 99久久综合国产精品二区 | 成人精品久久久午夜福利 | asian性开放少妇pics | 二级黄色录像 | 蜜桃传媒一区二区亚洲 | 久久久黄色片 | 天堂视频免费在线观看 | 嫩草天堂 | 精品国产污污免费网站入口 | 久久久久亚洲av无码专区 | xxx日本黄色| 99re这里 | 久久99精品视频 | 国产视频手机在线 | 亚洲欧美日韩在线播放 | 人人91| 国产亚州av | 黄色大视频 | 欧美a网站| 欧美天天干 | 国产草草影院ccyycom | 丁香激情视频 | 四虎综合网| 色婷婷六月 | 亚洲一区在线视频观看 | 天天色影 | 午夜视频在线观看一区二区 | 爱福利视频一区 | 夜夜久久 | 久久精品国产99国产 | 亚洲精品成人在线 | 色戒电影未测减除版 | 粗大黑人巨茎大战欧美成人 | 国产精品电影在线观看 | 热久久久久久 | 日日拍夜夜拍 | 调教亲女小嫩苞h文小说 | 男ji大巴进入女人的视频 | 狠狠干老司机 | 免费看v片 | 亚洲一区二区三区四区五区午夜 | 亚洲欧美日本在线 | 波多野结衣小视频 | 久久精品无码一区二区三区 | 欧美伊人久久 | 无码人妻精品一区二区蜜桃视频 | jizz日本18| 神秘马戏团在线观看免费高清中文 | 欧美在线天堂 | 91欧美在线| 欧美色综合天天久久综合精品 | 国产精品自产拍高潮在线观看 | 午夜亚洲av永久无码精品 | 欧美一区二区三区四区在线观看 | 黄色一级片在线 | 国产综合图片 | 夫妻黄色片 | 色综合中文 | 久久午夜精品人妻一区二区三区 | 亚洲第三区 | 黄色动漫在线免费观看 | 天天草天天射 | 国产色99 | 久久久久久久久久久久久女国产乱 | 午夜少妇视频 | 亚洲国产中文在线 | 亚洲成年人网站在线观看 | 黄色在线免费观看网站 | 91视频国产精品 | 中文天堂在线资源 |