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單片機的計數器程序
你得在P3.5引腳外部加計數脈沖信號呀,T1才能計數的。就用你的程序,模擬的結果如下圖,並用數碼管顯示了TL1=1的狀態了。
3. 51單片機c語言脈沖計數並顯示程序
TMOD=0x05;
TH0=0;TL0=0;
TR0=1;
while(1)
{
a=TH0*256+TL0;
display(a);
}
4. 51單片機:利用計數器T1(P3.5)記錄脈沖個數,每計滿100個脈沖,使n++,然後重新計數 用c51程序怎麼寫
1,初始化T1為計數器模式,可以用8位自動重裝,這兒設計到初值的計算,沒計數100次中斷一次
2,寫中斷服務程序,裡面直接n++
5. 51單片機脈沖計數
你好!
那就用外部中斷來檢測吧,速度快精度高
void outside() interrupt 0
{
T0count++;
}
然後將計數,通過液晶顯示出來就可
6. 用C51單片機統計脈沖次數
舉例解答如下:
利用定時器T1,對外部脈沖(P3.5引腳輸入)計數,
每輸入200次脈沖產生一次中斷,累加器+1,
選用T1,計數器模式,方式2(自動重裝初值8位計數器),
TMOD
=0110
0000B
=60H
計數初值
=2^8
-200
=256
-200
=56d
=38H,
匯編程序如下:
;
;
主程序:
MAIN:
CLR
A
;
;
累加器清零
MOV
TMOD,
#60H
;
;置T1計數模式、方式2
MOV
TL1,
#38H
;
;
寫入計數初值
MOV
TH1,
#38H
;
;
寫入留待自動重裝的初值
SETB
TR1
;
;
啟動T1計數
SETB
ET1
;
;
允許T1中斷
SETB
EB
;
;
CPU開中斷
SJMP
$
;
;
等待一輪對外部脈沖計數溢出中斷
;
;
以下是T1中斷處理子程序:
T1_INT:
INC
A
;
;
累加器加1
RETI
;
;
中斷返回
7. 51單片機如何用計數器檢測脈沖信號(高低電平),程序怎麼做!沒有思路!
可以利用51單片機的計數器T0、T1,例如用計數器0的外部計數脈沖輸入端T0計數,當計滿100個脈沖數量後,觸發中斷。進入計數服務中斷程序。
如果有脈沖信號,經過電容微分後,在下降沿會產生一個向下的尖端脈沖,電阻R2是作為一個偏置,當有向下的尖端脈沖來後,反相端的電壓會低於同向端的電壓。
從而比較器輸出高電平,這個電路圖要注意的兩個參數是,1,比較器的選擇,你可以選LM339,要加上拉電阻。
(7)51單片機脈沖計數程序擴展閱讀:
通向輸入端的那兩個電阻是用來產生一個參考電壓的,電容用來微分你的PWM波,你可以用示波器在反向輸入端觀察微分信號。
主程序中可根據不同運行狀態調用部分子函數。需要開機按鍵設置時,優先執行按鍵程序,其它需要設置以後才能運行的子函數暫時不調用,減少單片機被佔用過多。
設置後,不需要按鍵了,就不調用按鍵程序了。如果需要隨時按鍵都要反應,可以把按鍵接到外部中斷上,以中斷方式響應按鍵,不受其他子函數影響。
8. 求51單片機1秒鍾脈沖計數C語言程序
單片機的系統時間為晶振頻率的12分之一,如果晶振是12兆赫茲,那麼單片機最小系統時間就是1us,所以可以用_nop_();指令達到精確延時,這條語句執行1次系統時間,具體的網路下就行了。
至於你說的1s,時間比較長,不適合用定時器,那麼可以用嵌套循環語句,for、while、do while,要注意循環時使用不同的變數類型,所消耗的時間也不同。網路下proteus,這個是能將keil生成的c工程文件進行軟體模擬的一個軟體,和multisim一樣很簡單,裡面有示波器,用示波器看模擬時間,自己用循環和_nop_()指令湊1秒出來就行了
9. 求大神幫忙寫個51單片機的接收脈沖程序。
用計數器T1的中斷控制蜂鳴器發出1KHz音頻
#include<reg51.h> // 包含51單片機寄存器定義的頭文件
sbit sound=P3^7; //將sound位定義為P3.7引腳
/**************************************************************
函數功能:主函數
**************************************************************/
void main(void)
{
EA=1; //開總中斷
ET1=1; //定時器T1中斷允許
TMOD=0x10; //TMOD=0001 000B,使用定時器T1的模式1
TH1=(65536-921)/256; //定時器T1的高8位賦初值
TL1=(65536-921)%256; //定時器T1的高8位賦初值
TR1=1; //啟動定時器T1
while(1)//無限循環等待中斷
;
}
/**************************************************************
函數功能:定時器T1的中斷服務程序
**************************************************************/
void Time1(void) interrupt 3 using 0 //「interrupt」聲明函數為中斷服務函數
{
sound=~sound;
TH1=(65536-921)/256; //定時器T1的高8位重新賦初值
TL1=(65536-921)%256; //定時器T1的高8位重新賦初值
}
改改 就成了你的