⑴ 51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)
1、下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。
2、软件延时:(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
3、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--);
}
⑵ 利用51单片机定时器产生PWM波的c语言程序,要求如下
#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
cnt++;
if(pwm>0)
{
if(cnt>100)cnt=0;
if(cnt<=pwm)pluse=1;
else pluse=0;
}
else pluse=0;
}
main()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
pwm++;
if(pwm>100)pwm=100;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}
⑶ 51单片机定时中断C语言的写法步骤,可追加分数
程序说明:51单片机定时器0工作于方式一,定时50ms中断一次
晶振为12M
#include
void
main
{
TOMD
=
0X01;
//配置定时器0工作于方式一
TH1
=
(65536-50000)/256;
//高八位装入初值
TL1
=
(65536-50000)%256;
//低八位装入初值
ET0
=
1;
//开定时器0中断
EA
=
1;
//开总中断
TR0
=
1;
//启动定时器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新装初值
TH1
=
(65536-50000)/256;
//高八位装入初值
TL1
=
(65536-50000)%256;
//低八位装入初值
}
/***************************************************************************************************************/
上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样
#include
void
main
{
TOMD
=
0X01;
//配置定时器0工作于方式一
TH1
=
0x3c;
//高八位装入初值
TL1
=
0xb0;
//低八位装入初值
IE
=
0x82;//开总中断并开定时器0中断
TR0
=
1;
//启动定时器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新装初值
TH1
=
0x3c;
//高八位装入初值
TL1
=
0xb0;
//低八位装入初值}
⑷ 51单片机多段定时C语言怎么写呀百思不得其解
大致这么个意思吧.
int t; //计时
int step; //分步
void delay10ms(){} //延时
void timerinit(){} //定时器初始化
void main(){
step = 0;
led1 = 0; //亮
led2 = 1; //灭
timerinit();
while(1){
if(key1){
delay10ms();
if(key1){
led1 = 1;
led2 = 0;
step = 1;
t = 0;
}
}
if(key2){
delay10ms();
if(key2){
led1 = 0;
led2 = 1;
step = 0;
t = 0;
}
}
}
}
void time0() interrupt x
{
t++;
if(step==0){
if(t==5s){
led1 = 1; //灭
}
}else if(step==1){
if(t==10s){
led2 = 1;
led1 = 0;
step = 0;
t = 0;
}
}
}