光电计时器,采用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)
|