找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于智能环境灯的单片机程序问题请教

[复制链接]
跳转到指定楼层
楼主
ID:530765 发表于 2019-5-8 17:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作为单面机的小菜鸟,只会些简单的编程,需要大神的帮助。
该智能环境灯主要实现的功能:
1.能够检测环境光照强度,并显示;
2.能够实现根据当前环境来自动调节所需要的光照强度;
3.能够实现缓慢将灯变亮和熄灭;


该程序最后的结果只有LCD显示但不随光照强度的改变而改变,我已经完全懵了,求帮助!

  1. #include <reg52.h>

  2. /*---------------宏定义-----------------*/
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. #define PWM_CYC 20 //PWM周期
  6. uchar bright_lev = 0; //0最大亮度 20最小亮度

  7. #define LIGHT_SPEED 1000


  8. #define delay(x) {uint i,j;for(i = x;i>0;i--)for(j=50;j>0;j--);}

  9. #define THC0 ((65536 - 10000)/256) //10ms定时器定时值
  10. #define TLC0 ((65536 - 10000)%256)

  11. /*--------------引脚定义-----------------*/

  12. /* AD0809引脚 */
  13. sbit ST=P3^7;
  14. sbit EOC=P3^6;
  15. sbit OE=P2^4;
  16. sbit CLK=P2^3;
  17. sbit ALE = P3^7;
  18. #define ADCV P1

  19. /* LED 引脚 */
  20. sbit RS=P2^0;
  21. sbit RW=P2^1;
  22. sbit E=P2^2;
  23. #define LEDData P0


  24. /* 电机PWM脚 */
  25. sbit PWM = P2^6;


  26. /*---------------全局变量----------------*/
  27. uchar num[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; // ROM字符库
  28. uchar tab[]=" LUX "; //要显示什么就在这儿改

  29. uchar environment_bright;


  30. void PWM_Drive(void);
  31. uchar Get_Vol(void);
  32. void Display(void);
  33. void light_control(void);
  34. void writecmd(uchar com);
  35. void writedata(uchar dat);
  36. void init(void);
  37. void Display_Result(uchar d);
  38. /*---------------------------------
  39. * 函数:SysTemInit 初使化
  40. *----------------------------------*/
  41. void SysTemInit(void)
  42. {
  43.         TMOD = 0x02; //定时器0 采用16位定时器
  44. TH0 = THC0; //设定定时值
  45. TL0 = TLC0;
  46.         ET0 = 1; //定时器T0 溢出中断允许
  47. TR0 = 1; //启动定时器0
  48.         EA = 1; //中断总开关开
  49. }

  50. /*---------------------------------
  51. * 函数:main 程序主入口
  52. *----------------------------------*/
  53. void main(void)
  54. {
  55.         PWM = 0;
  56. SysTemInit();
  57.         for(;;)
  58.         {
  59.         PWM_Drive(); //PWM驱动
  60. environment_bright = Get_Vol(); //获取环境亮度
  61. light_control();
  62.         Display_Result(environment_bright); //显示
  63. }
  64. }

  65. /*---------------------------------
  66. * 函数:light_control 灯亮度控制
  67. *----------------------------------*/
  68. void light_control(void)
  69. {
  70.         static uint light_speed = 0;
  71.         if(environment_bright<127 && bright_lev > 0)
  72.         {
  73.         light_speed++;
  74.         if(light_speed > LIGHT_SPEED)
  75.         {
  76.         bright_lev--;
  77.         light_speed = 0;
  78.         }
  79.         }
  80.         else if(environment_bright>127 && bright_lev < PWM_CYC)
  81.         {
  82.         light_speed++;
  83.         if(light_speed > LIGHT_SPEED)
  84.         {
  85.         bright_lev++;
  86.         light_speed = 0;
  87.         }
  88.         }
  89. }

  90. /*---------------------------------
  91. * 函数:time0 10ms定时器0中断入口 用于ADC时钟
  92. *----------------------------------*/
  93. void time0() interrupt 1
  94. {
  95.         CLK = ~CLK;
  96. }


  97. /*---------------------------------
  98. * 函数:PWM_Drive 电机驱动
  99. * 参数:cmd 指令
  100. *----------------------------------*/
  101. void PWM_Drive(void)
  102. {
  103.         static uchar cnt = 0;
  104.         cnt++;
  105.         if(cnt < bright_lev) PWM = 1;
  106.         else PWM = 0;
  107.         if(cnt > PWM_CYC) cnt = 0;
  108. }

  109. /*---------------------------------
  110. * 函数:Get_Vol 获取环境亮度
  111. * 返回:滑动变阻器电压值 0-255 对应0-5V
  112. *----------------------------------*/
  113. uchar Get_Vol(void)
  114. {
  115.         uchar vol = 0;
  116.         ST = OE = 0;
  117.         ALE = 1;
  118.         ST = 1;
  119.         ALE = 0;
  120.         ST = 0;
  121.         while(EOC == 0);
  122.         OE = 1;
  123.         vol = ADCV;
  124.         return vol;
  125. }

  126. /*---------------------------------
  127. * 函数:Display LED显示
  128. *----------------------------------*/
  129. void writecmd(uchar com) //写指令
  130. {
  131. E=0;
  132. RS=0;
  133. RW=0;
  134. P0=com;
  135. delay(2);
  136. E=1;
  137. delay(2);
  138. E=0;
  139. }
  140. void writedata(uchar dat)//写数据
  141. {
  142. E=0;
  143. RS=1;
  144. RW=0;
  145. P0=dat;
  146. delay(2);
  147. E=1;
  148. delay(2);
  149. E=0;

  150. }
  151. void init(void) //初始化
  152. {
  153. delay(15);
  154. writecmd(0x38);
  155. delay(5);
  156. writecmd(0x38);
  157. delay(5);
  158. writecmd(0x38);
  159. writecmd(0x38);
  160. writecmd(0x08);
  161. writecmd(0x01);
  162. writecmd(0x06);
  163. writecmd(0x0c);
  164. }
  165. void Display_Result(uchar n)
  166. {
  167. uchar j,d;
  168. init();

  169. d=(((n*4096)/1000.0)/0.000317969924);
  170. tab[5]=num[d%10];
  171. tab[4]=num[d/10%10];
  172. tab[3]=num[d/100%10];
  173. tab[2]=num[d/1000%10];
  174. tab[1]=num[d/10000%10];
  175. tab[0]=num[d/100000%10];

  176. writecmd(0x80); //液晶在80H+00地方显示 (设置地址指针)
  177. for(j=0;j<16;j++) //有16个字符,要循环16次
  178. {
  179. writedata(tab[j]);
  180. delay(2);
  181. }
  182. while(1); //让液晶显示就一直停在这里。
  183. }
复制代码








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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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