找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝桥杯单片机超声波测距报警实时时钟电路电路具体功能与程序

[复制链接]
跳转到指定楼层
楼主
ID:1073111 发表于 2023-4-25 14:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要求:1. 电路通电后进入初始化状态:灯L1亮,数码管全亮,蜂鸣器接通,1s后全部关闭,显示时间设定11-50-59。2. 按下S7按键切换显示实时时钟XX-XX-XX、显示超声波测量距离XXX。3. 显示实时时钟状态下,按S6按键进行时间调整,第一次按下S6进入时调整, “时”闪烁;第二次按下S6进入分调整,“分”闪烁。再一次按下退出调整。S4、S5为调节数值S5+,S4-(时间距离)的加减按键。4. 显示超声波测距状态下,按S6按键进行报警距离调整,S6按第一次进入调整状态,第二次按下退出,将调节后的数值保存到24C02中。S4、S5为调节数值S5+,S4-(时间距离)的加按键。显示超声波报警距离--XXX。5. 超声波测距报警初值设定为30cm,超声波检测超过设定值X不报警,小于X立即报警,小于1.2倍的X, L1灯闪烁。6. 设计一个欠压电路,12V供电,电压小于10V切断电路电源。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #include"dsp.h"                                        //显示函数头文件
  6. #include"1302.h"                                
  7. #include"chaoshenbo.h"
  8. #include"iic.h"

  9. sbit s7=P3^0;                                        //按键
  10. sbit s6=P3^1;
  11. sbit s5=P3^2;
  12. sbit s4=P3^3;

  13. uint sec_add;                   //中断1秒标志
  14. bit sec_flag;

  15. uint sec_szadd;
  16. bit sec_szflag;

  17. uchar bj_jl;   //报警距离

  18. uint ss;  //距离函数

  19. uchar sz_time[3];

  20. uchar ms_add;    //模式标志位
  21. bit ms_flag;

  22. bit ms_HCflag;         //测距模式下  设置与正常显示的标志位   为0时正常显示距离  为1时设置报警距离

  23. void int_t0();                //定时器T0、T1初始化   

  24. void open_led1();
  25. void cls_led1();
  26. void open_beep();
  27. void cls_beep();        

  28. void int_sd();   //上电初始化

  29. void moshi();                                   //正常显示模式
  30. void sz_moshi();                           //设置时间时的显示模式

  31. void szHC_moshi();                           //设置报警距离时的显示模式

  32. void key_s7();                                   //s7功能按钮,设置时间模式或者距离模式
  33. void key_s6_time();                           //s6设置时间模式功能按钮
  34. void key_s6_HC();                           //s6设置距离模式功能按钮

  35. void jiaohu();                                   //功能交互函数


  36. void main()
  37. {                                                         
  38.         int_t0();                                     //定时器初始化
  39.         int_sd();                                    //上电初始化
  40.         int_1302();                                          //初始化1302
  41. //        bj_jl=30;                                        //设置报警距离                                                  第一次写入程序时要把这两行屏蔽的恢复  然后再屏蔽掉再写入  
  42. //        w_iic(0x00,bj_jl);                        //将报警距离写入24C02
  43.         bj_jl=r_iic(0x00);                        //从24C02中读取报警距离
  44.         while(1)
  45.         {
  46.                 red_1302();                                //读取1302时间

  47.                 if(sec_flag)                        //1s读取一次超声波距离
  48.                 {
  49.                         ss=red_HC();
  50.                         sec_flag=0;
  51.                 }

  52.                 key_s7();                   //s7按键功能

  53.                 jiaohu();                   //功能交互
  54.                

  55.                 if(ss<bj_jl)                   //报警函数
  56.                 {
  57.                         open_beep();
  58.                 }        
  59.                 else
  60.                 {cls_beep();}

  61.                 if(ss<(uint)(bj_jl*1.2))                //小与1.2倍距离时led1闪烁
  62.                 {
  63.                         if(sec_szflag)
  64.                         open_led1();
  65.                         else
  66.                         cls_led1();
  67.                 }  else cls_led1();

  68.         }
  69. }

  70. void t0() interrupt 1
  71. {
  72.         TH0=(65535-1000)/256;
  73.         TL0=(65535-1000)&256;

  74.         sec_add++;                                                  //1秒后sec_flag标志位置1
  75.         if(sec_add==200)
  76.         {
  77.                 sec_add=0;
  78.                 sec_flag=1;
  79.         }

  80.         sec_szadd++;
  81.         if(sec_szadd==1000)
  82.         {
  83.                 sec_szadd=0;
  84.                 sec_szflag=~sec_szflag;
  85.         }

  86.         display();
  87. }

  88. void int_t0()
  89. {
  90.         TMOD=0X11;
  91.         EA=1;
  92.         ET0=1;
  93.         TH0=(65535-1000)/256;
  94.         TL0=(65535-1000)&256;
  95.         TH1=0;
  96.         TL1=0;
  97.         TR0 = 1;                //定时器0开始计时
  98. }


  99. void open_led1()
  100. {
  101.         P2=(P2&0x1f)|0x80;
  102.         P0=0x7f;
  103.         P2&=0x1f;
  104. }

  105. void cls_led1()
  106. {
  107.         P2=(P2&0x1f)|0x80;
  108.         P0=0xff;
  109.         P2&=0x1f;
  110. }

  111. void open_beep()
  112. {
  113.         P2=(P2&0x1f)|0xa0;
  114.         P0=0xff;
  115.         P2&=0x1f;
  116. }

  117. void cls_beep()
  118. {
  119.         P2=(P2&0x1f)|0xa0;
  120.         P0=0x00;
  121.         P2&=0x1f;
  122. }

  123. void int_sd()
  124. {
  125.         open_led1();                                                                                                                                                         //开led1
  126.         dspbuf[0]=dspbuf[1]=dspbuf[2]=dspbuf[3]=dspbuf[4]=dspbuf[5]=dspbuf[6]=dspbuf[7]=12;                 //数码管全量
  127.         open_beep();                                                                                                                                                         //开蜂鸣器
  128.         while(!sec_flag);                                                                                                                                                 //等待1秒
  129.         cls_led1();                                                                                                                                                                 //关led1  关显示   关蜂鸣器  sec_flag标志位清零
  130.         dspbuf[0]=dspbuf[1]=dspbuf[2]=dspbuf[3]=dspbuf[4]=dspbuf[5]=dspbuf[6]=dspbuf[7]=11;
  131.         cls_beep();
  132.         sec_flag=0;
  133. }

  134. void delay(uint time)
  135. {
  136.         uint i;
  137.         while(time--)
  138.         {
  139.                 for(i=0;i<800;i++);
  140.         }
  141. }

  142. void moshi()                                                   //显示模式   
  143. {
  144.         uchar x;
  145.         x=ms_flag;
  146.         switch(x)
  147.         {
  148.                 case 0: dspbuf[0]=shi/10;          //显示时间模式
  149.                                 dspbuf[1]=shi%10;
  150.                                 dspbuf[2]=10;
  151.                                 dspbuf[3]=min/10;
  152.                                 dspbuf[4]=min%10;
  153.                                 dspbuf[5]=10;
  154.                                 dspbuf[6]=sec/10;
  155.                                 dspbuf[7]=sec%10;
  156.                                 break;

  157.                 case 1: dspbuf[5]=ss/100;          //显示距离模式
  158.                                 dspbuf[6]=ss%100/10;
  159.                                 dspbuf[7]=ss%10;
  160.                                 dspbuf[0]=11;
  161.                                 dspbuf[1]=11;
  162.                                 dspbuf[2]=11;
  163.                                 dspbuf[3]=11;
  164.                                 dspbuf[4]=11;
  165.                                 break;

  166.         }
  167. }

  168. void key_s7()
  169. {
  170.         if(s7==0)
  171.         {
  172.                 delay(5);
  173.                 if(s7==0)
  174.                 {
  175.                         ms_flag=~ms_flag;                //模式 当MS_FLAG=0时 为显示时间模式  当MS_FLAG=1时为显示距离模式
  176.                         while(!s7);
  177.                 }
  178.         }
  179. }

  180. void key_s6_time()                   //时间模式下 s6按键功能函数
  181. {
  182.         if(s6==0)
  183.         {
  184.                 delay(5);
  185.                 if(s6==0)
  186.                 {
  187.                         if(ms_add==0)                           //如果s6被按下
  188.                         {
  189.                                 sz_time[0]=shi;                   //储存当前的时间
  190.                                 sz_time[1]=min;
  191.                                 sz_time[2]=sec;
  192.                         }
  193.                         ms_add++;
  194.                         if(ms_add==3)                                   //当按钮按下三次以后 将设置后的时间写入1302
  195.                         {
  196.                                 ms_add=0;                                   //标志清零
  197.                                 write_13(0x8e,0x00);
  198.                                 write_13(0x80,sz_time[2]);                //秒存
  199.                                 write_13(0x82,sz_time[1]);                //分存
  200.                                 write_13(0x84,sz_time[0]);                //时存
  201.                                 write_13(0x8e,0x80);
  202.                         }
  203.                         while(!s6);
  204.                 }
  205.         }
  206. }

  207. void key_s6_HC()                                                           //距离模式时  s6按钮功能函数
  208. {
  209.         if(s6==0)
  210.         {
  211.                 delay(5);
  212.                 if(s6==0)
  213.                 {
  214.                         if(ms_HCflag)                                                //再次按下时将设置的报警距离存入24C02
  215.                         {
  216.                                 w_iic(0x00,bj_jl);
  217.                                 delay(10);
  218.                         }
  219.                         ms_HCflag=~ms_HCflag;
  220.                         while(!s6);
  221.                 }
  222.         }
  223. }

  224. void sz_moshi()                                                                                                         //设置时间的显示模式
  225. {
  226.         switch(ms_add)                                                                                                 //ms_add为1时显示case 1的内容 时闪烁   为2时显示case 2的内容 分闪烁
  227.         {
  228.                 case 1: if(sec_szflag)                                                                          //小时位闪烁
  229.                                 {
  230.                                         dspbuf[0]=sz_time[0]/10;
  231.                                         dspbuf[1]=sz_time[0]%10;
  232.                                 }  else
  233.                                 {
  234.                                         dspbuf[0]=11;
  235.                                         dspbuf[1]=11;
  236.                                 }
  237.                                 dspbuf[2]=10;                                                                        
  238.                                 dspbuf[3]=sz_time[1]/10;                                                  //显示按下设置键后存储的时间                                                   
  239.                                 dspbuf[4]=sz_time[1]%10;
  240.                                 dspbuf[5]=10;
  241.                                 dspbuf[6]=sz_time[2]/10;
  242.                                 dspbuf[7]=sz_time[2]%10;
  243.                                 break;
  244.                 case 2: if(sec_szflag)
  245.                                 {
  246.                                         dspbuf[3]=sz_time[1]/10;
  247.                                         dspbuf[4]=sz_time[1]%10;
  248.                                 }  else
  249.                                 {
  250.                                         dspbuf[3]=11;
  251.                                         dspbuf[4]=11;
  252.                                 }
  253.                                 dspbuf[2]=10;
  254.                                 dspbuf[0]=sz_time[0]/10;
  255.                                 dspbuf[1]=sz_time[0]%10;
  256.                                 dspbuf[5]=10;
  257.                                 dspbuf[6]=sz_time[2]/10;
  258.                                 dspbuf[7]=sz_time[2]%10;
  259.                                 break;

  260.         }         
  261. }

  262. void szHC_moshi()
  263. {
  264.         dspbuf[5]=bj_jl/100;
  265.         dspbuf[6]=bj_jl%100/10;
  266.         dspbuf[7]=bj_jl%10;
  267.         dspbuf[0]=11;
  268.         dspbuf[1]=11;
  269.         dspbuf[2]=11;
  270.         dspbuf[3]=11;
  271.         dspbuf[4]=11;
  272.         if(s5==0)
  273.         {
  274.                 delay(5);
  275.                 if(s5==0)
  276.                 {
  277.                         bj_jl++;
  278.                         while(!s5);
  279.                 }
  280.         }

  281.         if(s4==0)
  282.         {
  283.                 delay(5);
  284.                 if(s4==0)
  285.                 {
  286.                         bj_jl--;
  287.                         while(!s4);
  288.                 }
  289.         }

  290.         
  291. }

  292. void jiaohu()
  293. {
  294.           if(ms_flag==0)
  295.         {
  296.                 key_s6_time();
  297.                 if(ms_add==0)                        //s6按键没有被按下时 ms_add为0          显示正常界面
  298.                 {
  299.                         moshi();
  300.                 }
  301.                 else
  302.                 {
  303.                         sz_moshi();                   //s6被按下后  ms-add不为0  显示设置时间模式函数
  304.                         if(s5==0)                   //如果s5按下 对应的时间加1
  305.                         {
  306.                                 delay(5);
  307.                                 if(s5==0)
  308.                                 {
  309.                                         sz_time[ms_add-1]++;
  310.                                         while(!s5);
  311.                                 }
  312.                         }

  313.                         if(s4==0)                   //如果s4按下 对应的时间减1
  314.                         {
  315.                                 delay(5);
  316.                                 if(s4==0)
  317.                                 {
  318.                                         sz_time[ms_add-1]--;
  319.                                         while(!s4);
  320.                                 }
  321.                         }
  322.                 }
  323.                
  324.         }        
  325.         else
  326.         {                                                 //显示距离模式时
  327.                 key_s6_HC();
  328.                 if(ms_HCflag==0)
  329.                 moshi();
  330.                 else
  331.                 szHC_moshi();                 //设置报警距离显示模式
  332.         }
  333. }
复制代码
Keil代码下载:
超声波测距及时钟.rar (144.53 KB, 下载次数: 33)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1113104 发表于 2024-3-21 21:41 来自手机 | 只看该作者
楼主这个真的很全啊!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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