定时定时.docx

上传人:b****5 文档编号:7915568 上传时间:2023-01-27 格式:DOCX 页数:29 大小:97.71KB
下载 相关 举报
定时定时.docx_第1页
第1页 / 共29页
定时定时.docx_第2页
第2页 / 共29页
定时定时.docx_第3页
第3页 / 共29页
定时定时.docx_第4页
第4页 / 共29页
定时定时.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

定时定时.docx

《定时定时.docx》由会员分享,可在线阅读,更多相关《定时定时.docx(29页珍藏版)》请在冰豆网上搜索。

定时定时.docx

定时定时

定时定时

1、图1来源于程序dsjs1完成功能:

每按下按键6次,波形跳变一次。

程序如下:

#include"at89x52.h"//头文件

#defineucharunsignedchar//简写

#defineuintunsignedint//同上

sbitm=P1^0;//定义P1_0为变量m

voidmain()//主函数

{

TMOD=0X06;//T0为计数,方式2(可自动重装载)

TR0=1;//开定时定时T0

TH0=-6;//置初值

TL0=-6;//置初值

while

(1)//死循环

{while(TF0==0);//定时没有到,TF0==0则等待

TF0=0;//TF0==1清零

m=!

m;//取反

}

2、图2来源于程序dsjs2完成功能:

利用定时器输出5ms高电平12ms低电平方波

程序如下:

#include"at89x52.h"

#defineucharunsignedchar

#defineuintunsignedint

sbitm=P1^0;

voidmain()

{

TMOD=0X10;//T1为定时,方式1(不能自动重装载)

TR1=1;//开定时T1

m=1;//初值为高电平,可以不写

while

(1)//死循环

{TH1=(-5000)>>8;//16位定时器设置初值5ms

TL1=-5000;

while(TF1==0);//定时没有到,TF1==0则等待

{TF1=0;//定时到,TF1==1清零

m=0;//输出低电平

TH1=(-12000)>>8;//T1设置初值12ms

TL1=-12000;

while(TF1==0);//定时没有到,则等待

{TF1=0;m=1;}//清零,同时输出高电平

}

}

}

3、图3来源于程序dsjs完成功能:

每按下一次键,定时器定时每20ms输出一个方波,记一次数,送数码管显示并使LED闪烁

程序如下:

#include"at89x52.h"//头文件

#defineucharunsignedchar

#defineuintunsignedint

sbitm=P1^0;

sbitkey=P3^4;//定义按键

ucharcodetv[]={0xfe,0xfd,0xfb,0xf7};//数码管片选

ucharcodea[]={0x3f,0x06,0x5b,0x4f,//数码管断选

0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x00,0x7c};

uchardataled[];//显示缓冲(这个地方最好改成4,不然程序执行出问题)

uchardatatvdata;//全局变量

voiddelay(void)//延时函数

{

uinti;

for(i=0;i<100;i++);

}

ledxianshi()//显示函数,也就是数码管驱动

{

uchark,i;

led[0]=tvdata/100;//取百位显示

led[1]=tvdata%100/10;//取十位显示

led[2]=tvdata%10;//取个位显示

led[3]=10;//定义的固定显示,可以修改

for(k=0;k<4;k++)

{

i=led[k];

P0=a[i];//送段码

P2=tv[k];//送位选

delay();

}

}

voidmain()//主函数

{uchardatal;

while

(1)//死循环

{

TMOD=0X01;//定时器T0工作在方式1

TR0=1;//启用定时定时T0

if(key==0)//如果按键按下,就执行下面的程序

{

TH0=(-2000)>>8;//16位定时器设置处值

TL0=-2000;

do{ledxianshi();}//当TF0=0,反复调用显示

while(TF0==0);

TF0=0;//中断清零

l=l+1;//计数

if(l==10)//计数次数10次(10*2ms=20ms)

{

m=!

m;//取反

l=0;//I清零

tvdata=tvdata+1;//显示数加一

}

}

}

}

4、图4来源于程序dsjsbx完成功能:

.定时器工作在工作在方式2,输出4000us周期方波,并使LED闪烁

程序如下:

#include"at89x52.h"

#defineucharunsignedchar

#defineuintunsignedint

sbitm=P1^0;

voidmain()//主函数

{uchardatal;

TMOD=0X02;//定时器T0工作在方式2

TR0=1;//启用定时定时T0

TH0=-200;//置初值

TL0=-200;

while

(1)//死循环

{while(TF0==0);//定时没有到,TF0==0则等待

TF0=0;//TF0==0,TF0清零

l=l+1;//计数

if(l==10)//计数次数10次

{m=!

m;l=0;}//m取反,I清零

}

}

5、图5来源于程序:

测频gate完成功能:

利用查询的方法实现测方波频率,并送数码管显示。

(P3.3输入1HZ方波,T1输入fx)

程序如下:

#include"at89x52.h"

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetv[]={0xfe,0xfd,0xfb,0xf7};

ucharcodea[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c};

uchardataled[4];

uintdataf;//定义变量

voiddelay(void)//延时函数

{

uinti;

for(i=0;i<100;i++);

}

ledxianshi()//显示函数

{

uchark,i;

led[0]=f/1000;//得到千位

led[1]=f%1000/100;//得到百位

led[2]=f%100/10;//得到十位

led[3]=f%10;//得到个位

for(k=0;k<4;k++)

{i=led[k];

P0=a[i];

P2=tv[k];

delay();

}

}

voidmain()//主函数

{

TMOD=0x50;//使T1工作在计数方式

TH1=0;//初值为零,用于计数

TL1=0;

while

(1)

{while(P3_3==1);//等待一个高电平

while(P3_3==0);//等待一个低电平(这样做的好处是在定时开始时,电平高低未知,这样会使精度更高,尤其对低频信号来说)

TR1=1;//启用定时定时器T1

while(P3_3==1);//等待一个高电平

while(P3_3==0);//等待一个低电平

TR1=0;//定时定时T1清零

f=(TH1<<8)+TL1;//计数值付给变量f

f=f;

while

(1)//死循环,这样可以不停的显示刚测出的方波频率

{ledxianshi();}//调用显示程序

}

}

6、图6来源于程序:

测高电平宽度完成功能:

乘2可测一个方波的完整周期的时间(占空比百分50),并送数码管显示

程序如下:

#include"at89x52.h"//头文件

#defineucharunsignedchar

#defineuintunsignedint

sbitm=P1^0;//定义P1_0为变量m

sbitkey=P3^4;//定义按键

ucharcodetv[]={0xfe,0xfd,0xfb,0xf7};//片选

ucharcodea[]={0x3f,0x06,0x5b,0x4f,//段选

0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c};

uchardataled[4];

uchardatatvdata;

voiddelay(void)//延时函数

{

uinti;

for(i=0;i<100;i++);

}

ledxianshi()//显示函数,即数码管驱动

{

uchark,i;

led[0]=tvdata/100;//取百位显示

led[1]=tvdata%100/10;//取十位显示

led[2]=tvdata%10;//取个位显示

led[3]=10;//定义的固定显示0,可以修改,这里为0

for(k=0;k<4;k++)

{

i=led[k];

P0=a[i];

P2=tv[k];

delay();

}

}

voidmain()

{TMOD=0X09;//使T0工作在定时方式,用方式1

TH0=0;//寄存器高位清零

TL0=0;//寄存器低位清零

while

(1)

{while(P3_2==0);(老师程序中没有这句,我觉得加上这句才要好些)

while(P3_2==1);

TR0=1;//开启定时定时T0

while(P3_2==0);//等待一个低电平(gate=1,不计数)

while(P3_2==1);//等待一个高电平(gate=1,计数)

TR0=0;//定时定时器T0清零

tvdata=TL0;//把记录的值送变量

TH0=0;//寄存器器清零

TL0=0;//寄存器器清零

ledxianshi();//调用显示程序

}

}

7、图7来源于程序:

dsjsbxh完成功能:

每按下按键6次,波形跳变一次。

程序如下:

#include"at89x52.h"

#defineucharunsignedchar

#defineuintunsignedint

sbitm=P1^0;

voidmain()

{____

TMOD=0X0e;//T0为计数,方式2,同时把GATE信号置1,这样只使INT0有用

TR0=1;//开定时定时T0

TH0=-6;//置初值

TL0=-6;//置初值

while

(1)//死循环

{while(TF0==0);//定时没有到,则等待

TF0=0;//清零

m=!

m;//取反

}

}

图8来源于程序:

波形产生2完成功能:

在P1.0引脚上输出一个高电平为200us低电平为1000us的脉冲波形(即周期为1200us)

程序如下:

//*******************************************************************//

//用定时计数器0工作在方式1在P1.0引脚上输出一个高电平为200us低电平为//

//800us的脉冲波形(即周期为1000us),单片机采用12M晶体//

//*******************************************************************//

#include

unsignedintdatai=0;//定义一个全局I型变量

voidTimer0Interrupt(void)interrupt1//设置中断。

中断号为1

{

i++;//i=i+1循环

if(i==1){P1_0=0;}//200us

if(i==5){P1_0=1;i=0;}/800us,/改变5调占空比////这些值不一定是题中要求的值,请大家自己替换

}

voidTimer0Init(void)//设置一个Timer01Init初始化的子函数

{TMOD=(TMOD&0xf0)|0x02;//初始化,定时器T0,工作方式2与INT0无关定时器模式//这里大家要弄明白高位不变低位置2的方法

P1_0=0;//把电平拉成低电平

TL0=-200;//定时1ms单片机采用12M晶振

TH0=-200;

TR0=1;//允许T0开始计数

ET0=1;//允许T0中断

EA=1;//中断总允许位,这里CPU开放中断

}

voidmain(void)//主函数

{

Timer0Init();//time0初始化

while

(1);//死循环

}////等待硬件定时到并输出波形

9、图9来源于程序:

波形产生3(双定时双输出)完成功能:

赑1.0引脚上输出一个高电平为86ms低电平为138ms的脉冲波形(即周期为224ms),在P2.0引脚上输出一个低电平为600us高电平为800us的脉冲波形(即周期为1400us)

程序如下:

//*******************************************************************//

//用定时计数器0工作在方式1在P1.0引脚上输出一个高电平为86ms低电平为//

//138ms的脉冲波形(即周期为224ms),在P2.0引脚上输出一个低电平为600us高电平为//

//800us的脉冲波形(即周期为1400us),单片机采用12M晶体//

//*******************************************************************//

#include

unsignedintdatai=0;k=0;//定义两个全局I型变量

voidTimer0Interrupt(void)interrupt1//设置中断。

中断号为1

{

i++;

if(i==860){P1_0=0;}

if(i==2240){P1_0=1;i=0;}//改变860,2240调占空比

}

voidTimer1Interrupt(void)interrupt3//设置中断。

T1中断号为3

{

k++;

if(k==6){P2_0=1;}//把电平拉高,即输出一个高电平

if(k==14){P2_0=0;k=0;}//改变k(6,14)调占空比//这些值不一定是题中要求的值,请大家自己替换

}

voidTimer01Init(void)//设置一个T0\T1初始化的子函数

{TMOD=0x22;//初始化,定时器T0T1,工作方式2与INT0\NT1无关定时器模式

P1_0=0;//把电平拉成低电平

TL0=-200;//定时100us时标,单片机采用24M晶体

TH0=-200;

TL1=-200;//定时100us时标,单片机采用24M晶体

TH1=-200;

TCON=0x50;//允许T0T1开始计数

IE=0x8a;//允许T0\T1中断

IP=0X80;

}

voidmain(void)//主函数

{

P1_0=1;//p1.0输出一个高电平

P2_0=0;//p2.0输出一个低电平

Timer01Init();//time0time1初始化

while

(1);

}////等待硬件定时到并输出波形

10、图10来源于程序:

波形产生完成功能:

P1.0引脚上输出一个高电平为200us低电平为1000Us的脉冲波形(即周期为1200Us),单片机采用12M晶体

程序如下:

//*******************************************************************//

//用定时计数器0工作在方式1在P1.0引脚上输出一个高电平为200us低电平为//

//1000Us的脉冲波形(即周期为1200Us%),单片机采用12M晶体//

//*******************************************************************//

#include

unsignedcharbdatai=0;

voidTimer0Interrupt(void)interrupt1//设置中断。

中断号为1

{

i=~i;//把i按位求反

if(i==0)//如果i==0则输出1000us的低电平

{TL0=-1000;

TH0=-1000>>8;}//重新定时1ms

Else//如果i==1则输出200us的低电平

{TL0=-200;

TH0=(-200)>>8;}//重新定时200us

P1_0=i^0;//按位取i的第0位

}

voidTimer0Init(void)//设置一个Timer01Init初始化的子函数

{TMOD=(TMOD&0xf0)|0x01;//初始化,定时器T0,工作方式1与INT0无关定时器模式

P1_0=0;//输出一个低电平

TL0=-1000;//定时1ms单片机采用12M晶体

TH0=(-1000)>>8;

TR0=1;//允许T0开始计数

ET0=1;//允许T0中断

EA=1;//中断总允许位,CPU开放中断

}

voidmain(void)//主函数

{

Timer0Init();//time0初始化

while

(1);//死循环

}////等待硬件定时到并输出波形

11、图11来源于程序:

测周期测频完成功能:

用查询的方法测一个方波的频率,并送数码管显示(P3.3输入1HZ方波,T1(P3.5)输入fx)

说明:

这个题在做的时候,会出现一些问题,就是说当方波频率比较低的时候,会产生溢出,这样的数码管驱动就可能不对!

按照老师的方法,我这里加进了一个原本程序没有的中断程序,其中我用红色标注,这样程序就能记低频,希望大家能自己验证一下。

程序如下:

#include"at89x52.h"//头文件

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetv[]={0xfe,0xfd,0xfb,0xf7};

ucharcodea[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c};

uchardataled[4];

unsignedlongintdataf;//定义长整形全局变量f

ints=0;

voiddelay(void)//延时函数

{

uinti;

for(i=0;i<100;i++);

}

ledxianshi()//显示函数,也就是数码管驱动

{

uchark,i;

led[0]=f/10000;//取万位数(可能不够,可加)

led[1]=f%10000/1000;//取千位数

led[2]=f%1000/100;//取百位数

led[3]=f%100/10;//取十位数

led[4]=f%10;//取个位数

for(k=0;k<4;k++)

{i=led[k];

P0=a[i];

if(k==1){P0|=0x80;}//固定在第2个数码管输出一个小数点

P2=tv[k];

delay();

}

}

voidkT1(void)interrupt3

{s++;

TF1=0;//溢出清零

TH1=0;//寄存器清零

TL1=0;//寄存器清零

}

voidmain()

{EA=1;//CPU开放中断

ET1=1;//允许T1中断

TMOD=0x10;//使T1工作在定时方式,用方式1

TH1=0;//寄存器清零

TL1=0;//寄存器清零

while

(1)

{while(P3_5==0);//等待一个低电平

while(P3_5==1);//等待一个高电平

TR1=1;//允许T1开始定时

while(P3_5==0);//等待一个低电平

while(P3_5==1);//等待一个高电平

TR1=0;//关定时定时器T1

f=(TH1<<8)+TL1+s*65536;//把T1定时送入变量f\

S=0;

f=100000000/f;//f=1000000L/f;//周期的倒数是频率

while

(1)//死循环

{ledxianshi();}

}

}

12、图12来源于程序:

中断测频完成功能:

利用中断测方波频率,准确性更高(P3.3输入1HZ方波,T1输入fx)

程序如下:

#include"at89x52.h"

#include//函数头文件

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetv[]={0xfe,0xfd,0xfb,0xf7};

ucharcodea[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c};

uchardataj,led[4];

uintf=0,s;//定义全局变量并初始化

voiddelay(void)//延时函数

{

uinti;

for(i=0;i<900;i++);

}

voidkINT1(void)interrupt2//设置中断。

中断号为2

{

f=(TH1<<8)+TL1;//把定时送到变量f里

TH1=0;//寄存器清零

TL1=0;//寄存器清零

IE1=0;//关外部

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1