上篇笔记记录到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 20uint 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(){//选中守时器1TMOD = 0x10;//守时器1的初值TH1 = (65536 - 45872) / 256;TL1 = (65536 - 45872) % 256;//开总中止, //守时器1中止EA = 1;ET1 = 1;}//自定义函数:推迟xms msvoid 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.总结
运用守时器中止的方法能够得到以凹凸电平回转的方波。在现实生活中咱们能够用这种方波做许多工作,如红外遥控器便是选用的此种原理对不同按钮进行编码,经发射电路将此方波发射出去,再由相应的接纳电路接受此方波,然后对其进行解码,得到原信号轿车能够判别此信号是想要做出什么样的操作。
当然,运用单片机编写程序不再是单纯的写代码,还需求会阅览各种电路图和电器材的特性。