登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看4448|回1|收藏
楼主 ID:605277 只看他
2019-11-10 17:43
IMG_20191110_172756.jpg IMG_20191110_172805.jpg IMG_20191110_172822.jpg
单片机源程序如下:

代码:

  1. /*============================================================
  2. //
  3. //程序编写:刘先生

  4. 接线:D0--D7接P0.0-P0.7
  5.       ST---P2.3
  6.           EOC--P2.2
  7.           OE---P2.1
  8.           CLK--P2.0

  9. 本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。

  10. [注:使用12M或11.0592M晶振,实测使用11.0592M]
  11. =============================================================*/
  12. #include <reg52.H>                //器件配置文件
  13. #include <intrins.h>
  14. #include "lcd.h"

  15. #define adc0809_data  P0  //单片机P0接模块D0~D7引脚

  16. sbit STR = P2^3; //单片机P2.3接模块STR引脚, 启动转换信号
  17. sbit EOC = P2^2; //单片机P2.2接模块EOC, 转换结束信号,高电平有效
  18. sbit OE  = P2^1; //单片机P2.1接模块OE,输出允许信号,高电平有效
  19. sbit CLK = P2^0; //单片机P2.0接CLK ,ADC0809时钟,输入50-800KHZ的频率
  20.                  //一般选用500K

  21.                                  //将短接片去掉开启位选功能,否则默认IN0为输入引脚
  22. sbit AA = P2^6;         //单片机P2.6接模块A引脚
  23. sbit BB = P2^5;         //单片机P2.6接模块B引脚
  24. sbit CC = P2^4;         //单片机P2.6接模块C引脚

  25. unsigned char AD_DATA[1]; //保存IN0通道转换后的数据
  26. unsigned char disbuff[4] = { 0,0,0,0,};
  27. unsigned char Disp[]="0123456789";         //使用字符串保存数字0~9所对应的ASCLL码
  28. unsigned char I_Disp[]="Smoke_C : ";           //初始显示值
  29. unsigned char i;



  30. /***********************************
  31. 函数名:  AD()
  32. 功能:    启动AD转换将值储存于 AD_DATA[0]

  33. ***********************************/
  34. void AD(void )
  35. {
  36.    STR=0;

  37.    STR=1; //启动AD转换

  38.    STR=0;  
  39.    while(0==EOC);//等待转换结束
  40.    OE=1;  
  41.    AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255
  42.    OE=0;  
  43. }
  44. /***********************************
  45. 函数名:  t0()
  46. 功能:    产生ADC0809CLK所需要的时钟

  47. ***********************************/
  48. void t0(void) interrupt 1 using 0
  49. {  
  50.    CLK=~CLK;
  51. }
  52. /***********************************
  53. 函数名:  Conut()
  54. 功能:    将AD_DATA[0]的各位拆分以方便lcd显示

  55. ***********************************/
  56. void Conut(void)
  57. {
  58.          disbuff[0]=AD_DATA[0]/100;
  59.          disbuff[1]=AD_DATA[0]/10%10;
  60.          disbuff[2]=AD_DATA[0]%10;
  61. }
  62. /***********************************
  63. 函数名:  delayms()
  64. 功能:    延时 ms 毫秒

  65. ***********************************/
  66. void delayms(unsigned int ms)
  67. {
  68.         unsigned char j;
  69.         i=100;
  70.         for(;ms;ms--)
  71.         {
  72.                 while(--i)
  73.                 {
  74.                         j=10;
  75.                         while(--j);
  76.                 }
  77.         }
  78. }
  79. /***********************************
  80. 函数名:  LcdDisplay()
  81. 功能:    用lcd显示数组disbuff[]中的值

  82. ***********************************/

  83. void LcdDisplay(void)
  84. {
  85.         LcdWriteCom(0x0b+0x80);
  86.         for(i=0;i<3;i++)
  87.         {
  88.                 LcdWriteData(Disp[disbuff[i]]);        
  89.         }                                
  90. }
  91. /***********************************
  92. 函数名:  Analog_IO_Sel()
  93. 参数说明: m 的值对应ADC0809芯片上模拟输入的IO
  94. 功能:    确定模拟输入位选

  95. ***********************************/

  96. void Analog_IO_Sel(unsigned char m)
  97. {
  98.         switch(m)
  99.         {
  100.                 case 0 : CC = 0; BB = 0; AA = 0; break;
  101.                 case 1 : CC = 0; BB = 0; AA = 1; break;
  102.                 case 2 : CC = 0; BB = 1; AA = 0; break;
  103.                 case 3 : CC = 0; BB = 1; AA = 1; break;
  104.                 case 4 : CC = 1; BB = 0; AA = 0; break;
  105.                 case 5 : CC = 1; BB = 0; AA = 1; break;
  106.                 case 6 : CC = 1; BB = 1; AA = 0; break;
  107.                 case 7 : CC = 1; BB = 1; AA = 1; break;
  108.         }
  109. }

  110. void main()
  111. {
  112.         EA=1; //开总中断
  113.     TMOD=0x02; //设定定时器 T0工作方式
  114.     TH0=216; //利用T0中断产生CLK信号
  115.     TL0=216;  
  116.     TR0=1; //启动定时器T0
  117.     ET0=1;
  118.     STR=0;
  119.     OE=0;
  120.         Analog_IO_Sel(0);  //设置为IN0输入

  121.         LcdInit();
  122.         for(i=0;i<10;i++)                  //显示初始值
  123.         {
  124.                 LcdWriteData(I_Disp[i]);        
  125.         }

  126.         while(1)
  127.           {
  128.              AD();
  129.          Conut();                        //计算
  130.                  LcdDisplay();                //lcd显示
  131.                  delayms(10);                //10MS         
  132.           }         
  133. }
全部资料51hei下载地址:
烟雾检测+ADC0809AD转换+lcd1602显示.7z (2.68 MB)
(下载次数: 183, 2019-11-10 22:21 上传)

下载积分: 黑币 -5



沙发 ID:701939 只看他
2020-3-17 15:41
感谢楼主的热心分享,下来研究

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版