51单片机+MPX4115+MCP3204气压监测系统源程序(Proteus模拟仿真)

[复制链接]
查看1 | 回复0 | 2021-7-12 22:12:28 | 显示全部楼层 |阅读模式
做了Protues仿真的气压监测系统,通过对气压监测系统设计与仿真的学习与动手得出结论:通过以52单片机为主控芯片,MPX4115作为气压监测原件,以MCP3204作为AD数模转换芯片,并配以时钟芯片以及虚拟串口等,可成功实现气压监测系统设计与仿真,并实现以MPX4115为探测元件,结合单片机扩展电路组成气压监测系统,完成定时气压数据监测记录、显示远传等功能的硬件设计及软件编程。并配合上位机实现与PC机进行通信,对于实际工业生产具有实用价值。此种方式价格低廉其易于测试,实用价值大,经过技术升级和精度提升,可以用于实现气压监测报警。此系统有点延时,因为没用中断。中断一加上就不好使了,是自己技术问题。哈哈
需要学习的小伙伴可以下载学习。压缩包中第一个文件夹是KEIL工程,第2个文件是Protues8.11工程文件。虚拟串口软件可以百度下载。
本系统还有很多不足,功能也较为简陋,有问题可以留言交流,系统中有一个按键,可以切换时间显示还是气压显示,但需要摁多一点时间才能切换。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png
部分源码:完整源码见附件
  1. #include<reg52.h>
  2. #include<INTRINS.H>

  3. #define  uchar  unsigned char      //8bit  0~255
  4. #define  schar  signed char        //8bit  -128~127
  5. #define  uint   unsigned int       //16bit 0~65536
  6. #define  sint   signed int         //16bit -32768~32767
  7. #define  slong   signed long         //32bit -214783648~2147483647         

  8. #define  delay1us  _nop_();_nop_();_nop_();            // delay 1 us(for fos=12M)
  9. unsigned char dispbuf[]="0123456789";
  10. unsigned char code Pre[]="Pressure:";
  11. unsigned char code Dat[]="Date:20";
  12. unsigned char code Warml[]="Warm:Too Low";
  13. unsigned char code Warmh[]="Warm:Too High";
  14. unsigned char code Normal[]="Normal";
  15.   unsigned char code Time[]="Time:";
  16. unsigned int A[]={ 48,49,50,51,52,53,54,55,56,57 } ;
  17. unsigned char code digit[10]={"0123456789"};   //定义字符数组显示数字
  18. int i, yue,ri;shi,fen, miao,zs;
  19.    unsigned char second,minute,hour,day,month,year;      //分别储存苗、分、小时,日,月,年
  20.   unsigned char ReadValue;

  21. sbit clk = P1^4;   // clock signel
  22. sbit dout = P1^5;  // data get out
  23. sbit din = P1^6 ;   // data put in
  24. sbit cs = P1^7;    // cs selt
  25. sbit RS  = P2^5;        //寄存器选择, “1” 数据;“0” 指令
  26. sbit RW  = P2^6;        //读写选择    “1”读;“0” 写
  27. sbit EN  = P2^7;
  28. sbit button=P2^0;       //使能    给个下降沿时执行命令
  29. sbit Q=          P2^1;
  30. sbit blue=P2^2;
  31. sbit red=P2^3;
  32. sbit green=P2^4;

  33.                                          
  34. sbit DATA=P1^1;   //位定义1302芯片的接口,数据输出端定义在P1.1引脚
  35. sbit RST=P1^2;    //位定义1302芯片的接口,复位端口定义在P1.1引脚
  36. sbit SCLK=P1^0;   //位定义1302芯片的接口,时钟输出端口定义在P1.1引脚
  37. //sfr  DBPort  = 0xb0;    //数据端口   在此选P3

  38.                         float fun (float h )//注意区分C语言中double和float类型所占存储空间
  39. {
  40.     int t;  //存储中间变量
  41.         t = (int)(h*100+5);//h乘以10的保留位数加一次方,再加5,如果大于10会有进位产生 除以10确保保留2位小数
  42.         return h = (float)t/100.0;//注意 此处和前行代码 都运用了强制转化
  43. }



  44.                 void delay_50us(unsigned int t)         
  45. {
  46. unsigned int j,k;
  47. for (;t>0;t--)
  48. {
  49.   for(j=10;j>0;j--)
  50.   {
  51.    for(k=1;k>0;k--);
  52.   }
  53. }
  54. }

  55.            void delay2s(void)   //误差 -0.000000000455us
  56. {
  57.     unsigned char a,b,c;
  58.     for(c=23;c>0;c--)
  59.         for(b=216;b>0;b--)
  60.             for(a=184;a>0;a--);
  61. }
  62. /*****************************************************
  63. 函数功能:延时若干微秒
  64. 入口参数:n
  65. ***************************************************/
  66. void delaynus(unsigned char n)
  67. {
  68. unsigned char i;
  69. for(i=0;i<n;i++)
  70.       ;
  71. }

  72. /*****************************************************
  73. 函数功能:向1302写一个字节数据
  74. 入口参数:x
  75. ***************************************************/
  76. void Write1302(unsigned char dat)
  77. {
  78.   unsigned char i;
  79.   SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  80.   delaynus(2);       //稍微等待,使硬件做好准备
  81.   for(i=0;i<8;i++)      //连续写8个二进制位数据
  82.     {
  83.             DATA=dat&0x01;    //取出dat的第0位数据写入1302
  84.                 delaynus(2);       //稍微等待,使硬件做好准备
  85.                  SCLK=1;           //上升沿写入数据
  86.                  delaynus(2);      //稍微等待,使硬件做好准备
  87.                  SCLK=0;           //重新拉低SCLK,形成脉冲
  88.                  dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
  89.           }
  90.         
  91. }
  92. /*****************************************************
  93. 函数功能:根据命令字,向1302写一个字节数据
  94. 入口参数:Cmd,储存命令字;dat,储存待写的数据
  95. ***************************************************/
  96. void WriteSet1302(unsigned char Cmd,unsigned char dat)
  97. {
  98.    RST=0;           //禁止数据传递
  99.    SCLK=0;          //确保写数居前SCLK被拉低
  100.         RST=1;           //启动数据传输
  101.         delaynus(2);     //稍微等待,使硬件做好准备
  102.         Write1302(Cmd);  //写入命令字
  103.         Write1302(dat);  //写数据
  104.         SCLK=1;          //将时钟电平置于已知状态
  105.         RST=0;           //禁止数据传递
  106. }
  107. /*****************************************************
  108. 函数功能:从1302读一个字节数据
  109. 入口参数:x
  110. ***************************************************/
  111. unsigned char Read1302(void)
  112. {
  113.    unsigned char i,dat;
  114.         delaynus(2);       //稍微等待,使硬件做好准备
  115.         for(i=0;i<8;i++)   //连续读8个二进制位数据
  116.          {
  117.            dat>>=1;       //将dat的各数据位右移1位,因为先读出的是字节的最低位
  118.                 if(DATA==1)    //如果读出的数据是1
  119.                  dat|=0x80;    //将1取出,写在dat的最高位
  120.                  SCLK=1;       //将SCLK置于高电平,为下降沿读出
  121.                  delaynus(2);  //稍微等待
  122.                  SCLK=0;       //拉低SCLK,形成脉冲下降沿
  123.                  delaynus(2);  //稍微等待
  124.           }         
  125.   return dat;        //将读出的数据返回
  126. }  
  127. /*****************************************************
  128. 函数功能:根据命令字,从1302读取一个字节数据
  129. 入口参数:Cmd
  130. ***************************************************/
  131. unsigned char  ReadSet1302(unsigned char Cmd)
  132. {
  133.   unsigned char dat;
  134.   RST=0;                 //拉低RST
  135.   SCLK=0;                //确保写数居前SCLK被拉低
  136.   RST=1;                 //启动数据传输
  137.   Write1302(Cmd);       //写入命令字
  138.   dat=Read1302();       //读出数据
  139.   SCLK=1;              //将时钟电平置于已知状态
  140.   RST=0;               //禁止数据传递
  141.   return dat;          //将读出的数据返回
  142. }
  143. /*****************************************************
  144. 函数功能: 1302进行初始化设置
  145. ***************************************************/
  146. void Init_DS1302(void)
  147. {        

  148.           yue=5;
  149.           ri=24;
  150.           shi=20;fen=15;
  151.           miao=26;
  152.    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
  153.    WriteSet1302(0x80,((miao/10)<<4|(miao%10)));   //根据写秒寄存器命令字,写入秒的初始值
  154.         WriteSet1302(0x82,((fen/10)<<4|(fen%10)));   //根据写分寄存器命令字,写入分的初始值
  155.         WriteSet1302(0x84,((shi/10)<<4|(shi%10))); //根据写小时寄存器命令字,写入小时的初始值
  156.         WriteSet1302(0x86,((ri/10)<<4|(ri%10))); //根据写日寄存器命令字,写入日的初始值
  157.         WriteSet1302(0x88,((yue/10)<<4|(yue%10))); //根据写月寄存器命令字,写入月的初始值
  158.         WriteSet1302(0x8c,((21/10)<<4|(21%10)));   //根据写小时寄存器命令字,写入小时的初始值

  159. ++++++++++++以上是部分源码,完整源码在附件++++++++++++++
复制代码
完整单片机代码和proteus仿真文件: 气压监测.zip (68.39 KB, 售价: 3 工控币)

回复

使用道具 举报

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

本版积分规则