找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机压力计时器程序 原理图PCB文件 LCD1602显示

[复制链接]
跳转到指定楼层
楼主
感应压力后进行计时
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include<reg52.h>                         //头文件
  2. #include<LCD1602.h>
  3. #include<INTERRUPT.h>
  4. #include<AT24C02.h>
  5. #include<ADC0832.h>

  6. #define uchar unsigned char         //宏定义
  7. #define uint unsigned int

  8. /**********************引脚定义************************/
  9. sbit key_set  = P1^0;         //设置键
  10. sbit key_jia  = P1^3;         //加值键
  11. sbit key_jian = P1^6;         //减值键

  12. /**********************变量定义************************/
  13. uchar set_f=0;                  //设置变量  =1进入设置
  14. uint num=0;

  15. /********************************************************
  16. 函数名称:void delayms(uint ms)
  17. 函数作用:毫秒延时函数
  18. 参数说明:
  19. ********************************************************/
  20. void delayms(uint ms)
  21. {
  22.         unsigned char i=100,j;
  23.         for(;ms;ms--)
  24.         {
  25.                 while(--i)
  26.                 {
  27.                         j=10;
  28.                         while(--j);
  29.                 }
  30.         }
  31. }
  32. /********************************************************
  33. 函数名称:void display(void)
  34. 函数作用:显示函数
  35. 参数说明:
  36. ********************************************************/
  37. void display()
  38. {
  39.         ADC0832_read(0);
  40.         if(ADC_date>20)           //检测到有压力感应
  41.         {
  42.                 if(miao1==0&&fen1==0) //还没有开启计时的话
  43.                         TR0=1;                          //开启定时器计时
  44.                 lcd1602_write_character(2,1,"Have pressure");

  45.                 LCD_disp_char(5,2,ASCII[fen1/10]);         //显示设置分
  46.                 LCD_disp_char(6,2,ASCII[fen1%10]);
  47.                 LCD_disp_char(7,2,':');
  48.                 LCD_disp_char(8,2,ASCII[miao1/10]);         //显示设置秒
  49.                 LCD_disp_char(9,2,ASCII[miao1%10]);

  50.                 f=0;
  51.                 T_num=0;
  52.         }
  53.         else
  54.         {
  55.                 f=1;
  56.                 //TR0=0;                                  //压力释放后,关闭定时器计时
  57.                 if(TR0==0)
  58.                 {
  59.                         lcd1602_write_character(2,1," No pressure ");
  60.                         lcd1602_write_character(5,2,"     ");
  61.                 }
  62.                 //miao1=0;                          //计时时间清0
  63.                 //fen1=0;
  64.                 //buzz=1;                                  //关闭蜂鸣器
  65.         }       
  66. }

  67. /********************************************************
  68. 函数名称:void display2()
  69. 函数作用:设置时间
  70. 参数说明:
  71. ********************************************************/
  72. void display2()
  73. {
  74.         num++;

  75.         lcd1602_write_character(2,1,"Set MAX time");
  76.         if(num%2==0)        //偶数次显示,奇数次不显示。这样就会有闪烁效果,可以清楚看到当前设置的是哪个值
  77.         {               
  78.                 LCD_disp_char(5,2,ASCII[fen/10]);         //显示设置分
  79.                 LCD_disp_char(6,2,ASCII[fen%10]);
  80.                 LCD_disp_char(7,2,':');
  81.                 LCD_disp_char(8,2,ASCII[miao/10]);         //显示设置秒
  82.                 LCD_disp_char(9,2,ASCII[miao%10]);
  83.         }
  84.         else                        //奇数次不显示
  85.         {
  86.                 switch(set_f)//根据当前设置的内容,对应位置闪烁
  87.                 {
  88.                         case 1: lcd1602_write_character(5,2,"  "); break;
  89.                         case 2: lcd1602_write_character(8,2,"  "); break;
  90.                         default: break;
  91.                 }
  92.         }
  93. }
  94. /********************************************************
  95. 函数名称:void scan(void)
  96. 函数作用:按键查询处理函数
  97. 参数说明:
  98. ********************************************************/
  99. void scan(void)
  100. {
  101.         if(key_set==0)                                                  //按键按下
  102.         {  
  103.                 delayms(7);                                                  //延时消抖
  104.                 if(key_set==0)                                          //再次确认按键按下
  105.                 {
  106.                         set_f++;                                  //设置变量+1
  107.                         if(set_f>2)                                  //全部设置完成,退出设置
  108.                         {
  109.                                 set_f=0;                          //重置设置变量
  110.                
  111.                                 AT24C02_write_date(0,fen); //写入【分】数据保存
  112.                                 AT24C02_write_date(1,miao);//写入【秒】数据保存
  113.                         }
  114.                 }
  115.                 while(!key_set);
  116.         }
  117.        
  118.         //加值
  119.         if(key_jia==0)                                                           //按键按下
  120.         {  
  121.                 delayms(7);                                                           //延时消抖
  122.                 if(key_jia==0)                                                   //再次确认按键按下
  123.                 {
  124.                          if(set_f==1)                                  //设置时间-分
  125.                         {
  126.                                 if(fen<99)                              //最大可设置99分
  127.                                         fen++;                                  //时间-分+1
  128.                         }
  129.                         if(set_f==2)                                  //设置时间-秒
  130.                         {
  131.                                 if(miao<59)                              //最大可设置59秒
  132.                                         miao++;                                  //时间-秒+1
  133.                                 else                                          
  134.                                         miao=0;                                  //时间-秒清0
  135.                         }       
  136.                 }
  137.         }
  138.        
  139.         //减值
  140.         if(key_jian==0)                                                          //按键按下
  141.         {  
  142.                 delayms(7);                                                          //延时消抖
  143.                 if(key_jian==0)                                                  //再次确认按键按下
  144.                 {
  145.                         if(set_f==1)                                  //设置时间-分
  146.                         {
  147.                                 if(fen!=0)                                  //最小可设置到0
  148.                                         fen--;                                  //时间-分-1
  149.                         }
  150.                         if(set_f==2)                                  //设置时间-秒
  151.                         {
  152.                                 if(miao!=0)                                  //最小可设置到0
  153.                                         miao--;                                  //时间-秒-1
  154.                                 else
  155.                                         miao=59;
  156.                         }
  157.                 }
  158.         }       
  159. }
  160. /********************************************************
  161. 函数名称:void mian()
  162. 函数作用:主函数
  163. 参数说明:
  164. ********************************************************/
  165. void main()
  166. {
  167.         if(key_jian==0)
  168.         {  
  169.                 delayms(100);
  170.                 if(key_jian==0)
  171.                 {
  172.                         AT24C02_write_date(0,0); //写入【分】数据保存
  173.                         AT24C02_write_date(1,10);//写入【秒】数据保存
  174.                 }
  175.         }
  176.         fen=AT24C02_read_date(0);           //读取存储的【分】数据
  177.         miao=AT24C02_read_date(1);           //读取存储的【秒】数据

  178.         T0_init(); //定时器初始化
  179.         LCD_init();//LCD1602初始化
  180.         while(1)   //死循环
  181.         {
  182.                 scan();//按键扫描并处理
  183.                 if(set_f==0)    //正常检测状态
  184.                 {
  185.                         num++;
  186.                         if(num%1500==0)
  187.                         {
  188.                                 num=0;
  189.                                 display();
  190.                         }
  191.                 }
  192.                 else                     //设置时间状态
  193.                         display2();         
  194.         }
  195. }
复制代码

程序和原理图PCB下载:
压力计时器.zip (1.12 MB, 下载次数: 55)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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