1. C51單片機定時器和中斷有什麼聯系
定時器是經過多少個周期之後執行什麼程序
中斷是有中斷請求時中斷正在運行的程序,沒有中斷請求時不影響
當有中斷或者中斷優先順序高於正在運行的程序時就產生中斷進入中斷程序
2. c51單片機c語言編程中定時器和中斷的關系,程序如下,坐等!!!
你的定時器中斷進不了吧, 因為你沒開定時器中斷允許位ET0=1
另: 定時器模式設置好後TMOD=0x01, 打開定時器中斷允許ET0=1, 然後TR0=1啟動定時器就可以了
3. 求高手寫 用51單片機C語言 TMOD=0X01 定時一秒的程序
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定時器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中斷一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==20) //中斷20次,1s
{
time=0;
LED=~LED; //P1.0上的LED1s亮或滅一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}
4. 求51單片機c語言程序,使用定時器中斷,當接受的下降沿時,開始定時,定時一分鍾,定時結束後跳出中斷
//假設晶振12MHZ,檢測的是P1.1下降沿
#include "reg51.h"
unsigned int YSJS;
sbit K1 = P1^1;
void main(void)
{
TMOD |= 0X10; //定時器1工作於方式1,16位定時器
TL1 = 0x78; //設置定時初值
TH1 = 0xEC; //定時器1定時時間=5000us
ET1 = 1; //使能定時器1中斷
EA =1; //開總中斷
K1 = 1;
YSJS = 0;
while(1)
{
if(K1==0)TR1 = 1; //啟動定時器1
if(YSJS == 12000) //已定時一分鍾
{
//這里加入你自己定時一分鍾後要做的處理
}
}
}
void TIMER1(void) interrupt 3 //定時器1中斷函數使用默認寄存器組
{
TL1 = 0x78; //設置定時初值
TH1 = 0xEC; //定時器1定時時間=5000us
YSJS++;
if(YSJS==12000) //已定時一分鍾
{
TR1 = 0;關閉定時器1
}
}
5. 51單片機C語言對流水燈編程,用定時中斷做
#include<reg52.h>
#defineucharunsignedchar
ucharm=0,i=0;
voidmain()
{
TMOD|=0x01;//定時器0工作方式為1
TH0=(65536-50000)/256;//裝初值
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器中斷
TR0=1;//開啟定時器
while(1);//等待中斷
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
m++;
if(m==5)//12M晶振定時5*50MS=250MS
{
m=0;
P1=~(0X01<<i);//P1接8個LED
if(++i==8)
i=0;
}
}
[補充]
延時函數是一種粗略計算延時時間的函數
是通過讓單片機執行空指令,達到等待延時的目的。
經常被應用在對延時時間要求不太嚴格的場合。
而定時器中斷,則是通過對晶振時鍾進行計數
由於晶振的頻率一般是很穩定的,所以晶振的脈沖頻率基本穩定
從而通過對脈沖進行計數即可得到准確的延時目的。
中斷延時函數和定時器中斷延時沒有明確的對應關系。
主要是根據你的應用場合來確定使用哪種函數。
6. 定時器延時問題(51單片機,c語言)
你的這兩個函數void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告訴你,沒有問題。你的這個程序其實就是想顯示0000~5959之間的數,而且這個數是每20秒+1順序遞增的。之所以沒有任何反應,那是你的主程序沒有掛起,也就是在while(1)里沒有沒有大括弧,程序執行一次就結束了,所以你什麼都看不到。應該這樣
while(1)
{//加入的成對大括弧
for(thou=0;thou<=5;thou++) //千位
for(hun=0;hun<=9;hun++) //百位
for(ten=0;ten<=5;ten++) //十位
for(one=0;one<=9;one++) //個位
{
while(num!=20) //循環一秒
{
display(thou,hun,ten,one);//數碼管顯示四個數字
}
num=0;
}
}
這樣你就可以看到程序運行的結果了,但結果是這樣的:四個LED顯示管閃得很嚴重,計劃是一亮一滅的,而且0000~5959這個數字幾乎顯示得不成樣子。主要是delayms(5),這個延遲程序你應該盡量控制在20ms之內(主要是人眼殘輝的時間極限),短了感覺就全亮,長了就一閃一滅。
不過我很看不慣你的這個程序,我給你一個CPU負擔更小,而顯示又非常好的程序供你參考:
#include<AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit LED4=P2^0; //數碼管千分位
sbit LED3=P2^1; //數碼管百分位
sbit LED2=P2^2; //數碼管十分位
sbit LED1=P2^3; //數碼管個分位
uchar ms20,s1;//20毫秒和1s變數定義(聲明)
//定時器T0初始化,10ms秒初值
void InitTimer0(void)
{
TMOD=0x01;
TH0=0x0D8;
TL0=0x0F0;
EA=1;
ET0=1;
TR0=1;
}
void Display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)
{
static uchar k;
P2=P2|0xf0;
switch(k++)
{
case 0:
P0=dat4;
LED4=1;
break;
case 1:
P0=dat3;
LED3=1;
break;
case 2:
P0=dat2;
LED2=1;
break;
case 3:
P0=dat1;
LED1=1;
break;
default:k=0;return;
}
}
void Timer0(void) interrupt 1//1ms中斷
{
TH0=0x0D8;
TL0=0x0F0;
ms20++;
s1++;
}
void Main(void)
{
uchar thou,hun,ten,one;
InitTimer0();
while(1)
{
if(s1>=100)//每1秒鍾one+1
{
s1=0;
if(one++>=9)
{
one=0;
if(ten++>=5)
{
ten=0;
if(hun++>=9)
{
hun=0;
if(thou++>=5) thou=0
}
}
}
}
if(ms20==2)//每20毫秒調用一次顯示函數
{
Display(thou,hun,ten,one);
ms20=0;
}
}
}
7. 51單片機c語言定時器控制流水燈
#include //51系列單片機定義文件
#define uchar unsigned char //定義無符號字元
#define uint unsigned int //定義無符號整數
void delay(uint); //聲明延時函數
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0xFE;
for(i=0;i<8;i++) //8個流水燈依次全部點亮
{
P1=temp;
delay(500); //調用延時函數
temp<<=1;
}
}} void delay(uint t) //定義延時函數
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
8. 51單片機C語言定時器定時2小時燈亮2小時燈滅,如此循環!
如果想實現無限循環那就採用死循環方式,可以無限的循環如while(1){};然後設定定時器定時時間為1s(此值需要根據單片機確定是否可以設定這么大),其次,設定一個變數對時間進行計數,根據計數情況做出相應的改變,程序可以這樣設定:
unsigned char gucLEDStatus = 0x00; //全局變數,表示燈當前的狀態 0為滅,1為亮
volatile unsigned int gusTimeCnt; //全局變數對時間計數
int main()
{
//增加定時器初始化並開放中斷
while(1)
{
if(gucLEDStatus == 0x01) //當前為亮狀態
{
if(gusTimeCnt >= 7200) //兩個小時時間到
{
gusTimeCnt = 0x00; //清零
gucLEDStatus = 0x00; //燈為滅狀態
//此處加程序代碼,控制燈為滅的狀態
}
else
{
//此處加程序代碼,控制燈為亮的狀態,此處會重復執行,可以進行控制
}
}
else if(gucLEDStatus == 0x00) //燈為滅的狀態
{
if(gusTimeCnt >= 3600) //1個小時
{
gusTimeCnt = 0x00;
gucLEDStatus = 0x01; //亮狀態
//增加程序代碼,控制燈亮
}
else
{
//增加程序代碼,控制燈滅,此處會重復執行,可以進行控制
}
}
}
return 0;
}
在中斷函數中,對gusTimeCnt進行遞增即可!
9. c編程時,51單片機怎麼用定時器寫一個延時1ms的子函數
好辦
用C51,方式一
void delay(unsigned int T) //T的單位取微秒
{
signed int cnt; //這里用符號數的相反數 就是2^16-n的原碼,也可以定義無符號數自己換成2^16-n
cnt=-(fosec*1.0/12)*T; // fosec的單位MHz
TMOD=0x01;
TH0=(unsigned char)(cnt>>8);
TL0=(unsigned char)cnt;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;//加這句是為了可以循環使用
}
10. 如何用51單片機做能定6小時的定時器要c語言程序
51單片機一次最大隻能定時65536us,你算一下,要定時多少次。