练习4
四、51单片机中断系统
1.使用定时器中断实现让8个LED灯亮1000ms灭1000ms,不能使用软件延时拓展:
2.使用定时器1中断让8个LED循环右移,间隔500ms,同时使用定时器0中断方式让数码管前两位间隔1000ms从0显示到60,如果有外部中断产生立即停止数码管走数(外部中断0低电平触发方式)。
练习1:

1 #include <reg52.h> 2 3 #define uchar unsigned char 4 #define uint unsigned int 5 6 uchar count;//È«¾Ö±äÁ¿ ´æ´¢¶¨Ê±Æ÷¼ÓÒ»¼ÆÊýÆ÷Òç³ö´ÎÊý 7 /*ÖжϷþÎñÌØÊ⹦ÄܼĴæÆ÷ÅäÖÃ*/ 8 void init() 9 { 10 11 TMOD = 0x01; //T0 16Ϊ¼ÆÊý¹¤×÷ģʽ 12 TH0 = 0x4b; 13 TL0 = 0xfd; //T0 ¶¨Ê±50ms 14 ET0 = 1; //T0ÖÐ¶Ï 15 TR0 = 1; //Æô¶¯T0 16 EA = 1; //¿ª×ÜÖÐ¶Ï 17 } 18 19 void main() 20 { 21 init(); //µ÷Óö¨Ê±Æ÷ÅäÖú¯Êý 22 while(1); //¿ÕÑ»· 23 } 24 25 /*¶¨Ê±Æ÷0ÖжϷþÎñ³ÌÐò*/ 26 void timer0() interrupt 1 //T0ÄÚ²¿²éѯ˳Ðò1 27 { 28 TH0 = 0x4b; 29 TL0 = 0xfd; //¶¨Ê±Æ÷0ÔٴηųõÖµ 50ms 30 count++; //ÿ´ÎÒç³ö¼ÆÊý±äÁ¿¼Ó1 31 if (count == 20) //Òç³ö20´Î¼´20*50=1S 32 { 33 P1 = ~P1; //¶ÔP1°´Î»È¡·´ 34 count = 0; //¼ÆÊýº¯ÊýÇåÁã 35 } 36 }
练习2:
1 #include <reg52.h> 2 #include <intrins.h> 3 4 #define uchar unsigned char 5 #define uint unsigned int 6 sbit we = P2^7; 7 sbit du = P2^6; 8 9 uchar count0,count1;//È«¾Ö±äÁ¿ ´æ´¢¶¨Ê±Æ÷¼ÓÒ»¼ÆÊýÆ÷Òç³ö´ÎÊý 10 uchar temp0,temp1 = 0x7f; //temp0¸ºÔðÊýÂë¹ÜµÄÖµ£¬temp1¸ºÔðÁ÷Ë®µÆµÄÖµ 11 12 uchar code leddata[]={ 13 14 0x3F, //"0" 15 0x06, //"1" 16 0x5B, //"2" 17 0x4F, //"3" 18 0x66, //"4" 19 0x6D, //"5" 20 0x7D, //"6" 21 0x07, //"7" 22 0x7F, //"8" 23 0x6F, //"9" 24 0x77, //"A" 25 0x7C, //"B" 26 0x39, //"C" 27 0x5E, //"D" 28 0x79, //"E" 29 0x71, //"F" 30 0x76, //"H" 31 0x38, //"L" 32 0x37, //"n" 33 0x3E, //"u" 34 0x73, //"P" 35 0x5C, //"o" 36 0x40, //"-" 37 0x00, //ϨÃð 38 0x00 //×Ô¶¨Òå 39 40 }; 41 42 void delay(uint z) //1MSÑÓʱ 43 { 44 uint x,y; 45 for(x = z; x > 0; x--) 46 for(y = 114; y > 0 ; y--); 47 } 48 49 void display(uchar i) //ÊýÂë¹ÜÏÔʾº¯Êý 50 { 51 uchar shi,ge; 52 shi = i / 10; //ÇóÄ£ 53 ge = i % 10; //ÇóÓà 54 55 P0 = 0xff; //Çå³ý¶ÎÂë 56 we = 1; 57 P0 = 0xfe; //µãÁÁµÚһλÊýÂë¹Ü 58 we = 0; 59 60 du = 1; 61 P0 = leddata[shi]; 62 du = 0; 63 delay(1); 64 65 P0 = 0xff; //Çå³ý¶ÎÂë 66 we = 1; 67 P0 = 0xfd; //µãÁÁµÚ¶þλÊýÂë¹Ü 68 we = 0; 69 70 du = 1; 71 P0 = leddata[ge]; 72 du = 0; 73 delay(1); 74 } 75 76 /*ÖжϷþÎñÌØÊ⹦ÄܼĴæÆ÷ÅäÖÃ*/ 77 void init() 78 { 79 80 TMOD = 0x11; //¶¨Ê±Æ÷T1/T0 16Ϊ¼ÆÊý¹¤×÷ģʽ 81 TH1 = TH0 = 0x4b; 82 TL1 = TL0 = 0xfd; //T1/T0 ¶¨Ê±50ms 83 ET1 = ET0 = 1; //¿ªT1/T0ÖÐ¶Ï 84 TR1 = TR0 = 1; //Æô¶¯T1/T0 85 EX0 = 1; //¿ªÍⲿÖжÏ0 86 IT0 = 0; //ÍⲿÖжÏ0ΪµÍµçƽ´¥·¢ 87 EA = 1; //¿ª×ÜÖÐ¶Ï 88 } 89 90 void main() 91 { 92 init(); //µ÷ÓÃÅäÖú¯Êý 93 while(1) 94 { 95 display(temp0);//ÊýÂë¹ÜÏÔʾ 96 } 97 } 98 99 void int0() interrupt 0 //ÍⲿÖжÏ0£¬ÖжϷþÎñ³ÌÐò 100 { 101 TR0 = 0; //¹Ø±Õ¶¨Ê±Æ÷0 102 } 103 104 /*¶¨Ê±Æ÷0ÖжϷþÎñ³ÌÐò*/ 105 void timer0() interrupt 1 //T0ÄÚ²¿²éѯ˳Ðò1 106 { 107 TH0 = 0x4b; 108 TL0 = 0xfd; //¶¨Ê±Æ÷0ÔٴηųõÖµ 50ms 109 count0++; 110 if (count0 == 20) 111 { 112 count0 = 0; 113 temp0++; 114 if (temp0 > 60) 115 { 116 temp0 = 0; 117 } 118 } 119 } 120 121 /*¶¨Ê±Æ÷1ÖжϷþÎñ³ÌÐò*/ 122 void timer1() interrupt 3 //T1ÄÚ²¿²éѯ˳Ðò3 123 { 124 TH1 = 0x4b; 125 TL1 = 0xfd; //¶¨Ê±Æ÷1ÔٴηųõÖµ 50ms 126 count1++; 127 if (count1 == 10) 128 { 129 count1 = 0; 130 P1 = temp1; 131 temp1 = _cror_(temp1,1);//Ñ»·ÓÒÒÆÒ»´Î 132 } 133 }
一个二次元的生物