标题: 单片机ADC电阻调节滑动控制pwm占空比调光程序+Proteus仿真设计 [打印本页]

作者: yiwangt    时间: 2019-10-22 10:44
标题: 单片机ADC电阻调节滑动控制pwm占空比调光程序+Proteus仿真设计
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


一、硬件设计
   程序流程图


元件清单:
晶振
电容
电容
电阻
按钮
led
电阻
模数芯片
滑变
三极管
电池盒
电线
洞洞板
开关

软件设计  
按下start,开始工作
按下end,关闭
调整滑变,改变亮度
通过按钮打开电灯后,调节滑动来改变的亮度,达到调光的目的。

单片机源程序如下:
  1. #include <REG51.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. //******************adc0832****************************//
  6. sbit CLK=        P2^2;//时钟,初始状态为0
  7. sbit DI=        P2^3;//数据输入
  8. sbit DO=        P2^1; // 数据输出
  9. sbit CS=        P2^0;
  10. //******************按钮****************************//
  11. sbit start =P2^4;
  12. sbit end=P2^5;
  13. sbit led=P3^5;

  14. uchar start_flag;//开始标志
  15. //延时
  16. void delay(uchar i)
  17. {
  18.         while(i--)
  19.         {
  20.                 if(!end)                         //end按钮按下
  21.                         start_flag=0;
  22.         }
  23. }
  24. /*******************亮灯函数***************/
  25. void led_red(uchar i)//占空比i/13
  26. {
  27.         led=0;
  28.         delay(i/10);
  29.         if(i/10<12)
  30.         {
  31.                 led=1;
  32.                 delay(12-i/10);
  33.         }
  34. }
  35. /*********************************************
  36. 读取ADC
  37. **********************************************/
  38. uchar ADC()//通道ch0
  39. {
  40.         uchar temp0,temp1,i;
  41.         CS=0;
  42.         temp0=0;
  43.         temp1=0;
  44.         _nop_();
  45.         _nop_();
  46.         DI=1;//开始位
  47.         _nop_();
  48.         _nop_();
  49.         CLK=1;
  50.         _nop_();
  51.         _nop_();
  52.         CLK=0;
  53.         _nop_();
  54.         _nop_();
  55.         DI=0;
  56.         _nop_();
  57.         _nop_();
  58. //选择通道0
  59.                 DI=1;
  60.                 _nop_();
  61.                 CLK=1;//上升沿DI=1
  62.                 _nop_();
  63.                 CLK=0;//1个下降沿DI=1
  64.                 _nop_();
  65.                 DI=0;
  66.                 _nop_();
  67.                 CLK=1;
  68.                 _nop_();
  69.                 CLK=0;//第3个上升沿DI=0
  70.                 _nop_();
  71.                    DI=1;
  72. //********通道选择结束开始读取转换后的二进制数****
  73. //下降沿读数,一下进行判断和处理,共8次
  74. for(i=0;i<8;i++)
  75.    {
  76.         temp0=temp0<<1;
  77.         CLK=1;
  78.     if(DO)
  79.            temp0++;
  80.            _nop_();
  81.            CLK=0;
  82.    }
  83. for(i=0;i<8;i++)
  84.    {
  85.         temp1=temp1>>1;
  86.         CLK=1;
  87.     if(DO)
  88.            temp1=temp1 +0x80;
  89.            _nop_();
  90.            CLK=0;
  91.    }
  92.          CS=1;
  93.    return temp0;
  94. }
  95. //*********************************************
  96. void main()
  97. {
  98.         uchar num,i;
  99.         CLK=0;//ADC时钟初始化
  100.         start_flag=0;
  101. while(1)
  102.         {
  103. //按键检测
  104.         if(!start)                         //start按钮按下
  105.                 {
  106.                 start_flag=1;
  107.                 }
  108.         if(!end)                         //end按钮按下
  109.                 {
  110.                 start_flag=0;
  111.                 }
  112.                
  113.         if(start_flag)
  114.         {
  115.                 num=ADC();
  116.                 P1=num;
  117.                 for(i=0;i<100;i++)
  118.                         led_red(num);
  119.         }
  120.         }
  121. }
复制代码


所有资料51hei提供下载:
调光灯项目设计.rar (88.96 KB, 下载次数: 129)


作者: cyhhs    时间: 2020-5-8 15:13
为啥仿真不了呢
作者: nisofer    时间: 2020-5-8 15:34
谢谢分享!!!
作者: 邑善    时间: 2020-6-10 17:12
最后for语句还有num不太懂,有没有大神讲解一下调节原理
作者: 邑善    时间: 2020-6-10 17:14
最后for语句还有num那个字母调占空比,有没有大神讲解一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1