找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8182|回复: 9
收起左侧

51单片机+PCF8591 AD光敏电阻亮度显示源码

  [复制链接]
ID:320228 发表于 2018-5-2 09:47 | 显示全部楼层 |阅读模式
51单片机AD实验:使用AD采出光敏电阻阻值随光照强度变化的数值,附有实验结果图和详细源码

图片二

图片二

图片一

图片一


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit sda=P2^0;
  6. sbit scl=P2^1;
  7. sbit dula=P2^6;
  8. sbit wela=P2^7;
  9. uchar code table[]={

  10.                 0x3F,  //"0"
  11.                 0x06,  //"1"
  12.                 0x5B,  //"2"
  13.                 0x4F,  //"3"
  14.                 0x66,  //"4"
  15.                 0x6D,  //"5"
  16.                 0x7D,  //"6"
  17.                 0x07,  //"7"
  18.                 0x7F,  //"8"
  19.                 0x6F,  //"9"
  20.                 0x77,  //"A"
  21.                 0x7C,  //"B"
  22.                 0x39,  //"C"
  23.                 0x5E,  //"D"
  24.                 0x79,  //"E"
  25.                 0x71,  //"F"
  26.                          };
  27. void delay()  //5us
  28. {;;}
  29. void delay1(uint z)//1ms
  30. {
  31.         uint x,y;
  32.         for(x=z;x>0;x--)
  33.                 for(y=120;y>0;y--);       
  34. }
  35. void display(uchar value)
  36. {
  37.         uchar bai,shi,ge;
  38.         bai=value/100;
  39.         shi=value%100/10;
  40.         ge=value%100%10;

  41.         dula=1;
  42.         P0=table[bai];
  43.         dula=0;
  44.         P0=0xff;
  45.         wela=1;
  46.         P0=0xfe;
  47.         wela=0;
  48.         delay1(1);

  49.         dula=1;
  50.         P0=table[shi];
  51.         dula=0;
  52.         P0=0xff;
  53.         wela=1;
  54.         P0=0xfd;
  55.         wela=0;
  56.         delay1(1);

  57.         dula=1;
  58.         P0=table[ge];
  59.         dula=0;
  60.         P0=0xff;
  61.         wela=1;
  62.         P0=0xfb;
  63.         wela=0;
  64.         delay1(1);
  65. }
  66. void start()
  67. {
  68.         scl=1;
  69.         _nop_();
  70.         sda=1;
  71.         delay();
  72.         sda=0;
  73.         delay();
  74.         scl=0;
  75.         _nop_();
  76. }
  77. void stop()
  78. {
  79.         scl=1;
  80.         _nop_();
  81.         sda=0;
  82.         delay();
  83.         sda=1;
  84.         delay();
  85. }
  86. void respons()
  87. {
  88.         scl=1;
  89.         _nop_();
  90.         sda=0;
  91.         delay();
  92.         scl=0;
  93.         _nop_();
  94. }
  95. void norespons()
  96. {
  97.         scl=1;
  98.         _nop_();
  99.         sda=1;
  100.         delay();
  101. }
  102. void init()
  103. {
  104.         scl=1;
  105.         _nop_();
  106.         sda=1;
  107.         _nop_();
  108. }
  109. void write_byte(uchar dat)
  110. {
  111.         uchar i,temp;
  112.         temp=dat;
  113.         for(i=0;i<8;i++)
  114.         {
  115.                 scl=0;
  116.                 _nop_();
  117.                 if((temp&0x80)==0x80)
  118.                         sda=1;          //д1
  119.                 else
  120.                         sda=0;          //д0
  121.                 scl=1;
  122.                 _nop_();
  123.                 temp<<=1;
  124.         }
  125.         scl=0;
  126.         _nop_();
  127. }
  128. uchar read_byte()
  129. {
  130.         uchar dat,i;
  131.         sda=1;
  132.         _nop_();
  133.         scl=0;
  134.         _nop_();
  135.         for(i=0;i<8;i++)
  136.         {
  137.                 scl=1;
  138.                 _nop_();
  139.                 if(sda)
  140.                         dat|=0x01;
  141.                 if(i<7)
  142.                          dat<<=1;
  143.                 scl=0;
  144.                 _nop_();       
  145.         }
  146.         return dat;
  147. }
  148. void DAC_write(uchar dat)
  149. {
  150.         start();
  151.         write_byte(0x90);
  152.         respons();
  153.         write_byte(0x40);
  154.         respons();
  155.         write_byte(dat);
  156.         respons();
  157.         stop();

  158. }
  159. uchar ADC_read(uchar com)
  160. {
  161.         uchar dat;
  162.         dat=com;
  163.         start();
  164.         write_byte(0x90);
  165.         respons();
  166.         write_byte(com);
  167.         respons();
  168.         start();
  169.         write_byte(0x91);
  170.         respons();
  171.         dat=read_byte();
  172.         norespons();
  173.         stop();
  174.         return dat;
  175. }
  176. void main()
  177. {
  178.         uchar i=0,ad_value;
  179.         init();
  180.         while(1)
  181.         {
  182.                
  183.                 ad_value=ADC_read(0x42);
  184.                 display(ad_value);
  185.                 /*DAC_write(i);
  186.                 i++;  */
  187.                 delay1(1);
  188.         }
  189. }
复制代码

所有资料51hei提供下载:
例程.zip (22.82 KB, 下载次数: 186)
回复

使用道具 举报

ID:326117 发表于 2018-5-10 21:12 | 显示全部楼层
你好,有没有是用LCD1602显示的程序?
回复

使用道具 举报

ID:451532 发表于 2018-12-21 14:44 来自手机 | 显示全部楼层
你号,这个需要的元器件是什么了,我是新手,有点不懂
回复

使用道具 举报

ID:517335 发表于 2019-4-21 10:09 | 显示全部楼层
何璇 发表于 2018-5-10 21:12
你好,有没有是用LCD1602显示的程序?

你有没有用LCD1602显示的程序
回复

使用道具 举报

ID:504613 发表于 2019-7-3 14:18 | 显示全部楼层
没发现值是反的吗?正常是光亮,数值大才对
回复

使用道具 举报

ID:427492 发表于 2019-8-1 11:17 | 显示全部楼层
12332323 发表于 2019-7-3 14:18
没发现值是反的吗?正常是光亮,数值大才对

这个元件不知道什么原因,就是光照越强,数值越小。测热敏电阻电压也是温度越高数值越小。搞不懂
回复

使用道具 举报

ID:653193 发表于 2019-11-30 20:05 | 显示全部楼层
那个能不能把接线发一下
回复

使用道具 举报

ID:653193 发表于 2019-11-30 20:06 | 显示全部楼层
那个能不能把接线发一下
回复

使用道具 举报

ID:585455 发表于 2020-9-13 16:51 | 显示全部楼层
我測試都只顯示255,哪裡搞錯了嗎?
回复

使用道具 举报

ID:585455 发表于 2020-9-13 18:52 | 显示全部楼层
我接線錯誤,已經不會顯示255,非常抱歉。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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