⑴ 單片機定時器c程序
你可以設定定時器T0,每50MS中斷一次,中斷一次計數一次,計數20次,剛好1秒,到1秒就把狀態改變就行了。
⑵ 高分求單片機定時器程序
給你改了個,有空到我空間轉轉:
/*******************************************************
C51順序控製程序:
注意:由預處理生成的定時初值有一定的局限性,調試過程中請參考計算工具得出的結果
請到我空間下載「51定時器計算器」
2009-10-02 by yingang2009
********************************************************/
#include<reg51.h>
//*******************************************************
#define Byte unsigned char
#define Word unsigned int
#define DWord unsigned long
//*******************************************************
#define Speed 12 //12 MHz(注意更高就不能一次得到50ms定時了)
#define TTTT 50000 //50ms
#define TH1_Init_Val (65536-Speed * TTTT / 12)/256
#define TL1_Init_Val (65536-Speed * TTTT / 12)%256
sbit L1 = P1^0 ;
sbit L2 = P1^1 ;
sbit L3 = P1^2 ;
sbit L4 = P1^3 ;
sbit L5 = P1^4 ;
sbit L6 = P1^5 ;
sbit L7 = P1^6 ;
sbit L8 = P1^7 ;
//*******************************************************模塊變數
bit flag1s ;
//*******************************************************T1初始化
void T1_Init()
{
TMOD= 0x11;
TH1=TH1_Init_Val ;
TL1=TL1_Init_Val ;
ET1 =1;
EA =1;
TR1 =1;
}
/*******************************************************LED主進程
第一秒鍾L1,L3亮,
第二秒鍾L2,L4亮,
第三秒鍾L5,L7亮,
第四秒鍾L6,L8亮,
第六秒鍾L2,L4,L6,L8亮,
第七秒鍾八個二極體全亮,
第八秒鍾全滅
[可以將P0口各時刻的狀態做個表格,這里就不做了]
********************************************************/
void Led_Run()
{
static Byte step;
if (!flag1s)return; //接收定時器「flag1s」消息,沒到1s返回
flag1s = 0; //1s到則開始工作
step++;
switch(step) //以1s為間隔進行順序控制
{
case 1:
P1 =0xff; //先熄滅
L1 = 0;
L3 = 0;
break;
case 2:
P1 =0xff; //先熄滅
L2 = 0;
L4 = 0;
break;
case 3:
P1 =0xff; //先熄滅
L5 = 0;
L7 = 0;
break;
case 4:
P1 =0xff; //先熄滅
L6 = 0;
L8 = 0;
break;
case 5:
//do nothing 維持第4秒內容
break;
case 6:
P1 =0xff; //先熄滅
L2 = 0;
L4 = 0;
L6 = 0;
L8 = 0;
break;
case 7:
P1 = 0x00; //全亮
break;
case 8:
P1 =0xff; //全滅
step = 0; //步驟復位
break;
default:
step = 0; //具有一定的抗干擾意義
break;
}
}
//*******************************************************主程序
void main()
{
T1_Init();
while(1)
{
Led_Run();
}
}
void ISR_T1() interrupt 3 using 2 //定時器1中斷服務程序50ms
{
static Byte cnt1s;
TH1=TH1_Init_Val ;
TL1=TL1_Init_Val ; //reload val
if (++cnt1s >= 20)
{
cnt1s = 0;
flag1s = 1;
}
}
⑶ 51單片機定時器的匯編語言程序編程,
LED BIT P1.0 ;定義LED的引腳
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H ;定時器0工作模式1
MOV TH0,#HIGH(65536-50000) ;初值,50毫秒中斷一次
MOV TL0,#LOW(65536-50000)
SETB TR0 ;啟動定時器
SETB ET0 ;啟動定時器中斷
SETB EA ;開總中斷
MOV R2,#40 ;中斷計數初始值
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;R2減到0重新賦值,否則退出
MOV R2,#40
CPL LED ;LED亮滅轉換
T0E:
RETI
END
⑷ 單片機定時器程序
每 24 小時輸出 5秒,輸出什麼東西?
4.7k的晶振?有嗎,頻率太低了吧?是4.7M還可能。
8腳的直插 小單片機:STC15系列的單片機就有好幾個型號呢,不用外部晶振,內部有的,也不用外部復位電路,內部也有,非常方便的。
⑸ 怎樣用單片機定時器設計0到9秒的循環程序
#define uint unsigned int
#define uchar unsigned char
#include <reg52.h>
uint i;
uchar code TAB[]=[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(void)
{
TMOD=0x22; /*定時器0設置為工作方式2,基準定時(256-6)/1M=0.25ms*/
TH0 =6; //賦T0的預置值6,溢出4000次就是1秒鍾
TL0 =6;
ET0=1; //打開定時器0中斷
EA=1; //打開總中斷
TR0=1; //啟動定時器
while(1) //程序循環
{
P3=TAB[(i)];//p3送數
}
}
//定時器0中斷
void timer0(void) interrupt 1 using 1
{
static uint t; //注意t的范圍,這里涉及到C51變數取值范圍這個知識點
t++;
if(t==4000) //T0的預置值6,溢出4000次就是1秒鍾,晶振12MHz
{
t=0;
i++;
i=i%10;
}
}
⑹ 單片機 定時器編程
應該比較簡單吧。比如用at89s52,晶振頻率12m
其程序如下:
#include<stdio.h>
#include<reg51.h>
void timer0_init()
{
TMOD=0x01;//方式1
TL0=0xb0;
TH0=0x3c;
TR0=1;
ET0=1;
}
void timer0_ISR(void) interrupt 1
{
TL0=0xb0;
TH0=0x3c;//50ms中斷一次
single++;
if(single==20)
{ kk++;
single=0;
}
}
void main()
{
int kk=0;//計數器
int single=0;
timer0_init();
}
顯示器用個八位口連接七段led就行了。
⑺ 定時器在單片機中程序的運行過程
是這樣的,使用定時器的時候是先對其附個初值,定時器計滿後產生中斷,執行中斷程序。
它計的數是機器周期(也可是外部脈沖)。是由硬體自動完成的
⑻ 單片機定時計數器程序運行過程
程序運行到這里就死循環了,
while
(1)
{
led2
=
0;
}
後邊的代碼是無緣運行的。
程序運行首先從地址0000H開始,跳轉到主程序入口也就是main()那裡開始,所以真正有意義的運行第一條是:
=
0x01;
依次往下執行,到TR0=1;開始定時器開始計數,根據你的賦值,計數到50000之後,定時器0溢出,開始申請中斷,進入中斷服務程序
void
intt0()
interrupt
1
using
2
執行完中斷後返回到主程序,你現在的情況是在while(1)那個死循環之中。
你說的那個while(1)後邊的{
}里邊的程序在執行完TR0=1之後就執行了,並一直在執行到中斷開始。中斷結束後又一直執行下去,一直反復如此。