當前位置:首頁 » 編程語言 » 52單片機定時計數c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

52單片機定時計數c語言

發布時間: 2023-01-05 08:18:43

㈠ C52單片機輸出1K頻率的程序(c語言)最好可以有如何計算頻率的方法

#include<reg51.h>
//設CPU是時鍾12MHz的8051系列
voidSetupTimer0()
{
TMOD&=0XF0;//僅保留T1信息
TMOD|=0X02;//設置T0:定時功能,方式2,自動重載8位定時器/計數器
TH0=256-250;//每個周期為1us,250us=0.25ms,定時每0.25ms中斷一次
TL0=256-250;//自動重裝,TL0,TH0均置256-250
TR0=1;//開啟定時器
ET0=1;//定時器0中斷打開
}

voidTimer0_ISR()interrupt1//中斷服務程序
{
staticdataunsignedcharus250;
staticdataunsignedcharp1;
if(++us250>=2)
{
us250=0;//每0.25msx2=0.5ms中斷一次。
p1^=1;P1=p1;//p1完成翻轉後輸出到P1,兩次翻轉完成一個周期輸出
}
}

voidmain()
{
dataunsignedcharp1,p2;
SetupTimer0();
EA=1;//全局中斷打開
while(1);//死循環,中斷程序完成波形輸出
}

