定时器程序

合集下载

step7中有关时间和定时器的使用和例程

step7中有关时间和定时器的使用和例程

KNX协议⼊门⼀、KNX技术简介KNX通过⼀条总线将各个分散的设备连接并分组和赋予不同的功能;系统采⽤串⾏数据通讯进⾏控制、监测和状态报告。

KNX是基于事件控制的分布式总线系统,只有当总线上有事件发⽣时和需要传输信息时才将报⽂发送到总线上。

KNX 技术的通信模型采⽤五层结构:物理层、数据链路层、⽹络层、传输层和应⽤层。

KNX 物理层⽀持TP1( 双绞线)、PL110(电⼒线)、RF(射频) 和Ethernet(以太⽹),其中TP1 介质应⽤最多。

数据链路层实现总线设备之间的数据传输,并解决⽹络中的通信冲突问题。

对于⼩KNX系统中的总线设备,⽹络层的功能很少,只是完成了传输层和数据链路层的通信映射功能。

⼤型KNX系统中有耦合器类产品,作⽤是在⽹络层完成路由功能和跳数(hop)控制功能。

传输层完成设备之间的传输,有四种传输模式:点到点⽆连接,点到点有连接,⼴播和多播。

KNX通信模型KNX传输介质主要是双绞线,⽐特率为9600bit/s。

总线由KNX电源(DC24V)供电,数据传输和总线设备电源共⽤⼀条电缆,数据报⽂调制在直流电源上。

KNX系统有两种配置模型:S-Mode (系统模式)和E-Mode (简单模式)。

S-Mode:该配置机制是为经过良好培训的KNX安装者实现复杂的楼宇控制功能。

⼀个由“S-Mode”组件组成的装置可以由通常的软件⼯具(ETS? 3专业版)在由S-Mode产品制造商提供的产品数据库的基础上进⾏设计:ETS也可以⽤于连接和设置产品(即设置安装和下载要求的可⽤参数)。

“S-Mode”提供给实现楼宇控制功能的最⾼级别的灵活性。

E-Mode:该配置机制是针对经过基本KNX培训的安装⼈员。

和S-Mode相⽐,“E-Mode”兼容产品只提供有限的功能。

E-Mode 组件是已经预先编程好的并且已经载⼊默认参数。

使⽤简单配置,可以部分的重新配置各个组件(主要是它的参数设置和通信连接)。

注:ETS软件是系统设计、编程和调试的⼯具软件;可能需要购买。

单片机 定时器实现24小时时钟程序

单片机  定时器实现24小时时钟程序

#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制sbit LS138C = P2^4; //定义138译码器的输入脚C由sbit k1=P2^0;sbit k2=P2^1 ;sbit k3=P2^5;bit flag;uchar sec=0,min=0,hour=12;uchar count_10ms, DelayCNT;int m=1;//此表为LED 的字模, 共阴数码管0-9 -unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void delay(uint z){int x,y;for(x=z;x>0;x--)for(y=20;y>0;y--) ;}void timer(){TMOD=0x01;TH0=0xdc;TL0=0x00;EA=1;ET0=1;TR0=1;}void key(){ int t;if(k1==0){delay(30);if(k1==0){ while(!k1);t++;m=t%2;}}}/************主函数**********************/ main(){ unsigned int i ;unsigned int LedOut[10];timer();while(1) //进入循环状态{if(m==0){if(k2==0){delay(30);if(k2==0)while(!k2);hour++;}if(hour>=24)hour=0;if(k3==0){delay(30);if(k3==0)while(!k3);min++;}if(min>=60)min=0;}LedOut[0]=Disp_Tab[hour/10];LedOut[1]=Disp_Tab[hour%10];LedOut[2]=Disp_Tab[10];LedOut[3]=Disp_Tab[min/10];LedOut[4]=Disp_Tab[min%10];LedOut[5]=Disp_Tab[10];LedOut[6]=Disp_Tab[sec/10];LedOut[7]=Disp_Tab[sec%10];for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = LedOut[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选也可以是用查表的方式学员可以试着自己修改{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(10);}}}void timer1() interrupt 1 // 中断函数{TH0=0xdc;TH0=0x00;key();if(m){{count_10ms++;}if(count_10ms==10){count_10ms=0;sec++;if(sec>=60){sec=0;min++;if(min>=60){min=0;hour++;if(hour>=24){hour=0;sec=0;min=0;}}}}}}。

keil环境下51单片机定时器应用程序调试

keil环境下51单片机定时器应用程序调试

