历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2018年12月19日 | 51定时器中断程序编写

2018-12-19 来源:eefocus

上篇笔记记录到51单片机的中断允许寄存器、定时器/计数器工作方式寄存器(TMOD)、定时器/计数器控制寄存器(TCON)各位的作用。这些寄存器都是用来为编写定时器中断程序编写的初始化部分而服务的。然后今天再这里补填中断函数的编写格式,以后就可以编写定时器中断程序了。


1.中断服务程序的写法

C51的中断函数格式如下:


void  函数名()  中断号 using 工作组


{


        中断服务程序内容


}


与一般的C语言程序相比,中断服务程序有一下特点


中断函数不能返回任何值,所以函数名前用void;

函数名随便起,但不能与C51语言中的关键字同名(同C语言函数要求)

中断函数不能带任何参数,故函数名后的括号内为空

中断号是指单片机中的几个中断源的序号,列表如下(红方框内内容)

图1.51单片机中的中断源

        

        此序号是编译器识别不同中断的唯一符号,在程序编写中定要写正确。

“using 工作组”是指这个中断函数使用单片机内存中4组工作寄存器中的哪一组,C51编译器在编译程序时会自动分配工作组,因此这句话经常被省略不写。


2.定时器1中断程序编写

#include


#define uint unsigned int



#define MANY_KEY_DELAY  1

#define TOTAL_TIME_NUM  5

#define ONE_SECOND      20


uint num;

uint num1;


uint flag_key;


//流水灯的第一列

sbit led1 = P1^0;

//第一个按钮位

sbit key = P3^1;

//按钮的接地端

sbit h_key6 = P3^6;


//函数申明

void T1_end_AND_change_status();

void delayms(uint xms);

void init_timer();

void data_init();

void key_scan();


void main()

{

        //初始化数据变量

        data_init();


        //初始化T1定时器

        init_timer();


        while(1){


                //不断检测此按钮是否被按下

                key_scan();


                //检测一个大周期定时是否完成

                //使按下按钮后相应的位发生电平反转

                T1_end_AND_change_status();

        }

}


//自定义函数:数据初始化

void data_init()

{

     num        = 1;

     num1       = 1;

     flag_key   = 0;

     h_key6     = 0;   

}


//自定义函数:初始化TMOD、TCON、中断寄存器,并装入计数初值

void init_timer()

{

        //选中定时器1

        TMOD    = 0x10;


        //定时器1的初值

        TH1     = (65536 - 45872) / 256;

        TL1     = (65536 - 45872) % 256;

        

        //开总中断,     

        //定时器1中断

        EA         = 1;

        ET1        = 1;

}


//自定义函数:延迟xms ms

void delayms(uint xms)

{

        uint i, j;


        for(i = xms; i > 0; i--)

                for(j = 110; j > 0; j--);

}


//自定义函数:检测哪一个按键被按下

void key_scan()

{

        if(key == 0){

                //<1>.待按钮被按下后的稳定状态

                delayms(10);

    

                //<2>.操作:

                //开启定时器,由T1时间到达关闭T1定时器

                TR1 = 1;

    

                //记住按钮已被按下

                flag_key    = 1;

    

                //点亮响应的流水灯

                led1        = 0;

    

                //<3>.等待按键的释放

                while(!key);    

        }      

}


void T1_end_AND_change_status()

{

        //T1计时完成

        if(num >= TOTAL_TIME_NUM * ONE_SECOND){

                num     = 0;

                

                //检测有哪些按钮被按下,结束其高低电平的转换

                if(flag_key){

                        flag_key       = 0;


                        //按钮信号以低电平结束

                        led1    = 1;

                                

                        //一旦检测到总的计时时间到则关闭定时功能

                        //当有任何按钮再次被按下时,T1定时器再被开启

                        //需要在按钮被按下的前提下设置此语句,防止没有任何按钮按下时到达定时器时间设置

                        TR1     = 0;

                 }

        }

        

        //按钮的电平反转

        if(num1 >= MANY_KEY_DELAY * ONE_SECOND){

                num1    = 0;

                if(flag_key){

                        led1    = ~led1;

                }

        }

             

}


//中断函数编写

void T1_time() interrupt 3

{

     TH1        = (65536 - 45872) / 256;

     TL1        = (65536 - 45872) % 256; 

     

     num++;

     num1++;    

}


此源程序经编译链接生成可执行文件后,下载到单片机中,按下key对应的按键时,流水灯1就会以1s的高低电平交换显示。照片一张作为纪念:

图2.闪烁的流水灯

3.程序分析

程序从main函数出开始运行。自在main函数中对个寄存器初始化后,待按键按下(TR1=1)时,定时器1开始从当前值开始计时,当计数计满溢出时,TCON的TF1向CPU申请中断从而进入中断函数内执行中断函数内的语句,当把中断函数内的语句执行完毕后,再返回到main函数开始中断处。当在中断函数中重新给定时器赋新值后(若不赋新值,则从0开始计),则将又会过与原来一样长的时间后发生中断。

此程序的中断周期是50ms(晶振频率为11.0592)。此程序随时等待按钮被按下,只有按钮被按下时才开始计时,中断程序才会生效。定时器被启动后,将会以50ms的周期进行中断产生,当计满1s时,流水灯的状态反转一次。当计满5s后定时器再次被关闭。程序重新等待按钮被按下。


4.总结

使用定时器中断的方式可以得到以高低电平反转的方波。在现实生活中我们可以用这种方波做很多事情,如红外遥控器就是采用的此种原理对不同按钮进行编码,经发射电路将此方波发射出去,再由相应的接收电路接受此方波,然后对其进行解码,得到原信号进而可以判断此信号是想要做出什么样的操作。

