找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2993|回复: 1
收起左侧

51单片机+MQ135+12864显示程序

[复制链接]
ID:430104 发表于 2018-11-27 16:57 | 显示全部楼层 |阅读模式
在51单片机的基础上,通过12864显示屏显示MQ135测量的数据

单片机源程序如下:
  1. //#include <reg52.h>
  2. #include <string.h>
  3. #include <STC12C5A60S2.H>

  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. unsigned char ge, shi, bai, qian,dian1,dian2;

  7. typedef unsigned char BYTE;
  8. typedef unsigned long  adc32;
  9. BYTE  ADC_DATA16;

  10. uchar          table1[]={
  11. "                "
  12. "   0.    mg/m3  "
  13. "  甲醛含量:    "
  14. "                "};

  15. uchar code IC_DAT[];
  16. uchar code pic1[];
  17. uchar code pic2[];
  18. uchar code pic3[];

  19. uchar code IC_DAT[]={
  20. "智能甲醛净化设备"
  21. "    15物联网    "  
  22. "                "
  23. "    郑禹臣     "
  24. };

  25. sbit RS  = P0^7;
  26. sbit WRD = P0^6;
  27. sbit E   = P0^5;
  28. sbit PSB = P0^5;
  29. sbit RES = P0^3;

  30. beep1 = 0x07;
  31. beep2 = 0xff;

  32. void TransferData(char data1,bit DI);
  33. void delayms(uint n);
  34. void delay(uint m);
  35. void lcd_mesg(uchar *adder1);

  36. void ADC_Init(void);                //ADC初始化
  37. BYTE GetADCResult(BYTE ch);        //获取ADC通道的值        
  38. void ShowResult(BYTE ch);        //计算结果
  39. BYTE filtering(BYTE ch);        //滤波

  40. void ADC_Init(void)
  41. {
  42.         P1ASF = 0xff;        //开启ADC通道
  43.         ADC_RES = 0;        //复位
  44.         ADC_CONTR = 0x88;
  45.         delay(2);
  46.          
  47. }

  48. BYTE GetADCResult(BYTE ch)
  49. {
  50.         uchar V;
  51.         ADC_CONTR = 0x88 | 0x00 | ch ;
  52.         delay(1);
  53.         while (!(ADC_CONTR & 0x10));
  54.         ADC_CONTR &= ~0x10;
  55.         V = ADC_RES        << 2 |        ADC_RESL;
  56.         return V;        
  57. }


  58. void ShowResult(BYTE ch)
  59. {

  60.          P0 |= beep1;
  61.         P2 |= beep2;
  62.         ADC_DATA16 = GetADCResult(ch);
  63.         ge = ADC_DATA16 % 10                     + '0' ;
  64.           shi = ADC_DATA16 / 10 % 10          + '0' ;
  65.           bai = ADC_DATA16 / 100 % 10  + '0' ;
  66.           qian = ADC_DATA16 / 1000% 10 + '0' ;


  67.         table1[23] = ge;
  68.         table1[22] = shi;
  69.         table1[21] = bai;
  70.                                                                                    
  71.         if(((shi >= 56)&&(ge >= 48))||(bai == 49))
  72.         {
  73.                 P0 &= ~beep1;
  74.                 P2 &= ~beep2;
  75.         }
  76. }


  77. /********************************************************************
  78. * 名称 : Convert(uchar In_Date)
  79. * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
  80. * 输入 : 1602资料上的值
  81. * 输出 : 送到1602的值
  82. ***********************************************************************/
  83. unsigned char Convert(unsigned char In_Date)
  84. {
  85.     unsigned char i, Out_Date = 0, temp = 0;
  86.     for(i=0; i<8; i++)
  87.     {
  88.         //temp = (In_Date >> i) & 0x01;
  89.         //Out_Date |= (temp << (7 - i));
  90.                 Out_Date=  In_Date;

  91.     }
  92.     return Out_Date;
  93. }

  94. void initinal(void)           //LCD字库初始化程序
  95. {
  96.   delay(40);             //大于40MS的延时程序
  97.   PSB=1;                 //设置为8BIT并口工作模式
  98.   delay(1);              //延时
  99.   RES=0;                 //复位
  100.   delay(1);              //延时
  101.   RES=1;                 //复位置高
  102.   delay(10);
  103.   TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
  104.   delay(100);            //大于100uS的延时程序
  105.   TransferData(0x30,0);  //Function Set
  106.   delay(37);             ////大于37uS的延时程序
  107.   TransferData(0x08,0);  //Display on Control
  108.   delay(100);            //大于100uS的延时程序
  109.   TransferData(0x10,0);  //Cursor Display Control光标设置
  110.   delay(100);            //大于100uS的延时程序
  111.   TransferData(0x0C,0);  //Display Control,D=1,显示开
  112.   delay(100);            //大于100uS的延时程序
  113.   TransferData(0x01,0);  //Display Clear
  114.   delay(10);             //大于10mS的延时程序
  115.   TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动
  116.   delay(100);            //大于100uS的延时程序
  117. }

  118. /********************************************************************
  119. * 名称 : Main()
  120. * 功能 : 主函数
  121. * 输入 : 无
  122. * 输出 : 无
  123. ***********************************************************************/
  124. void    main(void)
  125. {
  126.           ADC_Init();
  127.         initinal();                    //调用LCD字库初始化程序
  128.         delayms(240);
  129.         while(1)
  130.         {
  131. //                initinal();
  132. //           initina2();            //调用LCD显示图片(扩展)初始化程序
  133.            
  134. //           link(table1,GetADCResult(1));
  135. //           TransferData(ADC_DATA16,1);                        
  136. //     DisplayGraphic(pic2);  //显示图片2
  137.                   ShowResult(1);
  138. //       delay(100);            //大于100uS的延时程序
  139.        lcd_mesg(table1);      //显示中文汉字1
  140.        delayms(100);

  141. //     initinal();                    //调用LCD字库初始化程序
  142. //     delay(100);            //大于100uS的延时程序
  143. //     lcd_mesg(IC_DAT2);     //显示中文汉字2
  144. //     delayms(240);
  145. //           delayms(240);
  146. //           initinal();  
  147.         }
  148. }

  149. /********************************************************************
  150. * 名称 : Main()
  151. * 功能 : 主函数
  152. * 输入 : 无
  153. * 输出 : 无
  154. ***********************************************************************/
  155. void   lcd_mesg(uchar  *adder1)
  156. {
  157.         unsigned char i;
  158.         TransferData(0x80,0);  //Set Graphic Display RAM Address
  159.         delay(100);
  160.         for(i=0;i<32;i++)
  161.                 {
  162.                           TransferData(*adder1,1);
  163.                            adder1++;
  164.                 }

  165.         TransferData(0x90,0);  //Set Graphic Display RAM Address
  166.         delay(100);
  167.         for(i=32;i<64;i++)
  168.                 {
  169.                           TransferData(*adder1,1);
  170.                            adder1++;
  171.                 }
  172. }

  173. /********************************************************************
  174. * 名称 : Main()
  175. * 功能 : 主函数
  176. * 输入 : 无
  177. * 输出 : 无
  178. ***********************************************************************/
  179. void    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.
  180. {
  181.   WRD=0;
  182.   RS=DI;
  183.   delay(1);
  184.   P2=Convert(data1);
  185.   E=1;
  186.   delay(1);
  187.   E=0;
  188. }

  189. /********************************************************************
  190. * 名称 : Main()
  191. * 功能 : 主函数
  192. * 输入 : 无
  193. * 输出 : 无
  194. ***********************************************************************/
  195. void    delayms(unsigned int n)            //延时10×n毫秒程序
  196. {
  197.    unsigned int i,j;
  198.    for(i=0;i<n;i++)
  199.       for(j=0;j<2000;j++);
  200. }

  201. /********************************************************************
  202. * 名称 : Main()
  203. * 功能 : 主函数
  204. * 输入 : 无
  205. * 输出 : 无
  206. ***********************************************************************/
  207. void    delay(unsigned int m)            //延时程序
  208. {
  209.    unsigned int i,j;
  210.    for(i=0;i<m;i++)
  211.       for(j=0;j<10;j++);
  212. }
复制代码

所有资料51hei提供下载:
momo.rar (54.05 KB, 下载次数: 40)
回复

使用道具 举报

ID:1 发表于 2018-11-28 00:27 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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