图2 启动ISIS 7 Professional
图3 打开sim51.DSN文件
图4 选择运行的代码
点击打开对话框,选择运行的代 码。
图5 控制程序运行
:连续运行仿真。 :以一个动画帧为单位,单步运行仿真。 :在连续运行时0时刻暂停。
:停止仿真。
图6 用虚拟示波器观察产生的波形
按住黄色箭头拖动,调节扫描速率
定时器程序练习2
要求: ;fosc=6MHz,使用定时器T0产生100ms定时,在P1.0口输出频 率为5Hz的方波,在P1.1口输出频率为2Hz的方波(1/2秒信 号),在P1.2口输出频率为1Hz的方波(秒信号)。 ;参考课本P127页例1。
图1 创建HEX文件选项
调试步骤:
1、在keil中建立项目lianxi,输入源程序保存为lianxi.asm。 2、点击 ,选择“Output”标签,在“Creat HEX File”前打“√”, 如图1所示,再编译,将产生lianxi.hex文件。 3、启动单片机仿真程序“ISIS 7 Professional”,如图2所示。 4、打开 “sim51.DSN”文件,如图3所示。 5、双击U1(80C51),弹出对话框如图4所示,选择要运行的代 码lianxi.hex。 6、按照图5所示,控制程序运行。 7、用虚拟示波器观察产生的波形,如图6。
按照练习1介绍的方法,进行调试运行,观察结果。
keil环境下51单片机定时器应用程序调试单片机定时器单片机定时器程序单片机定时器初值计算单片机定时器中断52单片机定时器2单片机定时器实验单片机定时器延时程序单片机定时器中断程序单片机定时器工作原理
C6定时器应用程序调试
山东职业学院
定时器程序练习1
要求: ;使用定时器T0产生1ms定时,在P1.0口输出频率为 500Hz的方波。 ;参考课本P118页例1。

定时器中断延时程序

定时器中断延时程序

定时器中断延时程序(1)该类型的delay()函数采用的延时是通过对变量进行递减或递增实现的,很难计算精确的延时时间。

(2)由于跑马灯的状态函数和延时函数是和主任务耦合到一起的,因此主任务的执行时间要对延时的时间产生影响。

如图6-12所示,假设一个跑马灯的延时函数的延时时间是1s,但是由于主函数可能存在不同的分支,因此当主函数执行不同分支程序时,实际的跑马灯延时时间是不一样的。

图6-12 程序分支对delay()函数的影响因此,对于某些对定时精度有要求的场合,例如某项工程需要跑马灯1s更换一个状态(最典型的例子就是时钟指示),就不能采用变量递减或递增的延时方法,而要采用更加精确的中断定时方法。

中断的概念在前面的章节已经有过详细讲解,这里不再赘述,与采用递增递减延时函数相比,采用中断来进行跑马灯的状态更换有以下几个优点。

(1)采用中断函数进行延时,可以精确保证延时的精度,即有效地保证跑马灯状态更换的频率;(2)采用中断函数进行跑马灯状态的更换,在进行延时期间,并不占用单片机资源,单片机可以执行其他的任务。

采用中断延时函数来进行跑马灯状态更换的软件结构如图6-13所示,主程序和跑马灯状态变换程序是独立分开的,当中断发生时,主程序被打断,进行跑马灯状态的变换。

AT89S51单片机里有两个独立的计时器T0和T1,为了得到精确的定时中断,在这里采用T0的模式0来产生定时中断。

如图6-14所示为T0工作于模式0时的结构图。

图6-13 采用时间中断函数的程序结构图6-14 计时器T0的工作模式0当T0工作于模式0时,相关需要配置的寄存器如下:(1)TMOD寄存器:TMOD寄存器是管理计时器T0和T1工作模式和相关配置的寄存器,寄存器内各位如图6-15所示,需要配置的功能位如下所示。

·M10-M00:M10-M00用于选择T0的工作模式,工作于模式0时,T0是一个13位的定时器/计数器,如图6-14所示,THx和TLx分别为8bits和5bits长度,共为13位计数器。

定时器说明书

定时器说明书

建议:先设置程序,然后再进行安装(准备一个洗衣机水龙头外丝20mm既可)。

注意:垂直安装,因为底部有个散热孔,如果进了雨水,会失灵哦打开控制器透明盖子,屏幕下面有2个扣子,这个是电池盒,你向内扣住轻巧拉出来,因为里面连着电线。

装上2节7号电池,扣回去。

一,设置当前时间和星期几?点time,时间数字会跳动,用上下箭头调节好时间的小时后,点set确认,然后是分钟跳动,同样方法,调节好后按set,然后底部su会跳动,代表需要设置星期几,同样方法,用上下箭头调节好当前的星期几,点set确认,这样第一步就做好了。

二,设置程序(一共可以设置16个程序)点prog,依次出现:1程序的序号2开始浇水的时间3运行的时间。

方法:1跳动的时候,代表现在设置第一个程序,按1下set。