当然,使用单片机编写程序不再是单纯的写代码,还需要会阅读各种电路图和电器件的特性。


推荐阅读

史海拾趣

安美通(APPCON)公司的发展小趣事

为了进一步扩大市场份额,安美通积极开展市场推广和品牌建设。公司参加了多个国内外知名展会和技术交流会议,与众多客户建立了良好的合作关系。同时,安美通还加大了对营销网络的投入,建立了完善的销售体系和客户服务体系,提高了客户满意度和忠诚度。

3M公司的发展小趣事

安美通非常重视企业文化建设和团队建设。公司倡导创新、务实、合作的企业文化,为员工提供了一个宽松、自由、充满激情的工作环境。同时,公司还积极开展各类培训活动,提升员工的专业素养和综合能力。这些措施使得安美通的团队更加团结、高效,为公司的持续发展提供了有力的保障。

这五个故事虽然只是安美通发展过程中的一部分,但它们充分展示了安美通在电子行业中不断努力、创新、拓展的精神和成果。未来,安美通将继续秉承这种精神,不断推动公司的发展和进步。

ZTE高新兴(Gosuncn)公司的发展小趣事

安美通非常重视企业文化建设和团队建设。公司倡导创新、务实、合作的企业文化,为员工提供了一个宽松、自由、充满激情的工作环境。同时,公司还积极开展各类培训活动,提升员工的专业素养和综合能力。这些措施使得安美通的团队更加团结、高效,为公司的持续发展提供了有力的保障。

这五个故事虽然只是安美通发展过程中的一部分,但它们充分展示了安美通在电子行业中不断努力、创新、拓展的精神和成果。未来,安美通将继续秉承这种精神,不断推动公司的发展和进步。

Elpaq公司的发展小趣事
Hei Inc Optoelectronic Division公司的发展小趣事
通过编程MCU来实现定时功能,可以灵活地设置加热时间和加热温度等参数,并实时监测和控制加热过程。MCU还可以与其他传感器和执行器连接,实现更复杂的控制逻辑。
Beta Dyne Inc公司的发展小趣事

近年来,电子行业面临着技术更新换代迅速、市场竞争激烈的挑战。Beta Dyne也不例外,公司面临着来自同行的竞争压力以及客户需求不断变化的挑战。为了应对这些挑战,Beta Dyne不断调整产品策略,加大研发投入,推出了一系列创新产品,并积极拓展新的应用领域。

问答坊 | AI 解惑

不错的解密软件(系统上的)

这个解密软件也许会给大家一点方便…

查看全部问答>

接口资料总结

PCI Express标准概述 [ 本帖最后由 天天向上 于 2009-7-6 11:15 编辑 ]…

查看全部问答>

EEW-DSO-V2.00设计难点探讨

由于最近工作比较忙,就和大家开门见山地探讨几个问题,也是这段时间一直在和东哥讨论的问题. 1.FIFO实现 这次采用100M的采样速度,带来一个很比较大的问题是存储器的读写速度跟不上.这次不打算使用专门的FIFO芯片,因为价格比较高,特别是在容量比较 ...…

查看全部问答>

新手求助啊vs2005开发wince程序

我想在vs2005下开发一个简单的wince程序,已经安装了: 1.vs2005+sp1 2.Windows CE 5.0: Standard Software Development Kit (SDK) 现在问题是:在创建工程时,平台选择是Platform SDK(STANDARDSDK_500),编译成功,但是点击运行时,提示无 ...…

查看全部问答>

字符液晶1602和点阵液晶12864 地址的疑惑(初学者提问)

字符液晶1602 确定显示位置的时候  80H 加上地址码 00H-27H  40H-67H。对于80H是如何得出来的? 点阵液晶12864  确定显示位置的时候  B8H 加上页码  40H 加上列码。   对于B8H 40H ...…

查看全部问答>

LED做按键,创意无限。类似触摸板

发光二极管,就是LED,一般只用来当小电灯使,其实这个半导体元件,也具有光电效应的,利用这个特性,就可以做出有趣的按钮来。 基本思想是1,加正向电压发光,PN结没有积累电荷。2,立刻加反向电压,熄灭,PN结电容充电。3,断开正反向电压,让PN ...…

查看全部问答>

lpc1768的i2c控制器写24c02失败,各位高手帮忙看看。

void i2c0_wr_byte(uint8_t da,uint8_t add){  LPC_I2C0->I2CONCLR=0x2c;  LPC_I2C0->I2CONSET|=0x60;     //使能i2c控制器并发送起始位 while(!(LPC_I2C0->I2STAT==0x08));  //等待发送 ...…

查看全部问答>

求助大神如何使用Altium Designer15.0.7

最近刚安装了一款较新的一款软件Altium Designer15.0.7,但是不知道怎么用 从网上找的教程都是比较老的 看着对不上 不习惯, 新的教程好像没有 不知道有没有哪个大神也最近换了个最新版的 给指导一下 …

查看全部问答>

【课程推荐】+ TI C2000无锡研讨会-太阳能微逆变器解决方案

平时没事看看TI的视频,发现有活动,顺便参加一些,希望拿个奖品,先谢谢TI和eeworld 这次我推荐的课程是 TIC2000无锡研讨会-太阳能微逆变器解决方案 主讲是朱桦 新能源是一个比较大的方向,相信有很多人都是从事这一方面。众所周知的是太阳能变 ...…

查看全部问答>