⑴ 51單片機中用定時器怎麼樣控制頻率
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
sbit beep=P2^3;
uchar num=0,times=0;
uint flag,tt;
uint freq[]={4000,400,80,40,20,10,5,4}; //1Hz~1KHz
void main() //主函數
{
beep=0;
TMOD=0x12;//設置定時器0,定時器1為工作方式1
TH0=(256-125);
TL0=(256-125);
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
ET1=1;
TR1=1;
TR0=1;//啟動定時器0
while(1);//等待中斷產生
}
void timer0() interrupt 1 //定時器0中斷
{
tt++;
if(tt>=freq[num])
{
tt=0;
beep=~beep;
}
}
void timer1() interrupt 3
{
times++;
if(times>=40)
{
times=0;
num++;
num&=8;
}
}
⑵ 單片機時鍾頻率12MHZ,計算定時2ms所需定時器初值
1、「T計數=12/12=1μs」,分子是機器周期,分母是12M。所以才是1μs。
2、得看定時器是加還是減,還有是多少位的(即確定定時范圍)
比如:定時器是加的,范圍是000000-FFFFFE,這個只要FFFFFE-7D0=FFF82E(H)
定時器是減的,范圍是000000-FFFFFE,這個只要000000+7D0=0007D0(H)
7D0(2000)*1μs=2ms
⑶ 單片機中 定時器/計數器 的計數初值是怎麼計算得出的(計數和定時計算方式是否不同)--初學單片機
計數初值的計算:
定時或計數方式下計數初值如何確定:定時器選擇不同的工作方式,不同的操作模式其計數值均不相同。若設最大計數值為M,各操作模式下的M值為:
模式0:M=2^13=8192
模式1:M=2^16=65536
模式2:M=2^8=256
模式3:M=256,定時器T0分成2個獨立的8位計數器,所以THO、TLO的M均為256。
因為MCS-51的兩個定時器均為加1計數器,當初值到最大值(00H或0000H)時產生溢出,將TF位置1,可發出溢出中斷,因此計數器初值X的計算式為:X=M-計數值。
式中的M由操作模式確定,不同的操作模式計數器的長不相同,故M值也不相同。而式中的計數值與定時器的工作方式有關。
1、計數工作方式時
計數工作方式時,計數脈沖由外部引入,是對外部沖進行計數,因此計數值根據要求確定。其計數初值:X=M-計數值。
2、定時工作方式時
定時工作方式時,計數脈沖由內部供給,對機器周期進行計數,計數脈沖頻率fcont=fosc*1/12、計數周期T=1/fcont=12/fosc定時工作方式的計數初值X等於:
X=M-計數值=M-t/T=M-(fosc*t)/12
式中:fosc為振盪器的振盪頻率,t為要求定吋的時間。
(3)單片機定時器的頻率擴展閱讀:
定時器工作方式的設定:
定時器有兩種工作方式:定時和計數。由TMOD的D6位和D2位決定,其中D6位決定T1的工作方式,D2位決定T0的工作方式。值為0時工作在定時方式,值為1時工作在計數方式。並且有四種操作模式:
1、模式0:13位計數器,TLi只用低5位。
2、模式1:16位計數器。
3、模式2:8位自動重裝計數器,THi的值在計數中不變, TLi 溢出時,THi中的值自動裝入TLi中。
4、模式3:T0分成2個獨立的8位計數器,T1停止計數。
⑷ 單片機中用定時器 和計數器來求頻率 計算公式是怎麼寫的
用定時器來及頻率,你只需將定時器定時為1秒,1秒內的脈沖個數就是頻率了。如果你一定要公式,非常簡單,用計數器計到的脈沖個數除以定時時間就是頻率了。其中定時器每計一次的時間是晶振的十二分之一,例如,12M晶振就是(12*10^6)*(1/12)=1us.
⑸ 設80C51單片機晶振頻率為12MHZ,定時器作計數器使用時,其最高的輸入計數頻率應為
最高的輸入技術頻率應為500khz。
計算方法:
確認一次記數,即一次負跳變,需要2個機器周期,即24個時鍾周期或震盪周期,則最高記數頻率為12M/24=500khz。
或者按照時間計算,晶振頻率12M的2個機器周期即2us,那麼頻率就是1/2*10^6=500khz,結果相同。
(5)單片機定時器的頻率擴展閱讀:
80C51單片機的嵌入式原理:
梯形圖語言可以「一句頂一萬句」,也可以「一句頂一句」。比如把一個位元組或字從一個地址移動到另一個地址,這實際和匯編語言的一條指令等同。因此梯形圖也可以作為普通的程序開發語言使用。
嵌入式軟體的開發平台使用梯形圖語言的其他功能和PLC類似, 便於「計算機外行」來編程,梯形圖語言在處理計算、字元等方面顯然落後於其他的軟體開發系統。沒有必要迴避梯形圖編程語言的這些缺點。這也是有一利必有一弊。
誠然,用開發平台提供指令(元件)也能完成嵌入式系統的編程,但一般不提倡這么做。用梯形圖語言編程,應盡量使用系統提供的代碼,盡量少的自己編程,讓絕大多數代碼由系統提供。這樣即提高了效率,降低了成本,也保證了程序運行的可靠性。
使用「一句頂一句」編程時,是沒有辦法的辦法。當然,必要時,也必須使用。這也增加的編程的靈活性和擴大了平台的使用范圍。
其實我們把各種處理方式使用C語言、匯編語言或其他語言事先編好,放在平台中供給客戶使用。客戶使用梯形圖語言編程,實際都是調用這些用其他語言編好的模塊而已。
參考資料來源:網路-80C51
⑹ 51單片機用定時器計數器測量頻率
定時器1對外部脈沖計數時TMOD高4位設置應該是5
因此TMOD=0x51;
以下我的頻率計程序:
#include <reg52.h>//因沒用到STC12C5410專有特殊功能寄存器,此處用52或51的頭文件均可
#define unit unsigned int
#define uchar unsigned char
//定義以I/O口的功能
sbit beiguang=P3^2;//液晶屏背光
sbit rs=P1^3;//液晶屏寫選擇,0命令 1數據
sbit rw=P1^4;//液晶屏讀寫選擇
sbit lcden=P1^5;//液晶屏使能
sbit fm=P1^7;//蜂鳴器
#define db P2 //定義P2為數據輸出口,寫數據時用db代替P2,增加液晶屏程序的通用性
//更改硬體接線時,只更改此處,而不必去更改液晶屏讀寫子程序
uchar aa,bb,cc;//變數聲明
unit dd,ee;
void Delay1ms(unsigned int i) //1ms延時程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化設置
{
TMOD=0x15;//定時器0作為計數器,定時器1作為定時器用
TH0=0;//計數器清0
TL0=0;
EA=1;//開總中斷
ET1=1;//允許定時器1中斷
TH1=0x4c;
TL1=0x5c;
TR0=1;//啟動計數器
TR1=1;//啟動定時器
aa=0;
}
void write_com(uchar com)//向液晶屏寫命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏寫數據
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
beiguang=0;
rw=0;
write_com(0x38);
Delay1ms(10*12);
write_com(0x0f);
Delay1ms(10*12);
write_com(0x06);
Delay1ms(10*12);
write_com(0x01);
Delay1ms(10*12);
}
void display4(unsigned int number) //單行多位顯示程序
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分離出萬,千,百,十,個,對於int型數據,最大不超過65535
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1個數據的位置設定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//寫數據
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
write_com(0x87);//第6個數據'H'的位置,中間空85和86 二格
write_date('H');
Delay1ms(10);
write_date('z');
Delay1ms(10);
}
void main()//主程序很簡單
{
init();//初始化
while(1)//循環程序
{
dd=bb*256+cc;//0.5S的計數值
ee=2*dd;//換算為1秒鍾的計數值
if(aa==1)
{
if(TH0>12)//預判斷,50ms內TH0>12,1s內計數值將超過可計數的最大值65535
fm=0;//報警
}
display4(ee);//顯示
fm=1;//報警停止
}
}
void timer1()interrupt 3//注意:定時器1的中斷序號為3
{
aa++;
TH1=0x4c;//11.0592Mhz
TL1=0x5c;
if(aa==10)//中斷10次,共0.5S
{
TR0=0;//暫停計數
aa=0;
bb=TH0;//讀出計數器數據
cc=TL0;
TL0=0;//計數器清0
TH0=0;
TR0=1;//重新啟動
}
}
⑺ 單片機的定時器0工作在方式1,晶振頻率為12MHZ,要實現定時20ms,定時器的計數初值是多少
定時器計數脈沖頻率是1 MHZ,周期是1us,因此20ms是20000個脈沖
因此初值是65536-20000
高8位上的1代表256,因此高8位裝的256倍數
TH0=(65536-20000)/256;
低8位裝的是不足256部分;
TL0=(65536-20000)%256;
⑻ 時鍾頻率為12MHZ, 如何利用51單片機定時/計數器定時500ms
我說一下原理
12MHZ的51單片機,定時器最大隻能定時65.535ms,所以要定時500ms的時間,
需要產生10次50ms的定時。
步驟如下:
1、每隔50ms定時器中斷溢出,計數+1。
2、當計數達到10次時,便產生了500ms的定時啦,然後,你自己根據你的設計,需要讓單片機做什麼就自己寫些什麼(比如讓某個io口取反)
3、計數達到10次後,不要忘了初始化計數。
最後給點建議:1、要讓定時器計數50ms,只能在定時器的工作方式1下進行;
2、定時器初值: TH0 = 0x3C; TL0 = 0x0B0;(我使用的是定時器0)
思路和原理都給你了,只要你看懂了,想讓計時器計時多少s都如魚得水。
⑼ 單片機的系統晶振頻率6MHz,,要求定時值為10ms,定時器T0工作在方式1時,其初值是多少TM
定時值為10ms時,定時器T0工作在方式1時,定時器T0對應的初值是1388H
TMOD的值是00000001B,TH0=13H;TL0=88H。
晶振頻率為6M,則機器周期為2us,定時10ms,溢出值為5000,TMOD可以設置為方式0或者1,一般設置為1,初始設置如下:
TMOD=0x01
TH0=(65536-5000)/256
TL0=(65536-5000)%256
(9)單片機定時器的頻率擴展閱讀:
初值定理適用於右邊序列,即適用於k<M(M為整數)時f(k)=0的序列。它用於由象函數直接求得序列的初值f(M),f(M+1),…,而不必求得原序列。
初值定理使用條件是要求連續函數f(t)不含沖擊函數δ(t)及其各階導數,或者象函數F(s)為真分數。當象函數為真分式時,根據初值定理可直接由象函數得出函數的初值。
⑽ 請教如何用51單片機的一個定時器計算三路開關量輸入的頻率
方案1:51的定時器定時時間不長,為了解決這一問題,可以設置一全局變數(假設你用c編程序)作計數器,等到定時中斷發生時中斷函數給這一全局變數加一,在主程序中判斷這一變數的大小,從而推算出定時時間。譬如說,定時器設置成0.5秒中斷一次,中斷時給變數t加一,那麼當t等於16時,就是8秒了。這種方案的缺點是必須在中斷函數中加入給變數加一的額外語句,使得定時出現誤差,但是也能通過減少定時器的定時時間來補償,不過計算較麻煩,而且不便於精確定時。
方案2:使用低頻的晶振或低頻外部震盪。有些型號的單片機支持0至12mhz的震盪頻率,只要頻率足夠低絕對能夠在定時器最大定時時間內產生出想要的脈沖。這種方案是以犧牲單片機的運行速度為前提的,不過要是做一些簡單控制的話,倒是一種不錯的選擇。