找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7704|回复: 7
打印 上一主题 下一主题
收起左侧

51单片机智能调光台灯原理图,PCB图和程序

  [复制链接]
跳转到指定楼层
楼主
调光台灯PCB图:


所有资料51hei提供下载:
PDF格式 智能调光灯.pdf (229.08 KB, 下载次数: 73)
Word格式.doc (25.5 KB, 下载次数: 80)

单片机源程序如下:
  1. #include <reg52.h>                         //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535


  4. sbit SCL=P2^2;                //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
  5. sbit DO=P2^3;                //DO定义为P1口的第4位脚,连接ADC0832DO脚
  6. sbit CS=P2^0;                //CS定义为P1口的第4位脚,连接ADC0832CS脚


  7. sbit red = P1^4;           //红色指示灯

  8. sbit td_led = P3^5;    //台灯

  9. uchar f_pwm_l ;          //越小越亮

  10. bit flag_moshi;

  11. uchar dangwei;   //档位


  12. uchar guangxian;            //光线的显示变量


  13. /***********************1ms延时函数*****************************/
  14. void delay_1ms(uint q)
  15. {
  16.         uint i,j;
  17.         for(i=0;i<q;i++)
  18.                 for(j=0;j<120;j++);
  19. }


  20. /***********读数模转换数据********************************************************/      
  21. //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
  22.                                                 //  1  1  0 通道
  23.                                                 //  1  1  1 通道
  24. unsigned char ad0832read(bit SGL,bit ODD)
  25. {
  26.         unsigned char i=0,value=0,value1=0;               
  27.                 SCL=0;
  28.                 DO=1;
  29.                 CS=0;                //开始
  30.                 SCL=1;                //第一个上升沿      
  31.                 SCL=0;
  32.                 DO=SGL;
  33.                 SCL=1;          //第二个上升沿
  34.                 SCL=0;
  35.                 DO=ODD;
  36.                 SCL=1;           //第三个上升沿
  37.                 SCL=0;           //第三个下降沿
  38.                 DO=1;
  39.                 for(i=0;i<8;i++)
  40.                 {
  41.                         SCL=1;
  42.                         SCL=0; //开始从第四个下降沿接收数据
  43.                         value<<=1;
  44.                         if(DO)
  45.                                 value++;                                               
  46.                 }
  47.                 for(i=0;i<8;i++)
  48.                 {                        //接收校验数据
  49.                         value1>>=1;
  50.                         if(DO)
  51.                                 value1+=0x80;
  52.                         SCL=1;
  53.                         SCL=0;
  54.                 }
  55.                 CS=1;
  56.                 SCL=1;      
  57.                 if(value==value1)                                //与校验数据比较,正确就返回数据,否则返回0      
  58.                         return value;
  59.         return 0;
  60. }

  61. uchar key_can;
  62. /********************独立按键程序*****************/
  63. void key()
  64. {
  65.         static uchar key_new;
  66.         key_can = 20;
  67.         if((P2 & 0xf0) != 0xf0)
  68.         {
  69.                 delay_1ms(1);
  70.                 if(((P2 & 0xf0) != 0xf0) && (key_new == 1))
  71.                 {
  72.                         key_new = 0;
  73.                         switch(P2 & 0xf0)
  74.                         {
  75.                                 case 0xe0:  key_can = 3;  break;         //左边第1个
  76.                                 case 0xd0:  key_can = 2;  break;         //左边第2个
  77.                                 case 0xb0:  key_can = 1;  break;         //左边第3个
  78.                         }
  79.                         red = 0;
  80.                         delay_1ms(80);
  81.                         red = 1;
  82. //                        write_sfm2(2,0,key_can);                              
  83.                 }
  84.         }
  85.         else
  86.                 key_new = 1;      
  87. }

  88. /***************档位***************/
  89. void led_dangwei(uchar dat)
  90. {
  91.         switch(dat)
  92.         {
  93.                 case 7: TR0 = 0;         //最亮
  94.                                 td_led = 0;
  95.                         break;
  96.                 case 6: TR0 = 1;         //亮
  97.                                 f_pwm_l = 20;
  98.                         break;
  99.                 case 5: TR0 = 1;         //亮
  100.                                 f_pwm_l = 40;
  101.                         break;
  102.                 case 4: TR0 = 1;         //亮
  103.                                 f_pwm_l = 60;
  104.                         break;
  105.                 case 3: TR0 = 1;         //亮
  106.                                 f_pwm_l = 80;
  107.                         break;
  108.                 case 2: TR0 = 1;         //亮
  109.                                 f_pwm_l = 90;
  110.                         break;
  111.                 case 1: TR0 = 1;         //亮
  112.                                 f_pwm_l = 95;
  113.                         break;
  114.                 case 0: TR0 = 0;         //灭
  115.                                 td_led = 1;
  116.                         break;
  117.         }      
  118. }

  119. /****************按键处理函数***************/
  120. void key_with()
  121. {
  122.         if(key_can == 1)          //设置键
  123.         {
  124.                 flag_moshi = ~flag_moshi;  
  125.         }
  126.         if(flag_moshi == 1)          //手动模式
  127.         {
  128.                 if(key_can == 2)   //加
  129.                 {
  130.                         dangwei ++;      
  131.                         if(dangwei >= 7)
  132.                                 dangwei = 7;
  133.                 }

  134.                 if(key_can == 3)   //减
  135.                 {
  136.                         if(dangwei != 0)
  137.                                 dangwei --;
  138.                 }
  139.                 led_dangwei(dangwei) ;    //档位
  140.         }
  141. }

  142. /*************定时器0初始化程序***************/
  143. void time_init()         
  144. {
  145.         EA   = 1;                   //开总中断
  146.         TMOD |= 0X21;          //定时器1工作方式1
  147.         ET0  = 1;                  //开定时器0中断
  148.         TR0  = 0;                  //允许定时器0定时
  149. }


  150. /********************************************************************
  151. * 名称 : Main()
  152. * 功能 : 主函数
  153. * 输入 : 无
  154. * 输出 : 无
  155. ***********************************************************************/
  156. void Main()
  157. {
  158.         uchar flag_200ms;
  159.         P0 = P1 = P2 = P3 = 0xff;           //初始化单片机IO口为高电平        write_string(2,0,"     :  :        ");
  160.         time_init();                    //初始化定时器
  161.         red = 0;
  162.         f_pwm_l = 99;
  163.         while(1)
  164.         {

  165.                 key();
  166.                 if(key_can < 10)
  167.                         key_with();
  168.                 if(flag_moshi == 0)          //自动模式
  169.                         red = 1;
  170.                 else
  171.                         red = 0;                  //手动模式

  172.                 if(flag_moshi == 0)          //自动模式
  173.                 {
  174.                         if(guangxian <= 20)             //开灯
  175.                         {
  176.                                 TR0 = 0;         //最亮
  177.                                 td_led = 0;      
  178.                         }else if(guangxian >= 80)        //关灯      
  179.                         {
  180.                                 TR0 = 0;         //灭
  181.                                 td_led = 1;
  182.                         }else
  183.                         {
  184.                                 TR0 = 1;      
  185.                                 f_pwm_l = guangxian;      
  186.                         }      
  187.                 }
  188.                 flag_200ms ++;
  189.                 if(flag_200ms >= 200)
  190.                 {
  191.                         flag_200ms = 0;
  192.                         guangxian = ad0832read(1,0); //采集光线
  193.                         guangxian = guangxian * 99 / 255;
  194.                 }
  195.                 delay_1ms(1);
  196.         }      
  197. }


  198. /*******************定时器0用做单片机模拟PWM 调节***********************/
  199. void Timer0() interrupt 1  //调用定时器0
  200. {
  201.         static uchar value_l;
  202.         TH0=0xfe;    //    定时10ms中断一次
  203.         TL0=0x0c;         //500us
  204.         if(td_led==1)
  205.         {
  206.                 value_l+=3;
  207.                 if(value_l > f_pwm_l)   //高电平
  208.                 {
  209.                         value_l=0;
  210.                     if(f_pwm_l != 0)   
  211.                                 td_led=0;         
  212.                 }
  213.         }
  214.         else                              
  215.         {
  216.                 value_l+=3;
  217.                 if(value_l  > 100 - f_pwm_l)                  //低电平
  218.                 {
  219.                         value_l=0;
  220.                         td_led=1;
  221.                 }
  222.     }
  223. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:87193 发表于 2017-12-25 15:42 | 只看该作者
下载看看,楼主有做出实物吗
回复

使用道具 举报

板凳
ID:87193 发表于 2017-12-25 15:50 | 只看该作者
附件里根本没有PCB文件,好坑
回复

使用道具 举报

地板
ID:334996 发表于 2018-5-21 22:48 | 只看该作者
楼主可否讲解一下他的数模转换部分
回复

使用道具 举报

5#
ID:146605 发表于 2018-12-25 20:47 | 只看该作者
谢谢楼主,很给力
回复

使用道具 举报

6#
ID:446775 发表于 2021-8-7 22:55 | 只看该作者
楼主这个数模转化主要是转换什么信号啊?光源的亮度调节是使用的PWM吗?
回复

使用道具 举报

7#
ID:953538 发表于 2021-8-9 08:49 | 只看该作者
使用的PWM光源的亮度调节,能否控制输出电压的大小。
回复

使用道具 举报

8#
ID:585365 发表于 2021-8-10 16:58 | 只看该作者
我也有做过一个相同的,但种在最后的时候会闪烁
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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