找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机双路压力监测报警系统设计(仿真与源程序)

[复制链接]
跳转到指定楼层
楼主
这个基于C51单片机的双路压力监测报警系统是本人所做课程设计,已通过验收,没有bug,功能更完善,所附包含proteus仿真文件,源代码,使用说明,可以做一个不错的参考。
所完成功能为模拟电路输入测量两路压力值,量程范围0~100MPa,带有LED报警功能,可以自行设置上限,压力测量值分时显示。

使用说明:
1.开始仿真,压力上限初始值为99MPa;
2.点击按钮button(要使数码管全部清零),在键盘处输入上限值;
3.上限值修改成功,重新开始显示,显示第一路时左侧带有上限值标识,显示第二路时左侧没有标识;
4.当测量数值超过了所设定上限,二极管闪烁报警;
5.结束仿真。


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #include<intrins.h>          
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define a DWORD [0x40]
  7. #define b DWORD [0x50]
  8.                                                  
  9. /**************函数声明部分*************/
  10. void jianpan1(void);                         
  11. void jianpan2(void);
  12. void DelayMS(uint x);
  13. void int_CHANGE(uint y);
  14. void Display1(void);
  15. void Display2(void);
  16. void beep(void);

  17. uchar code ledtab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};    //0~9共阴字型码
  18. uchar data ledbuf[8]={0x6f,0x6f,0x73,0x48,0x00,0x00,0x00,0x00};    //初始显示P=(数据缓冲区)
  19. sbit OE=P2^0;                               
  20. sbit EOC=P2^1;               
  21. sbit ST=P2^2;
  22. sbit CLK=P2^3;               
  23. sbit LE1=P2^4;
  24. sbit LE2=P2^5;
  25. sbit BUTTON=P2^6;  
  26. sbit BEEP=P2^7;
  27. sbit r4=P1^7;
  28. uchar Pre_KeyNo,KeyNo;          //存储键值
  29. uchar num1,num2,num;          //存储报警上限值

  30. void main()                                  //主函数
  31. {
  32.         uint i;
  33.         TMOD=0x02;                  //方式2,8位自动重装初值定时方式
  34.         TH0=0x14;                  //计数初值寄存器
  35.         TL0=0x00;                  //8位计数器
  36.         IE=0x82;                  //开总中断,并允许T0中断
  37.         TR0=1;                           //启动计数
  38.     P2=0x4f;                  //端口初始化
  39.         num1=9;                          //报警上限值初始化
  40.         num2=9;
  41.         num=100;
  42.         r4=0;
  43.         while(1)
  44.         {          
  45.             if(BUTTON==0)           //按键按下则进行键扫
  46.             jianpan1();
  47.                         r4=0;
  48.                         i=0;
  49.                 ST=0;ST=1;ST=0;           //启动A/D       
  50.                 while(EOC==0);       
  51.                 OE=1;
  52.                 a=P3*100/255;           //电压的实际值
  53.                 a=a*10;
  54.                 int_CHANGE(a);       
  55.                 Display1();
  56.                 Display2();
  57.                 OE=0;
  58.                 if(a>=(num*10))
  59.                         beep();
  60.                 while(i<100)
  61.                 {
  62.                         Display1();
  63.                   Display2();
  64.                         i++;
  65.                 }
  66.                 DelayMS(20);
  67.                 r4=1;
  68.                 i=0;
  69.                 ST=0;ST=1;ST=0;           //启动A/D       
  70.                 while(EOC==0);       
  71.                 OE=1;
  72.                 b=P3*100/255;           //电压的实际值
  73.                 b=b*10;
  74.                 int_CHANGE(b);       
  75.                 Display1();
  76.                 Display2();
  77.                 OE=0;
  78.                 if(b>=(num*10))
  79.                         beep();
  80.                         while(i<100)
  81.                 {
  82.                         Display1();
  83.                   Display2();
  84.                         i++;
  85.                 }
  86.                
  87.                 DelayMS(20);
  88.         }
  89.        
  90. }

  91. void jianpan1()                //键盘输入存储函数
  92. {
  93.         uchar i=2,j=0;   
  94.     P0=0x00;
  95.         while(i)
  96.         {
  97.                 P1=0xf0;                          //准备键扫
  98.         Pre_KeyNo=16,KeyNo=16;
  99.                 if(P1!=0xf0)
  100.         jianpan2();                   //键盘扫描
  101.                 if(Pre_KeyNo!=KeyNo)
  102.                 {        if(j==1)
  103.                                 num2=KeyNo;      
  104.             if(j==0)
  105.                         {        num1=KeyNo;      
  106.                                 j=1;
  107.                         }
  108.                         while(P1!=0xf0)
  109.             P1=0xf0;
  110.                         i--;
  111.                 }
  112.                 DelayMS(100);
  113.         }
  114.         num=10*num1+num2;
  115. }

  116. void jianpan2()                //键盘扫描函数   
  117. {
  118.         uchar Tmp;
  119.         P1=0x0f;       
  120.         DelayMS(1);
  121.         Tmp=P1^0x0f;
  122.         switch(Tmp)       
  123.         {
  124.                 case 1:        KeyNo=0;break;        //第一列按下
  125.                 case 2:        KeyNo=1;break;        //第二列按下
  126.                 case 4: KeyNo=2;break;        //第三列按下
  127.                 case 8:        KeyNo=3;break;        //第四列按下
  128.                 default:KeyNo=16;               
  129.         }
  130.         P1=0xf0;   
  131.         DelayMS(1);
  132.         Tmp=P1>>4^0x0f;
  133.         switch(Tmp)       
  134.         {
  135.                 case 1:        KeyNo+=0;break;
  136.                 case 2:        KeyNo+=4;break;
  137.                 case 4:        KeyNo+=8;break;
  138.                 case 8:        KeyNo+=12;
  139.         }
  140. }


  141. void int_CHANGE(uint y)
  142. {
  143. if(y==1000)                                //满量程输入时显示100MPa
  144. {  
  145.     ledbuf[4]=0x06;
  146.         ledbuf[5]=0x3f;
  147.         ledbuf[6]=0xbf;
  148.         ledbuf[7]=0x3f;
  149. }
  150. else {
  151. ledbuf[4]=0x00;
  152. ledbuf[5]=y/100;             //得到十位
  153. ledbuf[5]=ledtab[ledbuf[5]]; //十位转换为字型码

  154. ledbuf[7]=y%100;
  155. ledbuf[6]=ledbuf[7]/10;          //得到个位
  156. ledbuf[6]=ledtab[ledbuf[6]]; //得到十分位字型码                          
  157. ledbuf[7]=ledbuf[7]%10;          //得到十分位
  158. ledbuf[7]=ledtab[ledbuf[7]]; //得到个位字型码

  159. ledbuf[6]=ledbuf[6]|0x80;    //个位加固定小数点
  160.   
  161.   /*前导0的不显示处理*/
  162.   if(ledbuf[5]==0x3f)         //如果十位为0,则十位的0不显示,显示格式为x.x
  163.    ledbuf[5]=0x00;  
  164.   }

  165. }


  166. void Display1()       //显示函数  
  167. {       
  168.     P0=~0x80;               
  169.         LE2=1;  
  170.         LE2=0;
  171.         P0=ledbuf[7];
  172.         LE1=1;  
  173.         LE1=0;
  174.         DelayMS(2);
  175.         P0=0x00;
  176.         LE1=1;  
  177.         LE1=0;

  178.         P0=~0x40;               
  179.         LE2=1;
  180.         LE2=0;
  181.         P0=ledbuf[6];
  182.         LE1=1;
  183.         LE1=0;
  184.         DelayMS(2);
  185.         P0=0x00;
  186.         LE1=1;  
  187.         LE1=0;

  188.         P0=~0x20;               
  189.         LE2=1;
  190.         LE2=0;
  191.         P0=ledbuf[5];
  192.         LE1=1;
  193.         LE1=0;
  194.     DelayMS(2);
  195.         P0=0x00;
  196.         LE1=1;  
  197.         LE1=0;

  198.         P0=~0x10;               
  199.         LE2=1;
  200.         LE2=0;
  201.         P0=ledbuf[4];
  202.         LE1=1;
  203.         LE1=0;
  204.     DelayMS(2);
  205.         P0=0x00;
  206.         LE1=1;  
  207.         LE1=0;

  208.         P0=~0x08;               
  209.         LE2=1;
  210.         LE2=0;
  211.         P0=ledbuf[3];
  212.         LE1=1;
  213.         LE1=0;
  214.     DelayMS(2);
  215.         P0=0x00;
  216.         LE1=1;  
  217.         LE1=0;

  218.         P0=~0x04;               
  219.         LE2=1;
  220.         LE2=0;
  221.         P0=ledbuf[2];
  222.         LE1=1;
  223.         LE1=0;
  224.     DelayMS(2);
  225.         P0=0x00;
  226.         LE1=1;  
  227.         LE1=0;
  228. }

  229. void Display2()                         //显示上限值
  230. {                                                               

  231.     P0=~0x02;               
  232.         LE2=1;  
  233.         LE2=0;
  234.         P0=ledtab[num2];
  235.         LE1=1;  
  236.         LE1=0;
  237.         DelayMS(5);
  238.         P0=0x00;
  239.         LE1=1;  
  240.         LE1=0;

  241.         P0=~0x01;               
  242.         LE2=1;
  243.         LE2=0;
  244.         P0=ledtab[num1];
  245.         LE1=1;
  246.         LE1=0;
  247.         DelayMS(5);
  248.         P0=0x00;
  249.         LE1=1;  
  250.         LE1=0;
  251. ……………………

  252. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
双路压力监测报警系统.zip (35.88 KB, 下载次数: 83)



评分

参与人数 2黑币 +110 收起 理由
mini@ + 10
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:61206 发表于 2018-1-18 19:16 | 只看该作者
非常不错的,下载下来慢慢学习。
回复

使用道具 举报

板凳
ID:271596 发表于 2018-3-7 14:44 | 只看该作者
非常不错的
回复

使用道具 举报

地板
ID:289218 发表于 2018-3-8 15:29 | 只看该作者
感谢分享,学习了~
回复

使用道具 举报

5#
ID:392535 发表于 2019-3-4 14:28 | 只看该作者
有相关论文吗
回复

使用道具 举报

6#
ID:484675 发表于 2019-3-5 11:15 | 只看该作者
为什么我在仿真的时候不能设置压力数值啊  
回复

使用道具 举报

7#
ID:484675 发表于 2019-3-5 11:26 | 只看该作者
为什么我下载之后仿真不好用啊,我就把源程序重新生成了一下导到c51里啊,别的都没动
回复

使用道具 举报

8#
ID:392535 发表于 2019-3-6 22:55 | 只看该作者
有ACD0808芯片接口程序的编写解释吗
回复

使用道具 举报

9#
ID:538050 发表于 2019-5-19 15:41 | 只看该作者
想问下楼主,怎么调整压力上限值,可以加我教一下嘛 ?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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