然后用设置时间的方法,设定好你需要浇水的时间,然后后面的运行时间会跳动,同样方法设置好你需要运行的时间长度,注意:运行时间是时间段:1分钟到9小时都可以随便你设定,如果你需要5分钟,设置成0.05既可,前面小时,后面分钟。

这样开始时间和运行时间设置好了,接下来设置运行的频率。

三,设定频率 A 2天浇水一次,B 3天浇水一次,C 每天浇水一次。

A,设定好开始时间,运行时间后。

按1下set确认后,左边会出现2nd,你按2下SET既可。

B,设定好开始时间,运行时间后。

按1下set确认后,左边会出现2nd,如果你需要3天浇水一次,当2nd出现后,你按一次下箭头,然后会出现3rd,然后你再按2下SET既可。

C,设定好开始时间,运行时间后。

按1下set确认后,左边会出现2nd,当2nd出现后,你按2次下箭头,然后底部会出现su在跳动,这个时候,你连续按7下SET直到出现小太阳,然后再按一次SET,表示确认。

每天浇水2次或者2次以上的,设置好第一个程序,会出现2在跳动,同样方法设定你所需要浇水的时间既可,以此类推。

四,自检当你设置好了你所需要的程序后,记得自检。

定时器的用法

定时器的用法

定时器的用法1、调整当前时间使用定时器时,须先将定时器的显示时间调整到当前时间。

按住“时钟”键的同时,分别按“星期”、“小时”和“分钟”键,调整到当前的时间。

每按一次增加一小时,长按可快速调整。

按“时钟”键3秒后,当前时间增加1小时,同时液晶屏显示“夏令时”字样,进入夏令时功能,再按"时钟"键3秒,取消夏令时功能,时间自动减少1小时。

2、设置程序按“设定”键,即可进入定时模式设置,屏幕上显示“1开”。

按“小时”、“分钟”和“星期”,即第一组定时开开始工作的时间。

其中,按“星期”键,可选择不同星期组合模式。

可根据需求,定时器只在设定的星期数中工作。

再按“设定”键,屏幕上显示“1关”,即第一组定时关闭时间,时间设置参考一开设置方法。

依次类推,最多可设置20组开与关。

设置完成后按“时钟”键返回当前时间。

注:1.如果每天不需要设定20组,而其他组已设定,必须按“清除”键,将多余各组的时间程序清除。

2.定时设置完成后,应按“设定”键检查多次定时设定情况是否与实际情况一致。

如有异,请按时间需要进行调整或重新设定。

注:1.如果每天不需要设定20组,而其他组已设定,必须按“清除”键,将多余各组的时间程序清除。

2.定时设置完成后,应按“设定”键检查多次定时设定情况是否与实际情况一致。

如有异,请按时间需要进行调整或重新设定。

如设置的时间程序是跨天的,需要逐一将“开”与“关”时间程序相对应的星期模式对应好。

3、定时器工作模式选择在当前时间状况下,连续按“模式”键,显示屏的左侧将循环显示“自动关”、“开”、“自动开”、“关”四种模式。

根据您的需要进行模式选择。

四种模式释意:“开”:定时器一直有电源输出,没有定时功能;“关”:定时器无电源输出,呈关闭状态;“自动开”:定时器接通电源时有电源输出,之后按设定的程序工作;“自动关”:定时器接通电源时无电源输出,之后按设定的程序工作。

注:以当前时间为标准,当前时间处在在设定时间段中间,选择“自动开”的模式;当前时间处在设定时间段之前或之后,选择“自动关”的模式。

PLC中定时器的几个典型应用程序_上_李兴莲

PLC中定时器的几个典型应用程序_上_李兴莲

电子报/2012年/1月/29日/第011版制作与开发PLC中定时器的几个典型应用程序(上)江苏李兴莲定时控制是PLC的重要功能之一,PLC中的定时器类似于控制系统中的时间继电器,由它们去完成各种各样的时间控制,但是使用起来比时间继电器更方便、灵活,功能也更强大,控制精度也更高。

本文以三菱FX2N系列PLC为例,介绍定时器的种类及通用型定时器的几个典型应用程序(这些程序同样适应于汇川、台达等PLC)。

一、定时器及其种类定时器分为通用定时器和累积型定时器两种,在定时器启动后可以对可编程控制器内的1ms、10ms、l00ms等时钟脉冲信号进行累加计数,当累加的数值达到预先设定的值时,定时器的触点就动作。

定时器设定值可以用十进制常数(K)来设定,也可以用数据寄存器(D)的内容进行间接指定。

FX2N系列PLC中TO~T199为单位时间l00ms的通用型定时器;T200~T245为单位时间10ms 的通用型定时器;T246~T249为单位时间为lms的累积型定时器;T250~T255为单位时间l00ms 累积型定时器。

这些定时器的设定值可以从K1到K32767。

