中断嵌套和定时器的应用

来源:互联网 发布:板材下料优化软件 编辑:程序博客网 时间:2024/05/29 09:37
/*
定时:使用T0作为16位定时器,最小时间单元设定为5ms(晶振为11.0592MHZ);
显示:使用4个LED作为显示器
输入:使用3个独立按键作为输入
中断嵌套:ET0= 1;EX0 = 1; 定时器0 和外部中断0两重嵌套
*/
#include <reg52.h>#define uint unsigned int //0~65535#define uchar unsigned char//0~255uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };//sbit buzz = P2^4;sbit wela = P2^5;//74HC573数据锁存器的片选端sbit dg = P2^3; //右边第一个LEDsbit ds = P2^2;sbit db = P2^1; sbit dq = P2^0;sbit key1 = P3^2;//INT0的外部输入sbit key2 = P3^3;sbit key3 = P3^4;sbit key4 = P3^5;sbit key5 = P3^7;uint t0; //定时器0计数器uint temp;uchar keyV1 = 0;//按键1扫描值void delay(uint z);void interruptInit();void TimerInit();void TestSMG();void KeyScan();int main(){TimerInit();while(1){if (t0 >= 200)//延时1s{t0 = 0;temp++;}if (temp >= 19)temp = 0;KeyScan();TestSMG();}}//定时器初始化void TimerInit(){TMOD = 0x01;//0000 0001   T0 16位定时器//延时 5000μm = 5msTH0 = (65535 - 5000)/256;//高八位TL0 = (65535 - 5000)%256;//低八位interruptInit();TR0 = 1;}//定时器服务子程序void Timer0() interrupt 1 //定时器0默认的中断优先级为1{TH0 = (65535 - 5000)/256;//高八位TL0 = (65535 - 5000)%256;//低八位t0++;}//中断初始化void interruptInit(){//IT0 = 1;//外部中断设为边沿触发EA = 1;ET0 = 1; //使能T0中断//EX0 = 1;//使能外部中断}/*//外部中断服务子程序void key() interrupt 0//按键使用外部中断,优先级为0{temp++;} *//*function : display temp形参:temp局部变量:g,s,b,q全局位变量:dg,ds,db,dq*/void TestSMG(){uchar g = temp%10;uchar s = (temp/10)%10;uchar b = (temp/100)%10;uchar q = temp/1000;wela = 1;P0 = table[g];wela = 0;dg = 0;ds = 1;db = 1;dq = 1;delay(1);wela = 1;P0 = table[s];wela = 0;dg = 1;ds = 0;db = 1;dq = 1;delay(1);wela = 1;P0 = table[b];wela = 0;dg = 1;ds = 1;db = 0;dq = 1;delay(1);wela = 1;P0 = table[q];wela = 0;dg = 1;ds = 1;db = 1;dq = 0;delay(1);}/*按键扫描全局变量:sbit key1 = P3^2;//INT0的外部输入sbit key2 = P3^3;sbit key3 = P3^4;sbit key4 = P3^5;sbit key5 = P3^7;uchar keyV1 = 0;//按键1扫描值*/void KeyScan(){if (key1 == 0){delay(1);if (key1 == 0){switch(keyV1){case 0: TR0 = 0; break;case 1: //重新装初值TH0 = (65535 - 5000)/256;//高八位TL0 = (65535 - 5000)%256;//低八位TR0 = 1;break;}keyV1++;if(keyV1 == 2){keyV1 = 0;}}while(!key1);//下降沿去抖动delay(1);while(!key1);//上升沿去抖动}if (keyV1 == 1){if (key2 == 0){delay(1);if (key2 == 0){temp++;}while(!key2);delay(1);while(!key2);}else { if (key3 == 0) { delay(1);if (key3 == 0){temp--;}while(!key3);delay(1);while(!key3); }}}}/*********************************************延时函数 ,z=1时,延时1ms局部变量 x,y,z*********************************************/void delay(uint z){uint x, y;for(x = z; z > 0; z--)for(y = 110; y > 0; y--); }

原创粉丝点击