㈡ 用52單片機C語言編寫程序,實現00~59計時。要求用T0,工作方式1。

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6; //段選
sbit wela=P2^7; //位選
uchar shi,ge,num1,num2; //變數
uchar code table[]={0x3f,0x06,0x5b,0x4f, //共陰極字型碼
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint x) //延時子程序
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void init()
{
TMOD=0x01; //設置定時器0的工作方式
TH0=(65536-50000)/256; //裝初值
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
}
void display() //顯示子程序
{
la=1;
P0=table[ge]; //送段選數據
la=0;
P0=0xff; //送位選數據前關閉所有顯示
wela=1;
P0=0xfe; //送位選數據
wela=0;
delay(5); //延時

la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
void main()
{
init();
while(1)
{
display();
}
}
void timer() interrupt 1
{
TH0=(65536-50000)/256; //重裝初值
TL0=(65536-50000)%256;
num1++;
if(num1==20) //到了20次,1秒時間到
{
num1=0; //清0重新計數
num2++;
if(num2==60)
num2=0;
P1=0x00;
delay(500);
P1=0xff;
shi=num2/10; //把一個2位數分離後分別送數碼管顯示
ge=num2%10; //十位和個位
}
}

試了的,可以放心,採納吧!

㈢ 單片機C語言關於定時計數器程序運行時序問題

這個和你設置的定時器的工作模式有關系,你要在定時時間到後,依然想要TH0=0xfc; TL0=0x18。這兩個寄存器值存在的話,你就要設置定時器的工作模式為:自動重裝初值

㈣ 求單片機定時器簡單程序(C語言)詳解。不勝感激~

用定時器0中斷做流水燈,程序如下:#include<reg52.h>#include<intrins.h> //包含_crol_()循環左移函數
unsigned char temp,count;void init() //初始化函數{ TMOD=0x01;//設置定時器0為工作方式1 TH0=(65536-50000)/256;//裝初值,高8位 TL0=(65536-50000)%256;//裝初值,低8位 EA=1;//開總中斷 ET0=1;//開定時器0中斷 TR0=1;//啟動定時器0 temp=0xfe; count=0;//記數值清0}void main(){ init(); while(1){ P1=temp;}}void timer0() interrupt 1 using 1 //定時器0中斷函數{ TH0=(65536-50000)/256;//重裝初值,同上 TL0=(65536-50000)%256; count++;//計數值加1 if(count==10)//500ms{ count=0;//計數值清0 temp=_crol_(temp,1);循環左移一位}

㈤ 求教,關於52單片機的3個定時/計數器

我認為你這時候就不要用定時器去模擬pwm了,直接找個帶pwm的單片機比這簡單的多。

㈥ 怎樣使52單片機一個定時器定時,另一個同時計數啊,高手出現解決,有程序最好

簡單,有不清楚的來qq共同探討 181325995
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,num;
init()//初始化
{
TMOD=0x15; //T1 定時 ,T0計數,方式1
EA=1;
ET0=1;
ET1=1;
TH0=0;
TL0=0;
TH1=0xb1; //定時20ms
TL1=0xe0;
TR0=1;
TR1=1;
}
void main()
{
init();
while(1)
{
......
}
}
void time0() interrupt 1 //T0計數 接P3^4口
{
TH0=0;
TL0=0;
num++; //計數溢出一次num加1,n次,就是 65526 * num
}
void time1() interrupt 3 //定時20ms 晶振12M
{
TH1=0xb1;
TL1=0xe0;
count++;
if(count==50) // 定時1秒
{
count=0;
。。。 //執行指令
}
}

㈦ 51或者52單片機 基於c語言的 定時器中斷從哪裡開始

TMOD=0x11;//設置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
你的這幾句話,把定時器設置成工作方式1,總的初值是15536,當TR0 = 1的時候,開始計數,一直計到65535之後,再計一個數,變成了0,這個時候,觸發中斷,進到void time0() interrupt 1執行你的中斷函數,
這個時候計數並沒有停止,在你執行中斷函數的過程中,仍然在計數,但是,你在中斷里又把初值寫成了15536,這樣又開始從15536計數,當執行到t++完了之後,本次中斷就退出,然後再次等待執行到65535,再計到0,又引發第二次中斷,然後.....周而復始

㈧ 求基於AT89C52單片機共陰數碼管0到59秒循環計時器c語言代碼

#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedchar/*********************************************************/
u8ds[2];//數碼管顯示緩存

//共陰
codeu8w[]={~0x01,~0x02,~0x04,~0x08}; //位碼
codeu8d[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,};//斷碼
voiddispaly(){//顯示函數
staticu8a;
if(++a>2)a=0;
P0=~0xff;
P2=w[a];
P0=d[ds[a]];
}


/****************************************/
voidinit() //初始化函數
{TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;

}


/***********************************/
u16js_ms=0;
u8count=0; //計數
voidmain()//主函數
{
init();//系統初始化
TR0=1;//定時器開始計時
while(1){
ds[0]=count/10%10;
ds[1]=count%10;
}

}


/****************************/
voidtimer0()interrupt1//1ms定時器
{
TH0=(65536-1000)/256;//重載初值
TL0=(65536-1000)%256;
dispaly();//顯示
if(++js_ms>=1000){
js_ms=0;
if(++count>59)count=0;
}


}

㈨ 請問單片機C語言定時器程序怎麼寫

你看過匯編嗎?與匯編的格式是一樣的。具體就是先開中斷允許標志位(IE裡面對應的各個位)在設定TMOD工作方式。下一步就是設定初始值了(TH、TL)。設置完這些就可以開定時器了。寫中斷中段函數是是需要另加interrupt 加上一個常數(比如是定時器0就在後面加上1)。我用89S52晶元編過一個定時器程序你參考一下,希望對你有一點幫助。
//功能:感應外界溫度並用數碼管顯示
//時間:2005年6月20日
//設計人:
#include<reg52.h>
#define uchar unsigned char
sbit ad0809_oe=P1^0; //定義各個位
sbit ad0809_start=P1^1;
sbit ad0809_ale=P1^2;
sbit ls595_rclk=P1^3;
sbit ad0809_eoc=P1^5;
sbit ls595_oe=P1^4;
sbit ls595_ser=P3^0;
sbit ls595_srclr=P3^1;
uchar nn,mm;
uchar code tab[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};
send(uchar); //聲明函數
AD(uchar);
void display(uchar);
void init();
//********普通口輸入數據*****************
send(uchar shu) //普通口串列輸入
{
unsigned char i,k;
k=0x01;
for(i=0;i<8;i++)
{
if(k==(k&shu)) //判斷每位上是否為1
ls595_ser=1;
else
ls595_ser=0;
k<<=1; //左移一位
ls595_srclr=0; //輸入一個上升沿講數送入595中
ls595_srclr=1;
}
}
//*****************595顯示子程序********************
void display(uchar )
{
uchar ge,shi,flge; //ge拆字後個位的存放處shi拆字後十位的存放處flge ℃的存放處
shi=tab[/10]; //拆字
send(shi); //給595送數
ge=tab[%10];
send(ge);
flge=0xb1;
send(flge);
ls595_rclk=0; //上升沿送出數據
ls595_rclk=1;
}
//*******************初始化程序********************
void init() //初始化AD、定時器
{
ad0809_start=0; //Start管教上升沿將AD內部寄存器清零
ad0809_start=1;
ad0809_ale=1; //ALE高電平選擇通道
nn=0;
mm=0;
TMOD=0x01; //定時器初始化
//IE=0x82;
EA=1;
ET0=1;
TCON=0x00;
TL0=(65536-50000)%256; //定時50ms
TH0=(65536-50000)/256;

}
AD(uchar wen)
{
// unsigned char tt=0;
// ad0809_ale=1; //選擇通道
ad0809_start=1;
ad0809_start=0; //start下降沿啟動轉換信號
while(ad0809_eoc==0); //判斷轉換是否結束
ad0809_oe=1; //轉換結束送出轉換數據
wen=P2;
return (wen);
}

//**************中斷服務程序*********************
void tiam0() interrupt 1 using 1 //中斷服務程序
{
TL0=(65536-50000)%256; //定時50ms
TH0=(65536-50000)/256;
nn++;
if(nn==10) //0.5秒M加一
{
mm++;
nn=0;
}
}

//****************主程序***************************
void main()
{
unsigned char bb,aa,cc; //bb=計算後得到溫度,aa=AD輸出數據
unsigned char wen; //wen存放轉換的得到的數據
init();
// wen=17;
ls595_oe=0;
cc=0;
TR0=1;
while(1)
{
aa=AD(wen);
// ad0809_oe=0;
aa=~aa;
bb=aa/4;
if(mm==2)
{
mm=0;
cc=bb;
}
display(cc); //調用顯示子程序

}
}

㈩ 52單片機製作秒錶問題