定時中斷范例
所有完整資料下載:
定時中斷.rar
(83.17 KB, 下載次數(shù): 18)
2016-5-13 21:33 上傳
點擊文件名下載附件
定時中斷
仿真文件原理圖:
程序1:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //sbit S1=P3^2;
- //sbit S2=P3^3;
- sbit OL=P2^0;
- uchar i,t,k; //全局變量
- int a,j,l;
- unsigned long m;
- void main()
- {
- P1=0x00; //先讓LED暗
- //S1=1;
- //S2=1;
- //j=0;
- //l=0;
- a=20000; //50Hz的初值
- EA=1;
- TMOD=0x01; //方式1,16位定時計數(shù)器
- ET0=1;
- EX0=1; //開外部中斷0
- EX1=1;
- TR0=1;
- IT0=1; //外中斷方式為高電平
- IT1=1;
- //PX1=1; //優(yōu)先級設置
- while(1);
- }
- void time0(void) interrupt 1
- {
- OL=0;
- TH0=(65536-a)/256;
- TL0=(65536-a)%256;
- if(k<8) //左移
- { if(k==0)
- t=0x01;
- P1 = t;
- OL=1;
- t=(t<<1);
- }
- if(k>=8) //右移
- { if(k==8)
- t=0x80;
- t=(t>>1);
- P1 = t;
- OL=1;
- }
- k++;
- if(k==14)
- {
- k=0;//從頭開始
- TF0=0;
- } }
- void int0 (void) interrupt 0
- {
- EX0=0;
- a=1000000/(50+j);
- j++;
- EX0=1;
- }
- void int1(void) interrupt 2
- {
- EX0=0;
- a=1000000/(50-l);
- l++;
- if(l==50)
- l=0;
- EX1=1;
- }
復制代碼
程序2:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar a=0;
- sbit LED=P1^0;
- sbit key=P3^3;
- void delayms(uint ms)
- {
- uchar i;
- while(ms--)
- {
- for (i=0;i<114;i++)
- ;
- }
-
- }
- void init()
- {
- TMOD=0x90; //設置工作方式
- TH1=0; //計數(shù)器T1高8位賦初值
- TL1=0; //計數(shù)器T1低8位賦初值
- EA=1;
- ET1=1; //開定時/計數(shù)器1
- // TR1=1;; //啟動定時/計數(shù)器1
- }
- void main()
- {
- while (key); //等待低電平
- while (!key); //等待高電平
- TR1=1; //啟動T1
- LED=1; //燈亮
- while (key); //等待低電平
- TR1=0; //停止定時/計數(shù)器T1
- LED=0; //燈滅
- TH1=0; //
- TL1=0; //計數(shù)清零
- delayms(1000); ////延時
- }
- void time1() interrupt 2 ///定時T1中斷子程序
- {
- TH1=0;
- TL1=0;
- a++; ///溢出后反向加1,直到加滿溢出后又返回加1
- }
復制代碼
|