A. 用c語言編寫,單片機LED燈並用定時器延時,每隔0.5秒使LED依次點亮
#include"reg51.h"
sfrAUXR=0x8e;//如果是用的AT89C51,把這句刪了
sbitled=P1^0;//定義LED為P10,可以改為其他IO
unsignedcharjishi;
voidTimer0Init(void)//50毫秒@12.000MHz
{
AUXR&=0x7F;//定時器時鍾12T模式
TMOD&=0xF0;//設置定時器模式
TL0=0xB0;//設置定時初值
TH0=0x3C;//設置定時初值
TF0=0;//清除TF0標志
TR0=1;//定時器0開始計時
EA=1;//開總中斷
}
voidmain()
{
Timer0Init();//初始化定時器
while(1);
}
voidtm0_isr()interrupt1//50毫秒中斷一次
{
jishi++;
if(jishi>10)//中斷十次之後
{
jishi=0;//重置計時
led=!led;//取反LED狀態。
}
}
B. C語言 編一段定時器0延時一分鍾的程序
試試用sleep函數:
函數名: sleep
功 能: 執行掛起一段時間
用 法: unsigned sleep(unsigned seconds);
C. 怎麼用C語言寫可以調節的延時程序,請大俠幫忙
延時程序(包括asm和C程序,都是我在學單片機的過程中用到的),在單片機延時程序中應考慮所使用的晶振的頻率,在51系列的單片機中我們常用的是11.0592MHz和12.0000MHz的晶振,而在AVR單片機上常用的有8.000MHz和4.000MH的晶振所以在網上查找程序時如果涉及到精確延時則應該注意晶振的頻率是多大。
軟體延時:(asm)
晶振12MHZ,延時1秒
程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0:DJNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2:DJNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 70H,LOOP4
定時器延時:
晶振12MHZ,延時1s,定時器0工作方式為方式1
DELAY1:MOV R7,#0AH ;;晶振12MHZ,延時0.5秒
AJMP DELAY
DELAY2:MOV R7,#14H ;;晶振12MHZ,延時1秒
DELAY:CLR EX0
MOV TMOD,#01H ;設置定時器的工作方式為方式1
MOV TL0,#0B0H ;給定時器設置計數初始值
MOV TH0,#3CH
SETB TR0 ;開啟定時器
HERE:JBC TF0,NEXT1
SJMP HERE
NEXT1:MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R7,HERE
CLR TR0 ;定時器要軟體清零
SETB EX0
RET
C語言延時程序:
10ms延時子程序(12MHZ)
void delay10ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
1s延時子程序(12MHZ)
void delay1s(void)
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
200ms延時子程序(12MHZ)
void delay200ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
500ms延時子程序程序: (12MHZ)
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
下面是用了8.0000MHZ的晶振的幾個延時程序(用定時0的工作模式1):
(1)延時0.9MS
void delay_0_9ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xfd;
TL0=0xa8;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(2)延時1MS
void delay_1ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xfd;
TL0=0x65;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(3)延時4.5ms
void delay_4_5ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xf4;
TL0=0x48;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
D. c語言中,一般用定時器的簡單的延時怎麼樣實現
用定時器只有中斷啊,你可以弄50ms中斷 100ms中斷。你要簡單的延遲,延遲函數就夠了
delay(int x) //x毫秒延遲函數
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++); 大概是1ms,准確還是要中斷
}
E. 單片機C語言延遲程序
下面的延時的基本程序(中斷加計數器)
********
void
T0_int(void)
interrupt
1
{
TH0
=
0x4C;
//重新裝載,50MS定時器初值
TL0
=
0x00;
T0_count++;
if(T0_count==20)
//1S到
{
T0_count
=
0;
//在這寫程序
}
}
main()
{
TMOD
=
0x01;//定時器0,工作方式1,16位計數
TH0
=
0x4C;
//50MS定時器初值
TL0
=
0x00;
IE
=
0x82;
//開總中斷,開T0中斷
EA
=
1;
ET0
=
1;
TR0
=
1;
T0_count
=
0;
i
=
0;
loop:
goto
loop;
}
還有:
for(us=0;us<60;us++);
/*延時500us*/
for(us=0;us<1;us++);
/*
延時15微秒*/
for(us=0;us<5;us++);
/*
延時51微秒*/
F. 定時器延時問題(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;
}
}
}
G. 單片機C語言編程關於延時函數
單片機的C語言關於延時函數主要有兩種
一種是用for循環,通過單片機執行空指令達到延時的目的
如:
for(i=0;i<100;i++)
{
;
}
這個簡單的語句會執行100次空指令
每一次指令的時間可以大概確定
因此這個是最簡單的延時函數
第二種是通過定時器的方式來實現
定時器是通過對單片機的晶振進行計數
然後在定時器中斷服務函數裡面實現定時時間的計算及設置
51單片機的定時器0中斷服務函數為
void
time0()
interrupt
1
{
...
}