定时定时.docx
- 文档编号:7915568
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:29
- 大小:97.71KB
定时定时.docx
《定时定时.docx》由会员分享,可在线阅读,更多相关《定时定时.docx(29页珍藏版)》请在冰豆网上搜索。
定时定时
定时定时
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;//关外部
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 定时