光電計時器,采用51單片機和光電管
單片機源程序如下:
- /*-----------------------------------------------
- 名稱:光電計時器
- 編寫:chenyugen
- 修改:無
- ------------------------------------------------*/
- #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #define DataPort P2 //定義數據端口 程序中遇到DataPort 則用P0 替換
- sbit led=P1^0;
- sbit button_l=P1^5;
- sbit button_r=P3^5;
- sbit wan=P1^1;
- sbit qian=P3^2;
- sbit bai=P3^3;
- sbit shi=P3^4;
- sbit ge=P3^6;
- sbit g_d=P1^6;
- sbit fmq=P1^3;
- unsigned int num=0;
- unsigned char second=0,min=0;
- unsigned char finishflag=0; //更新時間顯示
- unsigned char StartTimeFlag=0; //光電管檢測到車離開
- unsigned char PrepareTimeFlag=0; //按鍵按下,指示燈顯示進入準備計時狀態
- unsigned char code cyg_duanma[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
- // 顯示段碼值0123456789
- /*------------------------------------------------
- 延時函數,含有輸入參數 unsigned int t,無返回值
- unsigned int 是定義無符號整形變量,其值的范圍是
- 0~65535
- ------------------------------------------------*/
- void Delay(unsigned int t)
- {
- while(--t);
- }
- void delay_ms(unsigned int ms)
- {
- unsigned int i;
- unsigned char j;
- for(i=0;i<ms;i++)
- {
- for(j=0;j<200;j++);
- for(j=0;j<102;j++);
- }
- }
- /*------------------------------------------------
- 定時器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- //TH0=0x00; //給定初值
- //TL0=0x00;
- EA=1; //總中斷打開
- ET0=1; //定時器中斷打開
- TR0=1; //定時器開關打開
- }
- /*--------------------------------------------------
- 顯示函數,含有輸入參數 unsigned int t ,無返回值
- --------------------------------------------------*/
- void display(unsigned char a,unsigned char b,unsigned int c)
- {
- wan=0;qian=1;bai=1;shi=1;ge=1;
- DataPort=cyg_duanma[a];
- Delay(200);
- wan=1;qian=0;bai=1;shi=1;ge=1;
- DataPort=cyg_duanma[b/10];
- Delay(200);
- wan=1;qian=1;bai=0;shi=1;ge=1;
- DataPort=cyg_duanma[b%10];
- Delay(200);
- wan=1;qian=1;bai=1;shi=0;ge=1;
- DataPort=cyg_duanma[c/100];
- Delay(200);
- wan=1;qian=1;bai=1;shi=1;ge=0;
- DataPort=cyg_duanma[c/10%10];
- Delay(200);
- }
- void main()
- {
- unsigned char i=0;
-
- led=1;
- button_l=1;
- button_r=1;
- wan=0;qian=0;bai=0;shi=0;ge=0;
- g_d=1;fmq=1;
- Init_Timer0();
- while(1)
- {
- if(button_l==0)
- {
- Delay(1000);
- if(button_l==0)
- {
- num=888;second=8;min=8;
- PrepareTimeFlag=0;
- StartTimeFlag=0;
- finishflag=0;
- led=1;
- fmq=1;
- TR0=0;
- }
- }
- if(button_r==0)
- {
- Delay(1000);
- if(button_r==0)
- {
- PrepareTimeFlag=1;
- TR0=0;
- num=0;second=0;min=0;
- led=0;
- }
- }
-
- display(min,second,num); // 調用數碼管掃描
-
- if(g_d==0&&second==0&&min==0&&PrepareTimeFlag==1)
- {
- StartTimeFlag=1;
- TR0=1;//kaiqi定時器
- fmq=0; //打開蜂鳴器
- }
- if(second==1&&min==0)
- {
- fmq=1; //關閉蜂鳴器
- }
- if(StartTimeFlag==1&&(second>5||min>0)&&g_d==0) //再一次檢測到車經過
- {
- // TR0=0;//關閉定時器
- PrepareTimeFlag=0;
- StartTimeFlag=0;
- fmq=0;
- finishflag=1;
- }
- }
- }
- /*------------------------------------------------
- 定時器中斷子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned int i;
- TH0=(65536-1000)/256;//重新賦值 1ms
- TL0=(65536-1000)%256;
- if(finishflag==1)
- {
- i++;
- if(i==1000)
- {
- i=0;
- fmq=1;//關閉蜂鳴器
- finishflag=0;
- }
- }
-
- if(StartTimeFlag==1&&PrepareTimeFlag==1)
- {
- num++;
- if(num==1000) //大致1s
- {
- num=0;
- second++;
- if(second==60) //60s
- {
- second=0;
- min++;
- }
- }
-
- }
- }
復制代碼
所有資料51hei提供下載:
飛思卡爾光電計時器.rar
(23.03 KB, 下載次數: 11)
2019-7-7 21:21 上傳
點擊文件名下載附件
|