通用定时器和累积型定时器的区别是:前者断开后,其数值立刻恢复为0;而后者在断开后,其数值保持不变,再次接通后,在原有数值基础上继续。

二、典型应用程序1.延时接通程序延时接通就是当开关接通时,需要延迟一定的时间,才有输出信号。

实现延时接通功能的梯形图程序如图1所示。

在图1的梯形图程序中,当X000接通时,T0线圈得电,开始计时,此时T0常开触点还未闭合,Y000失电,输出没有信号,当X000接通3s(30×0.1s)时,T0常开触点接通,Y000有输出信号。

可见输出比输入延时了3s接通。

用时序图来表示,如图2所示。

若要改变延时时间,只需要改变定时器TO的定时时间常数。

2.延时断开程序延时断开就是当开关断开时,需要延时一定时间后,输出信号才断开。

C51单片机 定时器可调时钟 程序

C51单片机 定时器可调时钟 程序
void DelayMs(unsigned char t); //ms级延时
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
void Init_Timer0(void);//定时器初始化
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
minute++;
if(minute==60)//分钟到60,小时加1
{
minute=0;
hour++;
if(hour==24)//小时到24,回零
hour=0;
}
}
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
break;
case 4:minute--;if(minute==255)minute=59; //分钟减1
break;
default:break;
}
if(UpdateTimeFlag==1)
{
UpdateTimeFlag=0;
TempData[0]=dofly_DuanMa[hour/10]; //时//数据的转换,因我们采用数码管0பைடு நூலகம்9的显示,将数据分开

单片机实验二 定时器实验程序

单片机实验二 定时器实验程序
sbit L2=P0^6;
sbit L3=P0^7;
unsigned char keynum;
unsigned int lasttime=100;
bit bset=0;
unsigned char keyscan();
void display();
unsigned char getkey();
void set();
code unsigned char table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
sbit H1=P3^6;
sbit H2=P3^7;
sbit L1=P0^5;
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
P1M1=0x00;
P1M0=0xff;
while(1)
{
keynum=keyscan();
display();
set();
}
}
void timer0() interrupt 1
{
P1=0X00;
W1=1;
W2=0;W3=1;W4=1;
P1=table[(unsigned char)(lasttime%1000/100)]|a;
}
else if(ct1<60)
{
P1=0X00;
W2=1;
W3=0;W4=1;W1=1;
P1=table[(unsigned char)(lasttime%1000%100/10)]|a;

定时器指令实验报告

定时器指令实验报告

定时器指令实验报告定时器指令实验报告一、引言定时器指令是计算机科学中常用的一种指令类型,用于实现时间控制和计时功能。

在本次实验中,我们将学习并掌握定时器指令的使用方法,并通过实验验证其正确性和有效性。

二、实验目的1. 理解定时器指令的原理和功能。

2. 学习定时器指令的编程方法。

3. 掌握定时器指令在实际应用中的使用。

三、实验器材和方法1. 实验器材:计算机、编程软件。

2. 实验方法:通过编写程序,使用定时器指令进行计时和时间控制。

四、实验过程1. 初始化定时器:在程序开始时,需要对定时器进行初始化设置。

通过设定计时周期和工作模式等参数,确保定时器能够按照预定的时间间隔工作。

2. 编写定时器指令程序:根据实际需求,编写程序,使用定时器指令实现计时和时间控制功能。

例如,可以编写一个简单的程序,通过定时器指令实现每隔一秒钟在屏幕上显示一次当前时间。

3. 运行程序并观察结果:将编写好的程序在计算机上运行,并观察定时器指令的效果。

确保程序能够按照预期的时间间隔进行计时和时间显示。

五、实验结果与分析经过实验,我们成功使用定时器指令实现了计时和时间控制的功能。

每隔一秒钟,程序会在屏幕上显示一次当前时间,实现了时间的自动更新和显示。

这在实际应用中非常有用,比如在科学实验中需要精确计时,或者在工业自动化控制中需要按照一定时间间隔进行操作等。

六、实验总结通过本次实验,我们深入了解了定时器指令的原理和功能,并学会了如何使用定时器指令进行时间控制和计时。

定时器指令在计算机科学和工程技术中具有广泛的应用,可以用于实现各种时间相关的功能。

掌握定时器指令的使用方法对于我们提高编程能力和解决实际问题具有重要意义。

七、存在的问题与改进方向在本次实验中,我们成功实现了定时器指令的功能,但仍存在一些问题。

首先,定时器指令的精度可能受到计算机硬件和操作系统等因素的影响,需要进行更精确的测试和调整。

其次,定时器指令的编程方法可能较为复杂,需要更深入地学习和理解。

电脑定时器操作方法

电脑定时器操作方法

电脑定时器操作方法电脑定时器是一种非常实用的工具,它可以帮助我们在特定的时间点进行定时操作,提醒我们完成一些任务,也可以让我们在需要的时候自动关机或休眠,非常方便实用。

下面我将详细介绍如何在Windows操作系统中使用电脑定时器进行各种操作。

首先,我们需要打开Windows的“任务计划程序”。

在Windows操作系统中,任务计划程序是一个非常实用的工具,可以帮助我们管理和创建各种任务和计划。

打开任务计划程序的方式有多种,以下是其中一种方法:1. 使用快捷键Win+R打开运行窗口;2. 输入“taskschd.msc”,点击“确定”按钮;3. 这样就可以打开任务计划程序了。

在任务计划程序中,我们可以创建、编辑和删除定时任务。

接下来我将分别介绍如何创建定时提醒、自动关机和自动休眠的任务。

创建定时提醒任务:1. 在任务计划程序中,点击左侧面板的“创建任务”;2. 在“常规”选项卡中,输入任务的名称和描述;3. 在“触发器”选项卡中,点击“新建”按钮,设置任务的触发条件,例如设定某个特定的时间点、每天、每周、每月等;4. 在“操作”选项卡中,点击“新建”按钮,选择执行的操作,例如打开应用程序、打开网页等;5. 在“条件”选项卡中,根据需要设置任务的条件,例如只有在电脑空闲状态下执行任务,只有在电脑接通电源时执行任务等;6. 在“设置”选项卡中,根据需要设置任务的高级选项,例如设置任务的优先级、超时时间等;7. 确认所有设置后,点击“确定”按钮保存任务。

这样,我们就成功创建了一个定时提醒任务。

当设定的触发条件满足时,任务计划程序会自动执行相应的操作,提醒我们完成任务。

创建自动关机任务:有时候,我们在需要长时间离开电脑时,可以设定自动关机任务,以节约电源和保护电脑。

下面是如何创建自动关机任务的方法:1. 在任务计划程序中,点击左侧面板的“创建任务”;2. 在“常规”选项卡中,输入任务的名称和描述;3. 在“触发器”选项卡中,点击“新建”按钮,设置任务的触发条件,例如设定某个特定的时间点、每天、每周、每月等;4. 在“操作”选项卡中,点击“新建”按钮,在“程序/脚本”框中输入“shutdown.exe”,在“参数”框中输入“-s -t 0”,表示立即关机;5. 在“条件”选项卡中,根据需要设置任务的条件,例如只有在电脑空闲状态下执行任务,只有在电脑接通电源时执行任务等;6. 在“设置”选项卡中,根据需要设置任务的高级选项,例如设置任务的优先级、超时时间等;7. 确认所有设置后,点击“确定”按钮保存任务。

单片机定时器实验程序

单片机定时器实验程序

定时器#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intUchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71}; //0~F的共阴极字段码表uchar chocode[]={0xfe,0xfd,0xfb,0xf7}; //位选码表uchar N,M;sbit P3_5=P3^5; //位定义sbit P3_6=P3^6;sbit P3_7=P3^7;sbit P0_4=P0^4;sbit P3_3=P3^3;sbit P3_4=P3^4;sbit P0_7=P0^7;//===================================延时1毫秒======================void Delay1ms(){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}//==================================延时300毫秒=====================void Delay300ms(){unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);}//=====================================数码管显示==================void display(uchar N,M){P0=chocode[3];P1=table[M];Delay1ms();P1=0;P0=chocode[2];P1=table[N];Delay1ms();P1=0;P0=chocode[1];P1=table[0];Delay1ms();P1=0;P0=chocode[0];P1=table[0];Delay1ms();P1=0;}//========================扫描键盘,设置倒计时初值=============== void Scan_Key(void){uchar m;bit FLAG0=0;P3_6=0;P3_7=1;P0=0xff;m=P0;switch(m&0xf0){case 0xd0: N++;FLAG0=1;if(M==10){N++;M=0;}break;case 0xb0: M++;FLAG0=1;if(M==10){M=0;N++;}break;default: break;}if(FLAG0){while((P0|0x0f)!=0xff) //松手检测{display(N,M);}}else{display(N,M);}P3_6=1;P3_7=0;P0=0xff;m=P0;switch(m&0xf0){case 0xd0: N--;FLAG0=1;break;case 0xb0: M--;FLAG0=1;break;default: break;}if(FLAG0){while((P0|0x0f)!=0xff) //松手检测{display(N,M);}}else{display(N,M);}P3_7=1;P3_6=0;}//==========================主函数==============================main(){P1=0x0;while(1){uchar i;Scan_Key(); //扫描键盘,确定倒计时初值P0=0xff;if(P0_7==0) //检测是否开始倒计时{while((P0|0x0f)!=0xff) //松手检测{display(N,M);}while(1) //定时开始{for(i=0;i<120;i++) //循环定时120次,实现定时1秒钟{TMOD=0x01;TH0=0xd8;TL0=0xf0;TR0=1;display(N,M);do{display(N,M);} while(TF0==0);//检测是否完成一次定时}if((M|N)==0) //定时到,所有灯闪烁{while(1){P0=0xff;P2=0x00;P0_4=0;P3_3=0;P3_4=0;P3_5=0;Delay300ms();P2=0xff;P0_4=1;P3_3=1;P3_4=1;P3_5=1;Delay300ms();}}if(M==0){M=9;N--;}else M--;}}}}。

STM32F103中断和定时器程序

STM32F103中断和定时器程序

STM32中断程序/*======================================================================================== *名称: main.c*功能:*入口参数:*说明:去掉stm32f10x_conf.h里#include "stm32f10x_tim.h" 注释*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/ #include "stm32f10x.h"#include "12864.h"ErrorStatus HSEStartUpStatus; //等待时钟的稳定u8 count=0;u8 d;void SYS_Configuration(void);/*//ms延时函数void delayms(unsigned int nValue) //delay 1ms at 8M{unsigned int nCount;unsigned int ii;unsigned int jj;nCount = 1980;for(ii = nValue;ii > 0;ii--){for(jj = nCount;jj > 0;jj--)Delay(1);}}*///GPIO管脚初始化配置void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure; //GPIO状态恢复默认参数/*GPIO口配置每四行一组,每组GPIO属性相同,默认情况:ALL,2MHZ,FLATING*//*PA-2-3配置为输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_7; //管脚位置定义GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度为50MHZGPIO_Init(GPIOA, &GPIO_InitStructure); //A组GPIO初始化/*PB-2配置为输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //管脚位置定义GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度为50MHZGPIO_Init(GPIOB, &GPIO_InitStructure); //B组GPIO初始化/*PA-0配置为输入--------------------------------------------------------外部中断引脚*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);}/*======================================================================================== *名称: NVIC_Configuration();*功能:外部中断嵌套控制*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/ void NVIC_Configuration(void) //嵌套中断向量控制配置{NVIC_InitTypeDef NVIC_InitStructure; //定义数据结构的变量// 选择优先组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //0组,全副优先级NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //选择中断通道,库P166页,NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应优先级0NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //启动此通道的中断NVIC_Init(&NVIC_InitStructure); //结构体初始化}/*========================================================================================*名称: EXTI_Configuration();*功能:外部设备中断初始化*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/void EXTI_Configuration(void) //中断初始化 (外部设备中断){EXTI_InitTypeDef EXTI_InitStructure; //定义数据结构的变量GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //管脚选择// GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);EXTI_InitStructure.EXTI_Line=EXTI_Line0; //将以上入口放在EXTI_Line0这条线上(stm32有18条这样的线路)EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //选择上升或下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE; //开中断EXTI_Init(&EXTI_InitStructure); //将结构体初始化}/*========================================================================================*名称: Timer_Config();*功能:定时器中断初始化*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/void Timer_Config(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义TIM结构体变量RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2外设TIM_DeInit(TIM2); //复位时钟TIM2,恢复到初始状态TIM_TimeBaseStructure.TIM_Period=17999; //35999和1999刚好1sTIM_TimeBaseStructure.TIM_Prescaler=1999;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //TIM2时钟分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //计数方式// 定时时间T计算公式:// T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(35999+1)*(1999+1)/72MHz=1sTIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //初始化TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除标志// 中断方式下,使能中断源TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能中断源TIM_Cmd(TIM2,ENABLE); //使能TIM2}/*======================================================================================== *名称: NVIC_Config();*功能:定时器嵌套控制*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/ void NVIC_Config(void) //定时器嵌套向量控制器{NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量// 设置优先分级组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //0组,全副优先级NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //选择中断通道,库P166页,// 选择中断通道。

单片机定时器实验程序

单片机定时器实验程序

void tim(void) interrupt 1 using 1
{
ET0=0; TR0=0;
//关闭中断 保证程序顺利运行
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
time--; //second 秒减 1
if(time==0) //second
void DelayMS(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) for(j=300;j>0;j--);
}
/******************************************************************/
/*
显示函数 1
*/
/******************************************************************/
T1_init();
//P0=0xff;
while(1) { keyscan(); // k = key(); switch(k) { case KM: { Display1(); break; }
//无任何按键按下 默认为 0 返回
case 1: { time+=10; time=time%99; Display1(); k=KM; break; }
void T1_init()
{ TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式 1,16 位定时 TH0=0x0dc; TL0=0x00; EA=1; //开总中断 //IE= 0x82; //打开中断

c语言单片机定时器计数器程序

c语言单片机定时器计数器程序

C语言单片机定时器计数器程序1. 简介C语言是一种被广泛应用于单片机编程的高级编程语言,它可以方便地操作单片机的各种硬件模块,包括定时器和计数器。

定时器和计数器是单片机中常用的功能模块,它们可以用来实现精确的时间控制和计数功能。

本文将介绍如何使用C语言编程实现单片机的定时器计数器程序。

2. 程序原理在单片机中,定时器和计数器通常是以寄存器的形式存在的。

通过对这些寄存器的操作,可以实现定时器的启动、停止、重载以及计数器的增加、减少等功能。

在C语言中,可以通过对这些寄存器的直接操作来实现对定时器和计数器的控制。

具体而言,可以使用C语言中的位操作和移位操作来对寄存器的各个位进行设置和清零,从而实现对定时器和计数器的控制。

3. 程序设计在编写单片机定时器计数器程序时,首先需要确定定时器的工作模式,包括定时模式和计数模式。

在定时模式下,定时器可以按照设定的时间间隔生成中断,从而实现定时功能;在计数模式下,定时器可以根据外部的脉冲信号进行计数。

根据不同的应用需求,可以选择不同的工作模式,并根据具体情况进行相应的配置。

4. 程序实现在C语言中,可以通过编写相应的函数来实现对定时器和计数器的控制。

需要定义相关的寄存器位置区域和位掩码,以便于程序对这些寄存器进行操作。

编写初始化定时器的函数、启动定时器的函数、停止定时器的函数、重载定时器的函数等。

通过这些函数的调用,可以实现对定时器的各种操作,从而实现定时和计数功能。

5. 示例代码以下是一个简单的单片机定时器计数器程序的示例代码:```c#include <reg52.h>sbit LED = P1^0; // 定义LED连接的引脚void InitTimer() // 初始化定时器{TMOD = 0x01; // 设置定时器0为工作在方式1TH0 = 0x3C; // 设置初值,定时50msTL0 = 0xAF;ET0 = 1; // 允许定时器0中断EA = 1; // 打开总中断void Timer0_ISR() interrupt 1 // 定时器0中断服务函数{LED = !LED; // 翻转LED状态TH0 = 0x3C; // 重新加载初值,定时50msTL0 = 0xAF;}void m本人n(){InitTimer(); // 初始化定时器while(1){}}```以上代码实现了一个简单的定时器中断程序,当定时器计数到50ms 时,会触发定时器中断,并翻转LED的状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P0^0;uchar T_Count=0;void main(){ TMOD=0x00; //定时器0 工作方式0TH0=(8192-5000)/32; //5ms 定时TL0=(8192-5000)%32;IE=0x82; //允许T0 中断TR0=1;while(1); } //T0 中断函数void LED_Flash() interrupt 1 {TH0=(8192-5000)/32; //恢复初值TL0=(8192-5000)%32;if(++T_Count==100) //0.5s 开关一次LED {LED=~LED;T_Count=0; } }28 TIMER0 控制流水灯#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid main() {uchar T_Count=0;P0=0xfe;P2=0xfe;TMOD=0x01; //定时器0 工作方式1 TH0=(65536-40000)/256; //40ms 定时TL0=(65536-40000)%256;TR0=1; //启动定时器while(1) {if(TF0==1){TF0=0;TH0=(65536-40000)/256; //恢复初值TL0=(65536-40000)%256;if(++T_Count==5){ P0=_crol_(P0,1);P2=_crol_(P2,1); T_Count=0;} } } }29 定时器控制4 个LED 滚动闪烁#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit B1=P0^0;sbit G1=P0^1;sbit R1=P0^2;sbit Y1=P0^3;uint i,j,k;//主程序void main() {i=j=k=0;P0=0xff;TMOD=0x02; //定时器0 工作方式2 TH0=256-200; //200us 定时TL0=256-200;IE=0x82;TR0=1; //启动定时器while(1);}//T0 中断函数void LED_Flash_and_Scroll() interrupt 1{if(++k<35) return; //定时中断若干次后执行闪烁k=0;switch(i){case 0: B1=~B1;break;case 1: G1=~G1;break;case 2: R1=~R1;break;case 3: Y1=~Y1;break;default:i=0;}if(++j<300) return; //每次闪烁持续一段时间j=0;P0=0xff; //关闭显示i++; //切换到下一个LED }30 T0 控制LED 实现二进制计数#include<reg51.h>//主程序void main() {TMOD=0x05; //定时器0 为计数器,工作方式1,最大计数值65535TH0=0; //初值为0TL0=0;TR0=1; //启动定时器while(1) {P1=TH0;P2=TL0; } }31 TIMER0 与TIMER1 控制条形LED#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar tc0=0,tc1=0;//主程序void main(){P0=0xfe;P2=0xfe;TMOD=0x11; //定时器0、定时器1 均工作于方式1TH0=(65536-15000)/256; //定时器0:15msTL0=(65536-15000)%256;TH1=(65536-50000)/256; //定时器1:50ms TL1=(65536-50000)%256;IE=0x8a;TR0=1; //启动定时器TR1=1;while(1); }//T0 中断函数void Time0() interrupt 1 {TH0=(65536-15000)/256; //恢复定时器0 初值TL0=(65536-15000)%256;if(++tc0==10) //150ms 转换状态{tc0=0;P0=_crol_(P0,1); } }//T1 中断函数void Time1() interrupt 3 {TH0=(65536-50000)/256; //恢复定时器1 初值TL0=(65536-50000)%256;if(++tc1==10) //500ms 转换状态{ tc1=0;P2=_crol_(P2,1); } }32 10s 的秒表#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K1=P3^7;uchari,Second_Counts,Key_Flag_Idx;bit Key_State;ucharDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f};//延时void DelayMS(uint ms) { uchar t;while(ms--) for(t=0;t<120;t++); }//处理按键事件void Key_Event_Handle() {if(Key_State==0) {Key_Flag_Idx=(Key_Flag_Idx+1)%3;switch(Key_Flag_Idx) {case 1: EA=1;ET0=1;TR0=1;break;case 2: EA=0;ET0=0;TR0=0;break;case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0; } } } //主程序void main() { P0=0x3f; //显示00P2=0x3f;i=0;Second_Counts=0;Key_Flag_Idx=0; //按键次数(取值0,1,2,3)Key_State=1; //按键状态TMOD=0x01; //定时器0 方式1TH0=(65536-50000)/256; //定时器0:50msTL0=(65536-50000)%256;while(1) { if(Key_State!=K1) {DelayMS(10);Key_State=K1;Key_Event_Handle(); } } }//T0 中断函数void DSY_Refresh() interrupt 1 {TH0=(65536-50000)/256; //恢复定时器0 初值TL0=(65536-50000)%256;if(++i==2) //50ms*2=0.1s 转换状态{ i=0;Second_Counts++;P0=DSY_CODE[Second_Counts/10];P2=DSY_CODE[Second_Counts%10];if(Second_Counts==100) Second_Counts=0; //满100(10s)后显示00 } }33 用计数器中断实现100 以内的按键计数#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f,0x00};uchar Count=0;//主程序void main() {P0=0x00;P2=0x00;TMOD=0x06; //计数器T0 方式2TH0=TL0=256-1; //计数值为1ET0=1; //允许T0 中断EX0=1; //允许INT0 中断EA=1; //允许CPU 中断IP=0x02; //设置优先级,T0 高于INT0 IT0=1; //INT0中断触发方式为下降沿触发TR0=1; //启动T0while(1){P0=DSY_CODE[Count/10];P2=DSY_CODE[Count%10];}}//T0 计数器中断函数void Key_Counter() interrupt 1{Count=(Count+1)%100; //因为只有两位数码管,计数控制在100 以内(00~99)}//INT0 中断函数void Clear_Counter() interrupt 0{Count=0; }34 100 000s 以内的计时程序/* 名称:100 000s 以内的计时程序说明:在6 只数码管上完成0~99 999.9s。

*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//段码uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f};//6 只数码管上显示的数字uchar Digits_of_6DSY[]={0,0,0,0,0,0};uchar Count;sbit Dot=P0^7;//延时void DelayMS(uint ms){uchar t;while(ms--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j;P0=0x00;P3=0xff;Count=0;TMOD=0x01; //计数器T0 方式1 TH0=(65536-50000)/256; //50ms 定时TL0=(65536-50000)%256;IE=0x82;TR0=1; //启动T0while(1){j=0x7f;//显示Digits_of_6DSY[5]~Digits_of_6DSY[0]的内容//前面高位,后面低位,循环中i!=-1 亦可写成i!=0xff for(i=5;i!=-1;i--){j=_crol_(j,1);P3=j;P0=DSY_CODE[Digits_of_6DSY[i]]; if(i==1) Dot=1; //加小数点DelayMS(2);}}}//T0 中断函数void Timer0() interrupt 1{uchar i;TH0=(65536-50000)/256; //恢复初值TL0=(65536-50000)%256;if(++Count!=2) return;Count=0;Digits_of_6DSY[0]++; //0.1s 位累加for(i=0;i<=5;i++) //进位处理{if(Digits_of_6DSY[i]==10){Digits_of_6DSY[i]=0;if(i!=5) Digits_of_6DSY[i+1]++; //如果0~4 位则分别向高一位进位}else break; //若某低位没有进位,怎循环提前结束}}35 定时器控制数码管动态显示/* 名称:定时器控制数码管动态显示说明:8 个数码管上分两组动态显示年月日与时分秒,本例的位显示延时用定时器实现。

相关文档
最新文档