《(77)--7章定时计数器程序设计(2).ppt》由会员分享,可在线阅读,更多相关《(77)--7章定时计数器程序设计(2).ppt(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、51单片机定时/计数器(2)程序设计如图所示,如图所示,如图所示,如图所示,P1P1接八个发光二极管,接八个发光二极管,接八个发光二极管,接八个发光二极管,编程使八个管轮流点亮,编程使八个管轮流点亮,编程使八个管轮流点亮,编程使八个管轮流点亮,每个管亮每个管亮每个管亮每个管亮100ms100ms,设晶,设晶,设晶,设晶振为振为振为振为6MHz6MHz。应用编程举例应用编程举例分析:分析:利用利用T1T1完成完成100ms100ms的的定时定时定时定时,采用定时方式,采用定时方式1 1,当当P1P1口线输出口线输出“1 1”时,发光二极管亮,每当时,发光二极管亮,每当T1T1计满计满溢出,即每隔
2、溢出,即每隔100ms100ms,P1左移一次。左移一次。先计算计数初值:先计算计数初值:MC=2MC=2s 100ms/2 100ms/2s=s=50000 C=65536-50000=15536 查询方式查询方式查询方式查询方式:#include#include#include#include void main(void)void main(void)void main(void)void main(void)uchar ledP1=0 x01;uchar ledP1=0 x01;uchar ledP1=0 x01;uchar ledP1=0 x01;P1=ledP1;P1=ledP1;
3、P1=ledP1;P1=ledP1;/*/*/*/*第一只第一只第一只第一只LEDLEDLEDLED亮亮亮亮*/TMOD=0 x10 TMOD=0 x10 TMOD=0 x10 TMOD=0 x10;/*/*/*/*定时器定时器定时器定时器1 1 1 1方式方式方式方式1*/1*/1*/1*/TR1=1 TR1=1 TR1=1 TR1=1;/*/*/*/*启动启动启动启动T/C1*/T/C1*/T/C1*/T/C1*/While(1)TH1=15536/256;TL1=15536%256;/*装载计数初值装载计数初值*/while(!TF1);/*查询等待查询等待TF1置位置位*/TF1=0;
4、/*软件清软件清TF1*/ledP1=1;P1=ledP1;/*定时时间到,下一只定时时间到,下一只LED亮亮*/if(ledP1=0)ledP1=0 x01;TF1=0;/*软件清软件清TF1*/0 0 0 1 Timer1()interrupt/*T1中断服务程序*/TH1=15536/256;TL1=15536%256;/*计数初值重载*/ledp1=1;/*下一只LED亮*/P1=ledp1;if(ledp1=0 x00)ledp1=0 x01;中断方式:中断方式:中断方式:中断方式:#include#define uchar unsigned char uchar ledp1;voi
5、d main(void)TMOD=0 x10;/*T1工作在定时方式1*/ledp1=0 x01;P1=ledp1;/*第一只LED亮*/TH1=15536/256;TL1=15536%256;/*装载计数初值*/EA=1;ET1=1;/*CPU开中断,允许T1中*/TR1=1;/*启动T1开始定时*/while(1);/*等待中断*/例例2 2 在在P1.7P1.7端接一个发光二极管端接一个发光二极管LEDLED,要求利用定时控,要求利用定时控制使制使LEDLED亮一秒灭一秒周而复始,设亮一秒灭一秒周而复始,设fosc=6MHZfosc=6MHZ。方法方法1:1:采用采用T0T0产生周期为产
6、生周期为200ms200ms脉冲,即脉冲,即P1.0P1.0每每100ms100ms取反一次作为取反一次作为T1T1的计数脉冲,的计数脉冲,T1T1对下降沿计数,因此对下降沿计数,因此T1T1计计5 5个脉冲正好个脉冲正好一秒。一秒。T0 采用采用方式方式 1,定时,定时 100ms,100ms,也就是计也就是计5000050000个机器周期。个机器周期。X=216 50000 ,T1采用方式采用方式2,计数初值计数初值X=285解解:16:16位定时最大为位定时最大为216 *2us=131.072ms,显然不能满足要求,可用以下,显然不能满足要求,可用以下两种方法解决。两种方法解决。#in
7、clude#include sbit P1_0=P1 sbit P1_0=P10 0;sbit P1_7=P1sbit P1_7=P17 7;timer0()interrupt 1 timer0()interrupt 1*T0T0中断服务程序中断服务程序*/P1_0=P1_0=!P1_0P1_0;/*100ms/*100ms到,到,P1.0P1.0取反取反*/TH0=-50000/256 TH0=-50000/256;/*/*重载计数初值高重载计数初值高8 8位位*/TL0=-50000%256 TL0=-50000%256;/*/*重载计数初值低重载计数初值低8 8位位*/timer1()i
8、nterrupt 3 timer1()interrupt 3 timer1()interrupt 3 timer1()interrupt 3/*T1/*T1/*T1/*T1中断服务中断服务中断服务中断服务*/P1_ P1_ P1_ P1_!P1_7;P1_7;P1_7;P1_7;/*1s/*1s/*1s/*1s到,灯变状态到,灯变状态到,灯变状态到,灯变状态*/因为C编译器自动用补码表示符号数,所以编程中直接赋初值-50000即可。T1采用方式2,计数5个脉冲,故初值为-5。main()main()main()main()P1_7=0;P1_7=0;P1_7=0;P1_7=0;/*/*/*/*
9、置灯初始亮置灯初始亮置灯初始亮置灯初始亮*/P1_0=P1_0=P1_0=P1_0=;/*/*/*/*保证第一次反向便开始计数保证第一次反向便开始计数保证第一次反向便开始计数保证第一次反向便开始计数 TMOD=0 x61;TMOD=0 x61;TMOD=0 x61;TMOD=0 x61;/*T0/*T0/*T0/*T0方式定时,方式定时,方式定时,方式定时,T1T1T1T1方式计数方式计数方式计数方式计数*/TH0=-50000/256;TH0=-50000/256;TH0=-50000/256;TH0=-50000/256;*预置预置预置预置T0T0T0T0计数初值计数初值计数初值计数初值*
10、/TL0=-50000%256;TL0=-50000%256;TL0=-50000%256;TL0=-50000%256;TH1=-5;TL1=-5;TH1=-5;TL1=-5;TH1=-5;TL1=-5;TH1=-5;TL1=-5;*预置预置预置预置T1T1T1T1计数初值计数初值计数初值计数初值*/IP=0 x08;IP=0 x08;IP=0 x08;IP=0 x08;/*/*/*/*置置置置T1T1T1T1高优先级高优先级高优先级高优先级*/EA=1;ET0=1;ET1=1 EA=1;ET0=1;ET1=1 EA=1;ET0=1;ET1=1 EA=1;ET0=1;ET1=1/*/*/*/
11、*开中断开中断开中断开中断*/TR0=1;TR1=1;TR0=1;TR1=1;TR0=1;TR1=1;TR0=1;TR1=1;/*/*/*/*启动定时计数器启动定时计数器启动定时计数器启动定时计数器*/for(;)for(;)for(;)for(;)/*/*/*/*等待中断等待中断等待中断等待中断*/门控位门控位GATE为为1时,时,TRx=1,INTx=1才能才能启动定时器。利用这个特性可以测量外部输入脉启动定时器。利用这个特性可以测量外部输入脉冲的宽度。冲的宽度。门控位的应用门控位的应用 例例 利用利用T0门控位测试门控位测试 INT0引脚上出现的正脉冲宽度,已知晶振频率为引脚上出现的正脉
12、冲宽度,已知晶振频率为12MHz,将所测得值显示,将所测得值显示。分析:外部脉冲由(P3.2)输入,设T0工作于定时方式1(16位计数),GATE设为1。测试时,应在INT0 处于低电平时,就启动定时器即TR0为1;当INT0 变为高电平时,就启动计数;再次变低时,停止计数。此计数值与机器周期的乘积即为被测正脉冲的宽度。因fosc=12MHZ,机器周期为1us。#include sbit p32=P32;main()P1=0;P2=0;while(1)TMOD=0 x09;TH0=0;TL0=0;TR0=0;while(p32=1);TR0=1;/while(p32=0);while(p32=1);TR0=0;P1=TL0;P2=TH0;THE END!