找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1290|回复: 1
打印 上一主题 下一主题
收起左侧

单片机光电计时器程序

[复制链接]
跳转到指定楼层
楼主
ID:223295 发表于 2019-7-7 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
光电计时器,采用51单片机和光电管

单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:光电计时器
  3.   编写:chenyugen
  4.   修改:无
  5. ------------------------------------------------*/
  6. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  7. #define DataPort P2 //定义数据端口 程序中遇到DataPort 则用P0 替换
  8. sbit led=P1^0;
  9. sbit button_l=P1^5;
  10. sbit button_r=P3^5;

  11. sbit wan=P1^1;
  12. sbit qian=P3^2;
  13. sbit bai=P3^3;
  14. sbit shi=P3^4;
  15. sbit ge=P3^6;

  16. sbit g_d=P1^6;

  17. sbit fmq=P1^3;

  18. unsigned int num=0;
  19. unsigned char second=0,min=0;
  20. unsigned char finishflag=0;           //更新时间显示
  21. unsigned char StartTimeFlag=0;        //光电管检测到车离开
  22. unsigned char PrepareTimeFlag=0;  //按键按下,指示灯显示进入准备计时状态

  23. unsigned char code cyg_duanma[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
  24. // 显示段码值0123456789


  25. /*------------------------------------------------
  26. 延时函数,含有输入参数 unsigned int t,无返回值
  27. unsigned int 是定义无符号整形变量,其值的范围是
  28. 0~65535
  29. ------------------------------------------------*/
  30. void Delay(unsigned int t)
  31. {
  32. while(--t);
  33. }

  34. void delay_ms(unsigned int ms)
  35. {
  36.         unsigned int i;
  37.         unsigned char j;
  38.         for(i=0;i<ms;i++)
  39.         {
  40.                 for(j=0;j<200;j++);
  41.                 for(j=0;j<102;j++);
  42.         }
  43. }

  44. /*------------------------------------------------
  45.                     定时器初始化子程序
  46. ------------------------------------------------*/
  47. void Init_Timer0(void)
  48. {
  49. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  50. //TH0=0x00;              //给定初值
  51. //TL0=0x00;
  52. EA=1;            //总中断打开
  53. ET0=1;           //定时器中断打开
  54. TR0=1;           //定时器开关打开
  55. }

  56. /*--------------------------------------------------
  57. 显示函数,含有输入参数 unsigned int t ,无返回值
  58. --------------------------------------------------*/

  59. void display(unsigned char a,unsigned char b,unsigned int c)
  60. {
  61.         wan=0;qian=1;bai=1;shi=1;ge=1;
  62.         DataPort=cyg_duanma[a];
  63.         Delay(200);
  64.         wan=1;qian=0;bai=1;shi=1;ge=1;
  65.         DataPort=cyg_duanma[b/10];
  66.         Delay(200);
  67.         wan=1;qian=1;bai=0;shi=1;ge=1;
  68.         DataPort=cyg_duanma[b%10];
  69.         Delay(200);
  70.         wan=1;qian=1;bai=1;shi=0;ge=1;
  71.         DataPort=cyg_duanma[c/100];
  72.         Delay(200);
  73.         wan=1;qian=1;bai=1;shi=1;ge=0;
  74.         DataPort=cyg_duanma[c/10%10];
  75.         Delay(200);
  76. }



  77. void main()
  78. {
  79.         unsigned char i=0;
  80.        
  81.         led=1;
  82.         button_l=1;
  83.         button_r=1;
  84.         wan=0;qian=0;bai=0;shi=0;ge=0;
  85.         g_d=1;fmq=1;
  86.         Init_Timer0();

  87.         while(1)
  88.         {
  89.                 if(button_l==0)
  90.                 {
  91.                         Delay(1000);
  92.                         if(button_l==0)
  93.                         {
  94.                                 num=888;second=8;min=8;
  95.                                 PrepareTimeFlag=0;
  96.                                 StartTimeFlag=0;
  97.                                 finishflag=0;       
  98.                                 led=1;
  99.                                 fmq=1;
  100.                                 TR0=0;
  101.                         }
  102.                 }

  103.                 if(button_r==0)
  104.                 {
  105.                         Delay(1000);
  106.                         if(button_r==0)
  107.                         {
  108.                                 PrepareTimeFlag=1;
  109.                                 TR0=0;
  110.                                 num=0;second=0;min=0;       
  111.                                 led=0;
  112.                         }
  113.                 }
  114.                        
  115.                 display(min,second,num);       // 调用数码管扫描
  116.                
  117.                 if(g_d==0&&second==0&&min==0&&PrepareTimeFlag==1)
  118.                 {
  119.                         StartTimeFlag=1;
  120.                         TR0=1;//kaiqi定时器
  121.                         fmq=0; //打开蜂鸣器
  122.                 }
  123.                 if(second==1&&min==0)
  124.                 {
  125.                         fmq=1;          //关闭蜂鸣器
  126.                 }

  127.                 if(StartTimeFlag==1&&(second>5||min>0)&&g_d==0)   //再一次检测到车经过
  128.                 {                                                                         
  129.                 //        TR0=0;//关闭定时器
  130.                         PrepareTimeFlag=0;
  131.                         StartTimeFlag=0;
  132.                         fmq=0;
  133.                         finishflag=1;
  134.                 }
  135.         }
  136. }


  137. /*------------------------------------------------
  138.                  定时器中断子程序
  139. ------------------------------------------------*/
  140. void Timer0_isr(void) interrupt 1
  141. {
  142. static unsigned int i;

  143. TH0=(65536-1000)/256;//重新赋值 1ms
  144. TL0=(65536-1000)%256;

  145. if(finishflag==1)
  146. {
  147.         i++;
  148.         if(i==1000)
  149.         {
  150.                 i=0;
  151.                 fmq=1;//关闭蜂鸣器
  152.                 finishflag=0;

  153.         }
  154. }

  155. if(StartTimeFlag==1&&PrepareTimeFlag==1)
  156. {
  157. num++;

  158. if(num==1000)        //大致1s
  159.    {
  160.     num=0;
  161.         second++;
  162.         if(second==60)          //60s
  163.                 {
  164.                         second=0;
  165.                         min++;
  166.                 }
  167.         }
  168.        
  169. }
  170. }
复制代码

所有资料51hei提供下载:
飞思卡尔光电计时器.rar (23.03 KB, 下载次数: 11)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-7-7 23:20 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表