1.中断服务程序的写法
C51的中断函数格式如下:
void 函数名() 中断号 using 工作组
{
中断服务程序内容
}
与一般的C语言程序相比,中断服务程序有一下特点
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++; }
3.程序分析
4.总结
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』