1、使用T0和T1外部脈沖計數,控制兩個電機,到1700個脈沖電機停止,
--統計脈沖個數,用外部中斷更好。
--T0和T1,留著定時用。
用四個按鍵控制,按鍵1控制電機正轉,按鍵2控制電機反轉,按鍵3控制電機1正轉,按鍵4控制電機2正轉。
2、常式:
#include<reg51.h>
sbitk1=?;//自己定義
sbitk2=?
sbitk3=?
sbitk4=?
sbitDIAN1=?
sbitDIAN2=?
sbitDIAN3=?
sbitDIAN4=?
sbitSEN1=?
sbitSEN2=?
voiddelay(unsignedintx)
{
unsignedintm,n;
for(m=x;m>0;m--)for(n=115;n>0;n--);
}
voidmain(void)
{
TMOD=0x55;
IE=0x8a;
while(1){
if(!k1){
delay(10);
if(!k1){
while(!k1);
TH0=(65536-1700)/256;
TL0=(65536-1700)%256;
SEN1=0;
DIAN1=0;DIAN2=1;
SEN1=1;
TR0=1;
}
}
if(!k2){
delay(10);
if(!k2){
while(!k2);
TH0=(65536-1700)/256;
TL0=(65536-1700)%256;
SEN1=0;
DIAN1=1;DIAN2=0;
SEN1=1;
TR0=1;
}
}
if(!k3){
delay(10);
if(!k3){
while(!k3);
TH1=(65536-1700)/256;
TL1=(65536-1700)%256;
SEN2=0;
DIAN3=0;DIAN4=1;
SEN2=1;
TR1=1;
}
}
if(!k4){
delay(10);
if(!k4){
while(!k4);
TH1=(65536-1700)/256;
TL1=(65536-1700)%256;
SEN2=0;
DIAN3=1;DIAN4=0;
SEN2=1;
TR1=1;
}
}
}
}
2. 51單片機c語言脈沖計數並顯示程序
TMOD=0x05;
TH0=0;TL0=0;
TR0=1;
while(1)
{
a=TH0*256+TL0;
display(a);
}
3. 單片機用c語言編一個程序,要求用內部定時/計數器對30個脈沖進行計數,並同時對這三十個脈沖進行計時。
看了一下你的要求,單片機里有個GATE位的設置如果你懂得用,編這個程序就不難了。下面是我個人按照你要求剛編的程序:
/***********************
功能:內部定時/計數器記錄脈沖個數和這些脈沖通過後所用的時間。
硬體:單片機用AT89c51,12M晶振。
原理:當門控位GATE為「1」時,TR0/1=1,INT0/1才能啟動定時器。
利用這個特性可以測量外部輸入脈沖的寬度。
分析:設外部脈沖由(P3.2)輸入,T0工作於定時方式1(16位計數),
GATE設為1.測試時,應在INT0低電平時,設置TR0為1(避免檢測
到正在進行的脈沖);當INT0為高電平時,就啟動計數,INT0再
次變低時,停止計數。此計數值與機器周期的乘積即為被測正脈
沖的寬度。因晶振為12MHz,機器周期為1us.
************************/
#include <reg51.h>
//sbit INT0=P3^2;//INT0在頭文件里已定義為P3^2口
#define uint unsigned int
uint pulseWidth[30],num;
void init()
{
num=0;
TMOD=0x09;//選擇定時器並設T0為方式1
TH0=0x00; //設計數初會為最大值
TL0=0x00;
}
main()
{
init();
while(1)
{
if(num<30) //記錄30個脈沖
{
while(INT0);//等待INT0變低
TR0=1; //應在INT0低電平時,設置TR0為1
while(!INT0);//等待INT0變高,啟動定時器開始計數
while(INT0); //等待INT0變低,停止定時器開始計數
TR0=0;
pulseWidth[num]=(uint)TL0;
pulseWidth[num]|=(uint)(TH0<<8);
//因機器周期為1us,故pulseWidth數組里存的數目加上單位us,
//即為所求的脈沖寬度
num++;
}
}
}
4. 基於單片機的脈沖定時計數器C語言程序
#include<reg52.h>
unsigned int ui_n = 0;
void main(void)
{
TR0 = 1; //啟動
IE = 0x82;
while(1);
}
void T0_INT(void) interrupt 1
{
ui_n++;
if(ui_n == 7324) ui_n = 0;
}
5. 51單片機對脈沖計數的問題
破題:
「脈沖夠10次,"->既然沒有時間的限制,則推斷應該為連續的10個脈沖。
「點亮一個LED,"->應該有多個LED,每當有連續的十個脈沖,則多點亮一個LED。
"脈沖不夠10次,一切回零,」->沒有脈沖了,或者說脈沖連續不上了,則熄滅所有LED。
」等待下次脈沖計數。"->既然已經開始等待下次脈沖計數了,就說明,在脈沖消失的同時應該熄滅所有燈,不需要繼續向後延續10個周期。
分兩個理解:
一、點亮過程:
從第0秒算起,以4秒為一個周期,至第40秒,如果存在「連續」的十個脈沖,點亮LED1。
繼續計算,至第80秒,如果存存在「連續」的十個脈沖,點亮LED2。
.......以此類推,直至點亮LEDn。
二、熄滅過程:
只要有一次,在4秒的周期內沒有脈沖,則判斷為,不夠十次!
不知道項目是誰給你的,最好還是問問提出者,否則一旦出了問題,你的工作就白做了!
6. 51單片機的計數器程序
為了使T1能夠進行計數,需要在外接P3.5引腳上添加計數脈沖信號。接著,我使用了特定的程序進行模擬,結果顯示在下圖中,通過數碼管顯示了TL1等於1的狀態。
具體來說,這個程序設計的目的是為了實現外部計數脈沖信號的輸入,並通過T1進行計數。當T1接收到計數脈沖信號時,它會根據設定的計數規則進行相應的計數操作。在模擬過程中,我們通過數碼管直觀地展示了TL1的計數值,以便於觀察計數器的工作狀態。
在程序中,我們設置了TL1寄存器的初始值為1,以測試計數器的性能。當外部計數脈沖信號被輸入到P3.5引腳時,T1會根據計數規則進行遞增計數。在模擬結果中,我們可以清晰地看到TL1的計數值變化,從而驗證了計數器的工作效果。
此外,為了確保計數器能夠穩定工作,我們還進行了多次模擬實驗,以驗證程序的可靠性和准確性。通過這些實驗,我們發現該計數器能夠正確地響應外部計數脈沖信號,並且計數結果符合預期。
總之,通過上述程序的實現和模擬,我們成功地驗證了51單片機的計數器功能。這一過程不僅展示了計數器的基本工作原理,還為我們提供了寶貴的經驗,以便在未來開發更復雜的應用程序時,能夠更加靈活地運用計數器功能。
7. 怎麼實現mcs-51單片機對外部脈沖的計數功能
外部脈沖接單片機的外部中斷或2 個定時/計數器都可以計數的。
8. 用單片機對外來脈沖計數(C語言程序)
要設定16位定時讀數器T0或T1,工作方式1、2、3,計數值最大為65536=0xFFFFH,即給高低位分別裝入計數初始值TH0(TH1)=FFH,TL0=FFH,可設為中斷函數,當計數溢出後自動引發中斷,在程序運行時調用即可~
鍵盤設置到處都有,搜一下就行了