1.基于单片机多用途定时器的论文
基于单片机的多用途定时器的设计与实现摘要】 设计了一种以AT89 C51为核心、结构紧凑和功能齐全的多用途定时器。
它可通过小键盘输入任意定时时间,最大可定时10h,能满足各种层次答辩、各种赛事以及某些特殊定时需要。文章对其结构作了介绍。
关键词:AT89 C51,定时器,Intel 8279,Intel82531 引 言“定时器”总的来说有两种类型。其一是基于模拟技术的传统产品,这种定时器功能简单,尽管曾被广泛应用过,但已进入淘汰之列。
另一种就是基于数字技术的新一代产品,这种产品功能强,是前者的换代之物。然而,此类产品大多是较大型的设备,真正实用、携带方便、功能齐全的“大路”商品则就不多见了。
随着单片机性能价格比的不断提高,新一代产品的应用越来越广泛,大可构成复杂的工业过程控制系统,完成复杂的控制功能,小则可以用于家电控制,甚至能够用来做儿童电子玩具。它功能强大,体积小,重量轻,灵活好用,配以适当的接口芯片,可以构造各种各样、功能各异的微电子产品。
鉴此,我们设计开发了一种基于单片机的多用途定时器。这种定时器除了AT89 C51芯片以外,只采用Intel8253、Intel 8279为主要芯片,是典型的“三片系统”。
它造价低,功能全,整体功能价格比高,配以小键盘和LED显示器,可适应各种场合的定时预警之用。 2 硬件结构AT系列单片机是美国ATMEL公司在IntelMCS-51单片机技术基础上开发出的一种新产品,片内带有4k E2ROM,编程/擦除全部采用电实现(有5V和12V两种模式),既能进行在线编程擦写, 亦可采用电话线进行远程编程擦写。
可重复性强,使用寿命长,可重复擦写1000次以上,并且擦写速度快,4k编程大约需3s,擦除仅需10ms。程序保存时间长,可达100年,与Intel MCS-51系列单片机完全兼容,且有超强的加密功能,能完全替代IntelMCS - 8751/Intel MCS - 8752和Intel MCS -87C51/Intel MCS-87C52,低电压,低电流,低功耗,除了有DIP、PLCC、QFP等多种封装形式,还有商用级、工业级、汽车用级、军用级等多种规格。
因此,目前它在微计算机产品开发中的应用越来越“火”。我们的系统不需要复杂的计算,程序代码量不大,4k ROM已足够,无须外扩ROM和RAM。
由于AT89 C51的内部计数器是16位的,即便采用2MHz的时钟,计满一次为32767.5μs,因此通过Intel 8253外扩了计数器,并且用AT89 C51的ALE输出作为8253的时钟脉冲,这样就大大地扩展了量程范围。通过Intel 8279外扩了键盘/显示器,由于Intel8279内部自带按键消抖电路和键值自动扫描电路,故无须再进行编程,这样既提高了可靠性,同时也减少了整个程序的代码量。
键盘为4*4物理键阵(部分键是复用的),除了0~9数字键外,还有计时键、修改键、确认键、设置键/复位、↑、↓等功能键,键位排布情况见图1。因为选用了塑膜按键(定做的),所以既防尘又美观。
显示器选用5位高红LED管,分别表示时、分、秒。之所以没有选用液晶,主要是从广泛的实用环境来考虑的,比如球赛,大多是在户外进行的,LCD就显得亮度不够了。
另外用了4个发光二极管作为时与分、分与秒之间的分界符,如图2所示。达到预定时间,声光同时报警,采用高亮度LED和所需语音(时间到,请停止)。
CPU对8279的监视采用了查询方式,故8279的中断请求信号IRQ悬空未用。系统有直流(4节1号干电池)和交流(220V市电)两种供电方式。
整流电源是与系统配装在一起3 软件结构8253的工作时钟是ALE,输出为1MHz。它有三个计数器,为了能够最大限度地扩大计时量程,三个计数器采用了“套用”方式,即计数器0的输出作为计数器1的输入脉冲,计数器1的输出作为计数器2的输入脉冲,最后计数器2的输出才输入到的。
整个系统的结构如图3所示。 AT89 C51的T0进行计数,一个“硬件计时周期”就能定时71min1.41s,这已能满足一般的赛事定时需要。
从更广的范围考虑,编制了不同“软定时”延迟程序,可用嵌套的形式启动“硬件计时周期”,以达到更长的定时需要,但是显示器的位数已定,最长能够定时10h,这已足够长了。系统软件分为三大模块,即初始化模块,键盘扫描/显示模块,时间延迟(脉冲计数)模块。
关键技术为延迟时间的计算和对8279编程,工作期间要动态地显示倒计时时间,结构框图如图4所示。4 结束语本文所介绍的多用途定时器设计巧妙,体积小,造价低,功能强,计时范围大,用途广泛,操作携带方便,是一种较理想的定时工具,经多次试用改进后已基本定型。
该系统市场前景广阔,具有较明显的经济效益。参 考 文 献1 张友德等.单片微型机原理、应用与实践.上海:复旦大学出版社,19922 李华. MCS-51系列单片机实用接口技术.北京:北京航空航天大学出版社,19933 李秉操等.单片机接口技术及其在工业控制中的应用.陕西:陕西电子编辑部,19914 陈键铎.8098单片机原理及应用技术.北京:电子工业出版社,1995。
2.单片机定时中断
跟你理清一下思路,你的问题就解决了。首先,你的程序很简单,就是让发光二极管1秒亮1秒灭。因此,你前提是要定时1秒,但51单片机无法定时1秒,因此,你的程序就要定时50毫秒,每到了50毫秒,你就让num自加1,当num加到20时,换句话说,已经定时50毫秒20次了,那就是1秒咯,所以此有led1=~led1; //让发光管状态取反,达到程序目的。另外,定时50毫秒你要给TH0和TL0赋给初值,因此 TH0=(65536-45872)/256; //重新装载初值TL0=(65536-45872)%256;才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void T0_time()这个函数中重新赋初值。的确像你所说的初值是装满了开始执行中断,其实从你TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?
(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给TMOD=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)
3.关于51单片机的中断
、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 二、中断源 在51单片机中有5个中断源 中断号 优先级 中断源 中断入口地址 0 1(最高) 外部中断0 0003H 1 2 定时器0 000BH 2 3 外部中断1 0013H 3 4 定时器1 0018H 4 5 串口总段 0023H 三、中断寄存器 单片机有10个寄存器主要与中断程序的书写控制有关 1.中断允许控制寄存器IE 2.定时器控制寄存器TCON 3.串口控制寄存器SCON 4.中断优先控制寄存器IP 5.定时器工作方式控制寄存器TMOD 6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1) 寄存器详细说明: 四、寄存器功能与赋值说明 注:在用到中断时,必须要开总中断EA,即EA=1。
//开总中断 1.中断允许控制寄存器IE EX0(EX1):外部中断允许控制位 EX0=1 外部中断0开关闭合 //开外部0中断 EX0=0 外部中断0开关断开 ET0(ET1):定时中断允许控制位 ET0=1 定时器中断0开关闭合 //开内部中断0 ET0=0 定时器中断0开关断开 ES: 串口中断允许控制位 ES=1 串口中断开关闭合 //开串口中断 ES=0 串口中断开关断开 2.定时器控制寄存器 TCON //控制外部中断和定时器中断 外部中断: IE0(IE1):外部中断请求标志位 当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入 中断程序后由单片机自动置0. //外部中断,即外部中断相应的引脚接入低电平或下降沿信号时,中断开始响应。 IT0(IT1):外部中断触发方式控制位 //选择有效信号 IT0(IT1)=1:脉冲触发方式,下降沿有效。
IT0(IT1)=0:电平触发方式,低电平有效。 内部中断: TF0(TF1):内部定时器/计数器溢出中断标志位 当定时器、计数器计数溢出的时候,此位由单片机自动置1,cup开始响应,处理中断,而当进入中 断程序后由单片机自动置0. //内部中断实际上就是利用内部的计数器,只不过提供计数的脉冲来自单片机自身。
TRO(TR1):定时器/计数器启动位 //启动定时器 TRO(TR1)=1; 启动定时器/计数器0 TR0(TR1)=0; 关闭定时器/计数器0 3.串口控制寄存器SCON TI:串行口发送中断标志位 当单片机串口发送完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的, 必须由用户在中断服务中用软件清0. RI:串行口接收中断标志位 当单片机串口接收完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的, 必须由用户在中断服务软件中用软件清0. (IP以后补上,TMOD,TL0/TH0 在定时器/计数器中讲) 五、中断结构图:六、定时器/计数器 1.计数的定义: 计数是指对外部事件进行计数,外部事件的发生以输入脉冲的形式表示,因此计数功能的实质就是对外来 的脉冲进行计数,在单片机中对应引脚T0和T1,两个脉冲输入端。 外部输入的脉冲在负跳变时有效(即外部脉冲由1变化到0),计数器加1. 2.定时器: 定时器是通过计数器的计数来实现的,不过此时的计数脉冲来自单片机的内部,因此定时器的实质是对内 部脉冲的计数,在单片机中,每个机器周期产生一次计数脉冲,计数器加1. 3.工作方式控制寄存器TMOD: TMOD的低半字节(D0,D1,D2,D3)用来控制定时器/计数器0 TMOD的高半字节(D4,D5,D6,D7)用来控制定时器/计数器1 对TMOD中的内容说明: GATE——门控制。
GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。 当INT0引脚为高电平时TR0置位,启动定时器T0; 当INT1引脚为高电平时TR1置位,启动定时器T1。
GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 C/T——功能选择位 C/T=0时为定时功能,C/T=1时为计数功能。
M0、M1——方式选择功能 由于有2位,因此有4种工作方式 4.根据单片机晶振,所选TMOD的的工作方式,所要定的时间,来确定THO和TLO所要赋予的初值 (以12M晶振,工作方式1,16位计数器为例,设所定时间为Xus(16为计数器最大数65536,即65536us,若所 定时间大于65535,则要用if语句控制,现假设X 1.时钟周期的时间t=1/12M=1/12 us 2.机器周期的时间T=12*1/12=1 us 3.因为每经过一个机器周期计数器+1,所以,计数器+1,经过的时间为 1 us。 若所定时间为X,则要求经过Xus,中断响应,又因为16为计数器要全部置1(即达到65535)+1后,中断才会 响应,所以,初值=(65536-X) 4.将初值转化为16进制码,分别付给THO和TLO eg:所定时间5ms 初值=(65536-5000)=60536=EC78 TH0=0XEC; TL0=0X78; (当工作方式不同时,TH0/TL0的赋值也不同,个人觉得有了16位计数器了,其余的没什么用,不介绍了) 5.写程序时另一种THO/TLO赋值方法 TH0=(65536-20000)/256; TL0=(65536-20000)%6; 这样设置,每经过20ms,发生一次中断,中断时间一般以秒为单位,所以经过n次中断即可。
4.51单片机定时器中断程序
我来帮你写一个,程序太简单了,下面是我帮你写的程序我测试过能满足你的要求,希望我的回答对你有帮助!
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**/
#include "REG52.H"
/*
*
*/
sbit LED_A = P1^0;
sbit LED_B = P1^1;
sbit LED_C = P1^2;
unsigned char TIME_BASE;
unsigned char MACT_ENDB;
unsigned char Rece_Errp;
/*
* 定时器初始化
*/
void SystemInit(void)
{
TMOD = 0x01;
TH0 = (65536 - 45872) / 256; // 定时50ms //晶振:11.0592MHZ
TL0 = (65536 - 45872) % 256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
int main(void)
{
SystemInit();
while(1)
{
/* 程序一开始上电Rece_Errp = 0 定时器5秒加一次 */
if(Rece_Errp == 0)
{
LED_A = 0; // A亮5秒
LED_B = 1; // B是灭
LED_C = 1; // C是灭
}
/* 判断是否5秒时间到 */
else if(Rece_Errp ==1)
{
LED_A = 1; // A是灭
LED_B = 0; // B亮5秒
LED_C = 1; // C是灭
}
else if(Rece_Errp == 2)
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 0; // C亮5秒
}
else
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 1; // C是灭
while(1); // 程序运行到这里停止
}
}
}
void Timer0_IRQ(void) interrupt 1
{
TH0 = (655365 - 45872) / 256;
TL0 = (655365 - 45872) % 256;
/* 进入中断50ms +1次 */
TIME_BASE++;
if(TIME_BASE == 20) // 20ms * 50ms = 刚好等于1000ms 也就是1秒
{
TIME_BASE = 0;
MACT_ENDB++; // 一秒加一次
if(MACT_ENDB == 5) // 等于刚好5秒时间到
{
MACT_ENDB = 0;
Rece_Errp++; // 用来切换LED A、B、C5秒灭
}
}
}
转载请注明出处众文网 » 51单片机的定时器中断毕业论文