单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14648|回复: 106
收起左侧

51单片机教室智能照明控制系统 原理图+PCB 仿真图 源程序等资料分享

  [复制链接]
贾焕宇 发表于 2017-4-19 16:52 | 显示全部楼层 |阅读模式
制作了一个教室照明管理系统,资料非常全该有的都有了详情见压缩包.
做出来的实物图正面图片:
1.jpg 2.jpg 3.jpg

背面图片:
4.jpg

教室智能照明控制系统原理图(AD格式的清晰版请下载附件):
0.png

教室智能照明控制系统pcb文件(AD画的pcb工程文件附件里面有):
0.png
0.png

教室智能照明控制proteus仿真图(附件可下载工程文件):
0.png

另外还提供很多参考资料给51黑电子论坛的朋友们,列表如下:
\1602字符表.jpg
\DS18B20中文资料.pdf
\主程序流程图.doc
\人数统计子程序流程图.doc
\光电式计数器的设计(毕业论文).docx
\光电计数器毕业设计论文.pdf
\关于红外对管的原理及应用.docx
\原理图简介20160409.doc
\基于AT89S51单片机的教室灯光智能控制系统设计.doc
\基于DS18B20的温度控制系统毕业设计.doc
\基于STC89C52单片机和DS1302时钟芯片定时开关的设计与仿真(参考时钟部分).doc
\基于单片机的教室灯光自动控制系统.doc
\基于单片机的计数器(参考计数部分).doc
\常用光敏电阻参数.doc
\开题报告任务书.doc
\操作说明.doc
\教室智能照明材料清单.xls
\智能路灯控制系统毕业论文.doc
\模电课件27第七章电压比较器.ppt
\比较器工作原理及应用.doc
\毕业论文答辩技巧大全.doc
\水域全自动增氧喂料系统(参考定时部分).doc
\液晶显示子流程图.doc
\答辩常见问题解答.doc
\系统框图.doc
\软件打开及下载.txt

单片机源程序:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar time_data[7];
  6. uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};       //数据的地址
  7. uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};

  8. uchar code table1[]="C: 00|2000/00/00";
  9. uchar code table2[]="T: 00|00:00:00 0";
  10. uchar code table3[]="                ";                         //清屏内容
  11. uchar code table4[]="  Set Real Time ";
  12. uchar code table5[]="  Set Open Time ";
  13. uchar code table6[]="   Start Time:  ";
  14. uchar code table7[]="    00:00:00    ";
  15. uchar code table8[]="    End Time:   ";
  16. uchar code table9[]="Date: 2000/00/00";
  17. uchar code table0[]="Time: 00:00:00 0";

  18. bit Adjust;                          //调节标志位,=1表示进入调节模式,=0是正常模式
  19. bit Auto_flg;                  //自动模式标志位,=1表示手动模式,=0是自动模式
  20. sbit rs=P1^0;                  //LCD1602
  21. sbit rw=P1^1;                   //LCD1602
  22. sbit e=P1^2;                  //LCD1602
  23. sbit sck=P2^5;                  //时钟端口
  24. sbit io=P2^6;                  //时钟端口
  25. sbit rst=P2^7;                  //时钟端口
  26. sbit SELT =P1^6;          //选择键
  27. sbit ENTER=P1^7;          //确认键
  28. sbit UP   =P3^0;          //加键
  29. sbit DOWN =P3^1;          //减键
  30. sbit MODE =P3^2;          //切换按键接口
  31. sbit SWITCH=P3^3;          //手动开关
  32. sbit AUTO_LED=P1^3;          //自动模式灯接口
  33. sbit HAND_LED=P1^4;          //手动灯接口
  34. sbit LAMP1=P3^4;          //灯接口
  35. sbit LAMP2=P3^5;          //灯接口
  36. sbit LAMP3=P3^6;          //灯接口
  37. sbit LAMP4=P3^7;          //灯接口
  38. sbit LIGHT1=P2^0;          //光线检测端口
  39. sbit IN1=P2^2;
  40. sbit OUT1=P2^1;
  41. sbit DQ=P1^5;                  //温度数据口
  42. uchar Select_num;          //选择按键按下次数
  43. uchar Enter_num;          //确认按键按下次数
  44. uchar Switch_num;          //手动开关按键按下次数
  45. float Year,Month,Day,Hour,Minute,Second;                        //时间设置值
  46. uchar Week;               
  47. float Hour_H,Minute_H,Second_H;                                          //设置开始时间
  48. float Hour_L,Minute_L,Second_L;                                          //设置结束时间
  49. int Value1;                                                                                        //人数
  50. uchar IN1_flag=0;
  51. uchar OUT1_flag=0;
  52. uint Count;           //T0定时器中断计数次数
  53. uchar Miao;

  54. int temperature;                                                                        //全局变量 温度

  55. void read_rtc();

  56. /**************************************************LCD1602显示*******************************************************************/
  57. void delay1(uint z)                          //延时函数
  58. {
  59.         uint x,y;
  60.         for(x=z;x>0;x--)
  61.                 for(y=10;y>0;y--);
  62. }

  63. void write_com(uchar com)                         //写指令函数
  64. {
  65.         rw=0;
  66.         delay1(5);
  67.         rs=0;
  68.         delay1(5);
  69.         e=1;
  70.         delay1(5);
  71.         P0=com;
  72.         delay1(5);
  73.         e=0;
  74.         delay1(5);        
  75. }

  76. void write_date(uchar date)                        //写数据函数
  77. {                                                                        
  78.         rw=0;
  79.         delay1(5);
  80.         rs=1;
  81.         delay1(5);
  82.         e=1;
  83.         delay1(5);
  84.         P0=date;
  85.         delay1(5);
  86.         e=0;
  87.         delay1(5);        
  88. }

  89. void init()                                                    //初始化函数
  90. {        
  91.         uchar num;
  92.         Year=17;
  93.         Month=1;
  94.         Day=1;
  95.         Hour=15;
  96.         Minute=30;
  97.         Second=50;
  98.         Week=1;
  99.         Hour_H=22;
  100.         Minute_H=0;
  101.         Second_H=0;
  102.         Hour_L=18;
  103.         Minute_L=0;
  104.         Second_L=0;
  105.         e=0;                                                    // 时序表e初始为0
  106.         write_com(0x38);                        //设置16*2显示,5*7点阵,8位数据接口
  107.         write_com(0x0c);                                //设置光标
  108.         write_com(0x06);                                //光标自动加1,光标输入方式
  109.         write_com(0x01);                                //清屏
  110.         write_com(0x80);                                //设置初始显示位置
  111.         for(num=0;num<16;num++)
  112.         {
  113.                 write_date(table1[num]);
  114.                 delay1(5);
  115.         }
  116.         write_com(0x80+0x40);
  117.         for(num=0;num<16;num++)
  118.         {
  119.                 write_date(table2[num]);
  120.                 delay1(5);
  121.         }                                          
  122. }

  123. void SetTime_dispaly(uchar add,uchar dat)         //第一个:参数的地址,第二个:参数的内容
  124. {
  125.         uchar shi,ge;
  126.         shi=dat/10;                                                        //把十位提取出来
  127.         ge=dat%10;                                                        //把个位提取出来
  128.         write_com(add);                                                    //要写的地址
  129.         write_date(0x30+shi);                                //十位的内容   1602字符库
  130.         write_date(0x30+ge);                                //个位的内容   1602字符库
  131. }

  132. void Week_dispaly(uchar add,uchar dat)        //第一个:参数的地址,第二个:参数的内容
  133. {
  134.         write_com(add);                                                //要写的地址
  135.         write_date(0x30+dat);                                //十位的内容   1602字符库
  136. }
  137. void Date_dispaly(uchar add,uchar dat)         //第一个:参数的地址,第二个:参数的内容
  138. {
  139.         uchar shi,ge;
  140.         shi=dat/16;                                                        //把十位提取出来
  141.         ge=dat%16;                                                        //把个位提取出来
  142.         write_com(add+3);                                            //要写的地址
  143.         write_date(0x30+shi);                                //十位的内容   1602字符库
  144.         write_date(0x30+ge);                                //个位的内容   1602字符库                                   
  145. }

  146. void LCD_Clean(uchar i)                                        //液晶屏清除显示
  147. {
  148.         uchar num;
  149.         if(i==1)
  150.         {
  151.                 write_com(0x80);                                //设置初始显示位置
  152.                 for(num=0;num<16;num++)                        //显示第一行内容
  153.                 {
  154.                         write_date(table3[num]);
  155.                         delay1(1);
  156.                 }
  157.         }
  158.         if(i==2)
  159.         {
  160.                 write_com(0x80+0x40);
  161.                 for(num=0;num<16;num++)                        //显示第二行内容
  162.                 {
  163.                         write_date(table3[num]);
  164.                         delay1(1);
  165.                 }
  166.         }
  167. }

  168. void LCD_Display_String(unsigned char line,unsigned char *string)
  169. {                                                                                 //液晶屏显示内容,把要显示的内容写到对应的位置
  170.         unsigned char i;
  171.         unsigned char address=0;
  172.         if(line==1)
  173.         {
  174.                 address=0x80;                                         //0X80是第1行的第1个位置  ,0x81第2位
  175.         }
  176.         else if(line==2)
  177.         {
  178.                 address=0x80+0x40;                          //0X80+0x40是第2行的第1个位置  ,0X80+0x40+1是第2行第2位
  179.         }
  180.         
  181.         for(i=0;i<16;i++)
  182.         {
  183.                 write_com(address);
  184.                 write_date(string[i]);
  185.                 address++;
  186.         }
  187. }
  188. /**********************************DS1302时钟***************************************/
  189. void Time_Display(void)
  190. {
  191.         read_rtc();
  192.         Date_dispaly(0x80+0x40+9,time_data[6]);  //显示秒
  193.         Date_dispaly(0x80+0x40+6,time_data[5]);         //显示分
  194.         Date_dispaly(0x80+0x40+3,time_data[4]);         //显示时
  195.         Date_dispaly(0x80+11,time_data[3]);                 //显示日
  196.         Date_dispaly(0x80+8,time_data[2]);                 //显示月
  197.         Week_dispaly(0x80+0x40+15,time_data[1]); //显示周
  198.         Date_dispaly(0x80+5,time_data[0]);                 //显示年
  199.                                            //        Year/10*16+Year%10
  200.         Hour=time_data[4]/16*10+time_data[4]%16;;
  201.         Minute=time_data[5]/16*10+time_data[5]%16;;
  202.         Second=time_data[6]/16*10+time_data[6]%16;;
  203. }


  204. void write_ds1302_byte(uchar dat)
  205. {
  206.         uchar i;
  207.         for(i=0;i<8;i++)
  208.         {
  209.                 sck=0;
  210.                 io=dat&0x01;                                           //准备数据,从最低位开始
  211.                 dat=dat>>1;
  212.                 sck=1;
  213.         }
  214. }

  215. void write_ds1302(uchar add,uchar dat)
  216. {
  217.         rst=0;
  218.         _nop_();                                                  //CPU原地踏步
  219.         sck=0;
  220.         _nop_();
  221.         rst=1;
  222.         _nop_();
  223.         write_ds1302_byte(add);                    //传地址
  224.         write_ds1302_byte(dat);                    //传数据
  225.         rst=0;                                                     //不受其他影响
  226.         _nop_();
  227.         io=1;                                                   //释放
  228.         sck=1;
  229. }

  230. uchar read_ds1302(uchar add)
  231. {
  232.         uchar i,value;
  233.         rst=0;
  234.         _nop_();  //CPU原地踏步
  235.         sck=0;
  236.         _nop_();
  237.         rst=1;
  238.         _nop_();
  239.         write_ds1302_byte(add);
  240.         for(i=0;i<8;i++)
  241.         {
  242.                 value=value>>1;
  243.                 sck=0;
  244.                 if(io)
  245.                 value=value|0x80;
  246.                 sck=1;
  247.         }
  248.         rst=0;
  249.         _nop_();
  250.         sck=0;
  251.         _nop_();
  252.         sck=1;
  253.         io=1;
  254.         return value;
  255. }

  256. void set_rtc()                                  //设置时间
  257. {
  258.         uchar i,j;
  259.         for(i=0;i<7;i++)                         //转换BCD码
  260.         {
  261.                 j=time_data[i]/10;
  262.                 time_data[i]=time_data[i]%10;
  263.                 time_data[i]=time_data[i]+j*16;
  264.         }
  265.         write_ds1302(0x8e,0x00);          //去除写保护
  266.         for(i=0;i<7;i++)
  267.         {
  268.                 write_ds1302(write_add[i],time_data[i]);
  269.         }
  270.         write_ds1302(0x8e,0x80);      //加写保护
  271. }

  272. void read_rtc()
  273. {
  274.         uchar i;
  275.         for(i=0;i<7;i++)
  276.         {
  277.                 time_data[i]=read_ds1302(read_add[i]);        //最终读出来的数 16进制
  278.         }
  279. }

  280. /*************************************************按键****************************************************************/
  281. void Keyscan(void)
  282. {
  283.         if(SELT==0)
  284.         {
  285.                 delay1(2);
  286.                 if(SELT==0)
  287.                 {
  288.                         while(!SELT);
  289.                         Select_num++;                                        //选择键按下一次
  290.                         Adjust=1;                                                //进入调节模式                        
  291.                 }
  292.                 if(Select_num==1)
  293.                 {
  294.                         LCD_Clean(1);
  295.                         LCD_Clean(2);
  296.                         LCD_Display_String(1,table4);
  297.                         LCD_Display_String(2,table5);
  298.                         write_com(0x80+0);                                //写 >>
  299.                         write_date(0x3e);
  300.                         write_com(0x80+1);                                //写 >>
  301.                         write_date(0x3e);
  302.                         Enter_num=0;
  303.                 }
  304.                 if(Select_num==2)
  305.                 {
  306.                         LCD_Clean(1);
  307.                         LCD_Clean(2);
  308.                         LCD_Display_String(1,table4);
  309.                         LCD_Display_String(2,table5);
  310.                         write_com(0x80+0x40+0);                                //写 >>
  311.                         write_date(0x3e);
  312.                         write_com(0x80+0x40+1);                                //写 >>
  313.                         write_date(0x3e);
  314.                         Enter_num=0;
  315.                 }
  316.                 if(Select_num==3)
  317.                 {
  318.                         LCD_Clean(1);
  319.                         LCD_Clean(2);
  320.                         LCD_Display_String(1,table1);
  321.                         LCD_Display_String(2,table2);
  322.                         Select_num=0;
  323.                         Enter_num=0;                                       
  324.                         Adjust=0;
  325.                 }
  326.                 write_com(0x0c);                                                                        //光标不再闪烁
  327.                 Enter_num=0;
  328.         }
  329.         
  330.         if(ENTER==0)
  331.         {
  332.                 delay1(2);
  333.                 if(ENTER==0)
  334.                 {
  335.                         while(!ENTER);
  336.                         Enter_num++;
  337.                 }
  338.                 if(Select_num==1)                                        //设置实时时间
  339.                 {
  340.                         if(Enter_num==1)
  341.                         {
  342.                                 LCD_Clean(1);
  343.                                 LCD_Clean(2);
  344.                                 LCD_Display_String(1,table9);
  345.                                 LCD_Display_String(2,table0);
  346.                                 SetTime_dispaly(0x80+8,Year);
  347.                                 SetTime_dispaly(0x80+11,Month);
  348.                                 SetTime_dispaly(0x80+14,Day);
  349.                                 SetTime_dispaly(0x80+0x40+6,Hour);
  350.                                 SetTime_dispaly(0x80+0x40+9,Minute);
  351.                                 SetTime_dispaly(0x80+0x40+12,Second);
  352.                                 Week_dispaly(0x80+0x40+15,Week);
  353.                                 write_com(0x80+8);                        //光标闪烁地址,停留在年的位置上                                       
  354.                                 write_com(0x0f);                        //光标闪烁
  355.                         }
  356.                         if(Enter_num==2)
  357.                         {
  358.                                 write_com(0x80+11);                        //光标闪烁地址,停留在月的位置上                                       
  359.                                 write_com(0x0f);                        //光标闪烁
  360.                         }
  361.                         if(Enter_num==3)
  362.                         {
  363.                                 write_com(0x80+14);                        //光标闪烁地址,停留在日的位置上                                       
  364.                                 write_com(0x0f);                        //光标闪烁
  365.                         }
  366.                         if(Enter_num==4)
  367.                         {
  368.                                 write_com(0x80+0x40+6);                //光标闪烁地址,停留在时的位置上                                       
  369.                                 write_com(0x0f);                        //光标闪烁
  370.                         }
  371.                         if(Enter_num==5)
  372.                         {
  373.                                 write_com(0x80+0x40+9);                //光标闪烁地址,停留在分的位置上                                       
  374.                                 write_com(0x0f);                        //光标闪烁
  375.                         }
  376.                         if(Enter_num==6)
  377.                         {
  378.                                 write_com(0x80+0x40+12);        //光标闪烁地址,停留在秒的位置上                                       
  379.                                 write_com(0x0f);                        //光标闪烁
  380.                         }
  381.                         if(Enter_num==7)
  382.                         {
  383.                                 write_com(0x80+0x40+15);        //光标闪烁地址,停留在星期的位置上                                       
  384.                                 write_com(0x0f);                        //光标闪烁
  385.                         }
  386.                         if(Enter_num==8)
  387.                         {
  388.                                 Enter_num=0;
  389.                                 write_com(0x0c);                        //光标不再闪烁
  390.                                 LCD_Clean(1);
  391.                                 LCD_Clean(2);
  392.                                 LCD_Display_String(1,table1);
  393.                                 LCD_Display_String(2,table2);
  394.                                 time_data[0]=Year;///10*16+Year%10;
  395.                                 time_data[1]=Week;///10*16+Week%10;
  396.                                 time_data[2]=Month;///10*16+Month%10;
  397.                                 time_data[3]=Day;///10*16+Day%10;
  398.                                 time_data[4]=Hour;///10*16+Hour%10;
  399.                                 time_data[5]=Minute;///10*16+Minute%10;
  400.                                 time_data[6]=Second;///10*16+Second%10;
  401.                                 set_rtc();                                         //设置时间
  402.                                 Select_num=0;
  403.                                 Adjust=0;
  404.                         }
  405.                 }

  406.                 if(Select_num==2)                                        //设置开关锁时间
  407.                 {
  408.                         if(Enter_num==1)
  409.                         {
  410.                                 LCD_Clean(1);
  411.                                 LCD_Clean(2);
  412.                                 LCD_Display_String(1,table6);
  413.                                 LCD_Display_String(2,table7);
  414.                                 SetTime_dispaly(0x80+0x40+4,Hour_L);
  415.                                 SetTime_dispaly(0x80+0x40+7,Minute_L);
  416.                                 SetTime_dispaly(0x80+0x40+10,Second_L);
  417.                                 write_com(0x80+0x40+4);                //光标闪烁地址,停留在时的位置上                                       
  418.                                 write_com(0x0f);                        //光标闪烁
  419.                         }
  420.                         if(Enter_num==2)
  421.                         {
  422.                                 write_com(0x80+0x40+7);                //光标闪烁地址,停留在分的位置上                                       
  423.                                 write_com(0x0f);                        //光标闪烁
  424.                         }
  425.                         if(Enter_num==3)
  426.                         {
  427.                                 write_com(0x80+0x40+10);        //光标闪烁地址,停留在秒的位置上                                       
  428.                                 write_com(0x0f);                        //光标闪烁
  429.                         }
  430.                         if(Enter_num==4)
  431.                         {
  432.                                 write_com(0x0c);                        //光标不再闪烁
  433.                                 LCD_Clean(1);
  434.                                 LCD_Clean(2);
  435.                                 LCD_Display_String(1,table8);
  436.                                 LCD_Display_String(2,table7);        
  437.                                 SetTime_dispaly(0x80+0x40+4,Hour_H);
  438.                                 SetTime_dispaly(0x80+0x40+7,Minute_H);
  439.                                 SetTime_dispaly(0x80+0x40+10,Second_H);
  440.                                 write_com(0x80+0x40+4);                //光标闪烁地址,停留在时的位置上                                       
  441.                                 write_com(0x0f);                        //光标闪烁
  442.                         }
  443.                         if(Enter_num==5)
  444.                         {
  445.                                 write_com(0x80+0x40+7);                //光标闪烁地址,停留在分的位置上                                       
  446.                                 write_com(0x0f);                        //光标闪烁
  447.                         }
  448.                         if(Enter_num==6)
  449.                         {
  450.                                 write_com(0x80+0x40+10);        //光标闪烁地址,停留在秒的位置上                                       
  451.                                 write_com(0x0f);                        //光标闪烁
  452.                         }               
  453.                         if(Enter_num==7)
  454.                         {
  455.                                 Enter_num=0;
  456.                                 write_com(0x0c);                        //光标不再闪烁
  457.                                 LCD_Clean(1);
  458.                                 LCD_Clean(2);
  459.                                 LCD_Display_String(1,table1);
  460.                                 LCD_Display_String(2,table2);
  461.                                 Select_num=0;
  462.                                 Adjust=0;
  463.                         }
  464.                 }

  465.         }
  466.         if(UP==0)
  467.         {
  468.                 delay1(2);
  469.                 if(UP==0)
  470.                 {
  471.                         while(!UP);
  472.                         if(Select_num==1)
  473.                         {
  474.                                 if(Enter_num==1)
  475.                                 {
  476.                                         Year++;
  477.                                         if(Year>99)
  478.                                         Year=0;
  479.                                         SetTime_dispaly(0x80+8,Year);
  480.                                         write_com(0x80+8);                                                               
  481.                                         write_com(0x0f);                        
  482.                                 }
  483.                                 if(Enter_num==2)
  484.                                 {
  485.                                         Month++;
  486.                                         if(Month>12)
  487.                                         Month=1;
  488.                                         SetTime_dispaly(0x80+11,Month);
  489.                                         write_com(0x80+11);                                                               
  490.                                         write_com(0x0f);                                                         
  491.                                 }
  492.                                 if(Enter_num==3)
  493.                                 {
  494.                                         Day++;
  495.                                         if(Day>31)
  496.                                         Day=1;
  497.                                         SetTime_dispaly(0x80+14,Day);
  498.                                         write_com(0x80+14);                                                               
  499.                                         write_com(0x0f);
  500.                                 }
  501.                                 if(Enter_num==4)
  502.                                 {
  503.                                         Hour++;
  504.                                         if(Hour>23)
  505.                                         Hour=0;
  506.                                         SetTime_dispaly(0x80+0x40+6,Hour);
  507.                                         write_com(0x80+0x40+6);                                                               
  508.                                         write_com(0x0f);
  509.                                 }
  510.                                 if(Enter_num==5)
  511.                                 {
  512.                                         Minute++;
  513.                                         if(Minute>59)
  514.                                         Minute=0;
  515.                                         SetTime_dispaly(0x80+0x40+9,Minute);
  516.                                         write_com(0x80+0x40+9);                                                               
  517.                                         write_com(0x0f);
  518.                                 }
  519.                                 if(Enter_num==6)
  520.                                 {
  521.                                         Second++;
  522.                                         if(Second>59)
  523.                                         Second=0;
  524.                                         SetTime_dispaly(0x80+0x40+12,Second);
  525.                                         write_com(0x80+0x40+12);                                                               
  526.                                         write_com(0x0f);
  527.                                 }
  528.                                 if(Enter_num==7)
  529.                                 {
  530.                                         Week++;
  531.                                         if(Week>7)
  532.                                         Week=1;
  533.                                         Week_dispaly(0x80+0x40+15,Week);
  534.                                         write_com(0x80+0x40+15);                                                               
  535.                                         write_com(0x0f);
  536.                                 }
  537.                         }
  538.                         if(Select_num==2)
  539.                         {                                
  540.                                 if(Enter_num==1)
  541.                                 {
  542.                                         Hour_L++;
  543.                                         if(Hour_L>23)
  544.                                         Hour_L=0;
  545.                                         SetTime_dispaly(0x80+0x40+4,Hour_L);
  546.                                         write_com(0x80+0x40+4);                                                               
  547.                                         write_com(0x0f);
  548.                                 }
  549.                                 if(Enter_num==2)
  550.                                 {
  551.                                         Minute_L++;
  552.                                         if(Minute_L>59)
  553.                                         Minute_L=0;
  554.                                         SetTime_dispaly(0x80+0x40+7,Minute_L);
  555.                                         write_com(0x80+0x40+7);                                                               
  556.                                         write_com(0x0f);
  557.                                 }
  558.                                  
  559.                                 if(Enter_num==3)
  560.                                 {
  561.                                         Second_L++;
  562.                                         if(Second_L>59)
  563.                                         Second_L=0;
  564.                                         SetTime_dispaly(0x80+0x40+10,Second_L);
  565.                                         write_com(0x80+0x40+10);                                                               
  566.                                         write_com(0x0f);
  567.                                 }
  568.                                 if(Enter_num==4)
  569.                                 {
  570.                                         Hour_H++;
  571.                                         if(Hour_H>23)
  572.                                         Hour_H=0;
  573.                                         SetTime_dispaly(0x80+0x40+4,Hour_H);
  574.                                         write_com(0x80+0x40+4);                                                               
  575.                                         write_com(0x0f);
  576.                                 }
  577.                                 if(Enter_num==5)
  578.                                 {
  579.                                         Minute_H++;
  580.                                         if(Minute_H>59)
  581.                                         Minute_H=0;
  582.                                         SetTime_dispaly(0x80+0x40+7,Minute_H);
  583.                                         write_com(0x80+0x40+7);                                                               
  584.                                         write_com(0x0f);
  585.                                 }
  586.                                  
  587.                                 if(Enter_num==6)
  588.                                 {
  589.                                         Second_H++;
  590.                                         if(Second_H>59)
  591.                                         Second_H=0;
  592.                                         SetTime_dispaly(0x80+0x40+10,Second_H);
  593.                                         write_com(0x80+0x40+10);                                                               
  594.                                         write_com(0x0f);
  595.                                 }                                
  596.                         }
  597.                 }
  598.         }
  599.         if(DOWN==0)
  600.         {
  601.                 delay1(2);
  602.                 if(DOWN==0)
  603.                 {
  604.                         while(!DOWN);
  605.                         if(Select_num==1)
  606.                         {
  607.                                 if(Enter_num==1)
  608.                                 {
  609.                                         Year--;
  610.                                         if(Year<0)
  611.                                         Year=99;
  612.                                         SetTime_dispaly(0x80+8,Year);
  613.                                         write_com(0x80+8);                                                               
  614.                                         write_com(0x0f);
  615.                                 }
  616.                                 if(Enter_num==2)
  617.                                 {
  618.                                         Month--;
  619.                                         if(Month<1)
  620.                                         Month=12;
  621.                                         SetTime_dispaly(0x80+11,Month);
  622.                                         write_com(0x80+11);                                                               
  623.                                         write_com(0x0f);
  624.                                 }
  625.                                 if(Enter_num==3)
  626.                                 {
  627.                                         Day--;
  628.                                         if(Day<1)
  629.                                         Day=31;
  630.                                         SetTime_dispaly(0x80+14,Day);
  631.                                         write_com(0x80+14);                                                               
  632.                                         write_com(0x0f);
  633.                                 }
  634.                                 if(Enter_num==4)
  635.                                 {
  636.                                         Hour--;
  637.                                         if(Hour<0)
  638.                                         Hour=23;
  639.                                         SetTime_dispaly(0x80+0x40+6,Hour);
  640.                                         write_com(0x80+0x40+6);                                                               
  641.                                         write_com(0x0f);
  642.                                 }
  643.                                 if(Enter_num==5)
  644.                                 {
  645.                                         Minute--;
  646.                                         if(Minute<0)
  647.                                         Minute=59;
  648.                                         SetTime_dispaly(0x80+0x40+9,Minute);
  649.                                         write_com(0x80+0x40+9);                                                               
  650.                                         write_com(0x0f);
  651.                                 }
  652.                                 if(Enter_num==6)
  653.                                 {
  654.                                         Second--;
  655.                                         if(Second<0)
  656.                                         Second=59;
  657.                                         SetTime_dispaly(0x80+0x40+12,Second);
  658.                                         write_com(0x80+0x40+12);                                                               
  659.                                         write_com(0x0f);
  660.                                 }
  661.                                 if(Enter_num==7)
  662.                                 {
  663.                                         Week--;
  664.                                         if(Week<1)
  665.                                         Week=7;
  666.                                         Week_dispaly(0x80+0x40+15,Week);
  667.                                         write_com(0x80+0x40+15);                                                               
  668.                                         write_com(0x0f);
  669.                                 }               
  670.                         }

  671.                         if(Select_num==2)
  672.                         {
  673.                                 if(Enter_num==1)
  674.                                 {
  675.                                         Hour_L--;
  676.                                         if(Hour_L<0)
  677.                                         Hour_L=23;
  678.                                         SetTime_dispaly(0x80+0x40+4,Hour_L);
  679.                                         write_com(0x80+0x40+4);                                                               
  680.                                         write_com(0x0f);
  681.                                 }
  682.                                 if(Enter_num==2)
  683.                                 {
  684.                                         Minute_L--;
  685.                                         if(Minute_L<0)
  686.                                         Minute_L=59;
  687.                                         SetTime_dispaly(0x80+0x40+7,Minute_L);
  688.                                         write_com(0x80+0x40+7);                                                               
  689.                                         write_com(0x0f);
  690.                                 }
  691.                                 if(Enter_num==3)
  692.                                 {
  693.                                         Second_L--;
  694.                                         if(Second_L<0)
  695.                                         Second_L=59;
  696.                                         SetTime_dispaly(0x80+0x40+10,Second_L);
  697.                                         write_com(0x80+0x40+10);                                                               
  698.                                         write_com(0x0f);
  699.                                 }
  700.                                  
  701.                                 if(Enter_num==4)
  702.                                 {
  703.                                         Hour_H--;
  704.                                         if(Hour_H<0)
  705.                                         Hour_H=23;
  706.                                         SetTime_dispaly(0x80+0x40+4,Hour_H);
  707.                                         write_com(0x80+0x40+4);                                                               
  708.                                         write_com(0x0f);
  709.                                 }
  710.                                 if(Enter_num==5)
  711.                                 {
  712.                                         Minute_H--;
  713.                                         if(Minute_H<0)
  714.                                         Minute_H=59;
  715.                                         SetTime_dispaly(0x80+0x40+7,Minute_H);
  716.                                         write_com(0x80+0x40+7);                                                               
  717.                                         write_com(0x0f);
  718.                                 }
  719.                                 if(Enter_num==6)
  720.                                 {
  721.                                         Second_H--;
  722.                                         if(Second_H<0)
  723.                                         Second_H=59;
  724.                                         SetTime_dispaly(0x80+0x40+10,Second_H);
  725.                                         write_com(0x80+0x40+10);                                                               
  726.                                         write_com(0x0f);
  727.                                 }
  728.                         }
  729.                 }
  730.         }

  731.         if(MODE==0)                                                        //切换按键按下
  732.         {
  733.                 delay1(2);                                                        //消抖
  734.                 if(MODE==0)
  735.                 {
  736.                         while(!MODE);                                        //按键释放
  737.                         Auto_flg=~Auto_flg;                                //模式切换
  738.                         if(Auto_flg==0)                                        //自动模式
  739.                         {
  740.                                 AUTO_LED=0;                                        //自动灯亮
  741.                                 HAND_LED=1;
  742.                         }
  743.                         if(Auto_flg==1)                                        //手动模式
  744.                         {
  745.                                 AUTO_LED=1;                                       
  746.                                 HAND_LED=0;                                        //手动灯亮
  747.                                 LAMP1=1;                                        //关灯
  748.                                 LAMP2=1;
  749.                                 LAMP3=1;
  750.                                 LAMP4=1;
  751.                         }
  752.                 }
  753.         }
  754.         if(Auto_flg==1)                                                        //手动模式
  755.         {
  756.                 if(SWITCH==0)                                                //灯开关按键按下
  757.                 {
  758.                         delay1(2);                                                //消抖
  759.                         if(SWITCH==0)
  760.                         {
  761.                                 while(!SWITCH);                                //按键释放
  762.                                 Switch_num++;                                //按下次数增加
  763.                                 if(Switch_num==1)                        //按下一次,开一盏灯
  764.                                 {
  765.                                         LAMP1=0;
  766.                                         LAMP2=1;
  767.                                         LAMP3=1;
  768.                                         LAMP4=1;
  769.                                 }
  770.                                 if(Switch_num==2)                        //按下二次,开二盏灯
  771.                                 {
  772.                                         LAMP1=0;
  773.                                         LAMP2=0;
  774.                                         LAMP3=1;
  775.                                         LAMP4=1;
  776.                                 }
  777.                                 if(Switch_num==3)                        //按下3次,开3盏灯
  778.                                 {
  779.                                         LAMP1=0;
  780.                                         LAMP2=0;
  781.                                         LAMP3=0;
  782.                                         LAMP4=1;
  783.                                 }
  784.                                 if(Switch_num==4)                        //按下4次,开4盏灯
  785.                                 {
  786.                                         LAMP1=0;
  787.                                         LAMP2=0;
  788.                                         LAMP3=0;
  789.                                         LAMP4=0;
  790.                                 }
  791.                                 if(Switch_num==5)                        //按下5次,开0盏灯
  792.                                 {
  793.                                         LAMP1=1;
  794.                                         LAMP2=1;
  795.                                         LAMP3=1;
  796.                                         LAMP4=1;
  797.                                         Switch_num=0;                        //次数清除
  798.                                 }
  799.                         }
  800.                 }
  801.         }
  802. }

  803. void Open(void)
  804. {
  805.         float Now;
  806.         float Set_L,Set_H;
  807.         Now=Hour+Minute/60+Second/3600;                                                  //把实时时间化成小时为单位
  808.         Set_L=Hour_L+Minute_L/60+Second_L/3600;                                  //把设置下限时间化成小时为单位
  809.         Set_H=Hour_H+Minute_H/60+Second_H/3600;                                  //把设置上限时间化成小时为单位
  810.         if(Auto_flg==0)                                                                                //自动模式
  811.         {
  812.                 if((Now>=Set_L)&(Now<=Set_H))                                          //实时时间在上下限时间范围内
  813.                 {
  814.                         if(LIGHT1==0)                                                            //光线不足
  815.                         {
  816.                                 if(Value1==0)
  817.                                 {
  818.                                         LAMP1=1;                                                        //全灭
  819.                                         LAMP2=1;
  820.                                         LAMP3=1;
  821.                                         LAMP4=1;
  822.                                 }
  823.                                 if((Value1>0)&(Value1<10))
  824.                                 {
  825.                                         LAMP1=0;                                                        //亮一个灯
  826.                                         LAMP2=1;
  827.                                         LAMP3=1;
  828.                                         LAMP4=1;
  829.                                 }
  830.                                 if((Value1>=10)&(Value1<20))
  831.                                 {
  832.                                         LAMP1=0;                                                        //亮二个灯
  833.                                         LAMP2=0;
  834.                                         LAMP3=1;
  835.                                         LAMP4=1;
  836.                                 }
  837.                                 if((Value1>=20)&(Value1<30))
  838.                                 {
  839.                                         LAMP1=0;                                                        //亮三个灯
  840.                                         LAMP2=0;
  841.                                         LAMP3=0;
  842.                                         LAMP4=1;
  843.                                 }
  844.                                 if(Value1>=30)
  845.                                 {
  846.                                         LAMP1=0;                                                        //亮四个灯
  847.                                         LAMP2=0;
  848.                                         LAMP3=0;
  849.                                         LAMP4=0;
  850.                                 }
  851.                         }
  852.                         if(LIGHT1==1)                                                            //光线强烈
  853.                         {
  854.                                 LAMP1=1;                                                                //全灭
  855.                                 LAMP2=1;
  856.                                 LAMP3=1;
  857.                                 LAMP4=1;
  858.                         }
  859.                 }
  860.         
  861.                 if((Now<Set_L)|(Now>Set_H))                                                  //实时时间不在范围内
  862.                 {
  863.                         LAMP1=1;                                                                        //全灭
  864.                         LAMP2=1;
  865.                         LAMP3=1;
  866.                         LAMP4=1;
  867.                 }
  868.         }
  869. }

  870. /*******************************************************************************************************/
  871. void Count_Value(void)
  872. {
  873.         SetTime_dispaly(0x80+3,Value1);
  874.         if(IN1==0)
  875.         {
  876.                 delay1(1);
  877.                 if(IN1==0)
  878.                 {
  879.                         while(!IN1);
  880.                         if(OUT1_flag==0)
  881.                         {
  882.                                 IN1_flag=1;
  883.                                 TR0=1;                                         //开启定时器 防止误触发
  884.                         }
  885.                         if(OUT1_flag==1)
  886.                         {
  887.                                 
  888.                                 Value1++;                                 //人数增加
  889.                                 if(Value1>=99)                         //如果人数计数到99,变为最大99
  890.                                 Value1=99;
  891.                                 OUT1_flag=0;                         //清零
  892.                                 IN1_flag=0;
  893.                                 TR0=0;                                         //关闭定时器
  894.                                 Count=0;
  895.                                 Miao=0;
  896.                         }
  897.                 }
  898.         }
  899.         if(OUT1==0)
  900.         {
  901.                 delay1(1);
  902.                 if(OUT1==0)
  903.                 {
  904.                         while(!OUT1);
  905.                         if(IN1_flag==0)
  906.                         {
  907.                                 OUT1_flag=1;
  908.                                 TR0=1;                                         //开启定时器 防止误触发
  909.                         }
  910.                         if(IN1_flag==1)
  911.                         {
  912.                                 Value1--;                                //人数减少
  913.                                 if(Value1<0)                        //如果人数计数小于0,变为最小0
  914.                                 Value1=0;
  915.                                 IN1_flag=0;                                //清零
  916.                                 OUT1_flag=0;
  917.                                 TR0=0;                                         //关闭定时器
  918.                                 Count=0;
  919.                                 Miao=0;
  920.                         }
  921.                 }
  922.         }
  923. }
  924. /****************************************温度************************************************************/
  925. /*void delay(uint y)                                                                           //DS18B20延时函数(仿真用)
  926. {
  927.         while(y--);
  928. }
  929. */
  930. void delay(uint z)                                                                                  //DS18B20延时函数(实物用)
  931. {
  932.         uint x,y;
  933.         for(x=z;x>0;x--)
  934.                 for(y=1;y>0;y--);
  935. }  

  936. void write_byte(uint dat)                        //写一个字节
  937. {
  938.         uchar i;
  939.         for(i=0;i<8;i++)                        //循环八次          共有八位
  940.         {
  941.                 DQ=0;                                                //写零
  942.                 DQ=dat&0x01;                //向总线写位数据,从最低位写起
  943.                 delay(4);
  944.                 DQ=1;                                                //写一
  945.                 dat>>=1;                                    //下次写作准备,移位数据
  946.         }
  947.         delay(4);
  948. }                                    

  949. uchar read_byte(void)                                //读一个字节,返回值
  950. {
  951.         uchar i;
  952.         uint value;
  953.         for(i=0;i<8;i++)                        //循环八次          共有八位
  954.         {
  955.                 DQ=0;
  956.                 value>>=1;
  957.                 DQ=1;                                                //释放总线
  958.                 if(DQ)
  959.                 value|=0x80;                            //DQ=1,value取1
  960.                 delay(4);
  961.         }
  962.         return value;
  963. }

  964. void ds18b20_init()                                    //初始化函数
  965. {
  966.         uint n;
  967.         DQ=1;
  968.         delay(8);                                          
  969.         DQ=0;
  970.         delay(80);                                            //低电平480——960us
  971.         DQ=1;                                                        //总线释放
  972.         delay(8);                                            //等待50——100us
  973.         n=DQ;                                                    //读取复位状态
  974.         delay(4);
  975. }

  976. int readtemperature()                                //读整数部分
  977. {        
  978.     int a,b;                                                //高八位,低八位
  979.         ds18b20_init();
  980.         write_byte(0xcc);                            //跳过rom匹配,跳过读序列号的操作,可节省操作时间
  981.         write_byte(0x44);                            //启动温度检测
  982.         delay(300);                                            //测温度
  983.         ds18b20_init();                                    //开始操作前需要复位
  984.         write_byte(0xcc);                                //跳过rom匹配
  985.         write_byte(0xbe);                            //写读寄存器中温度值的命令
  986.         a=read_byte();                                    //low          低位开始读取
  987.         b=read_byte();                                    //high          高位开始读取
  988.         b<<=8;                                                        //把高位左移八位
  989.         b=b|a;                                                        //高八位与第八位进行或运算,得到总和
  990.         if(b>=0)                                                //如果温度大于等于0
  991.         {
  992.                 b=b*0.0625;                                        //直接乘以0.0625
  993.                 write_com(0x80+0x40+2);                //在LCD1602对应的位置不写内容
  994.                 write_date(0x20);
  995.         }
  996.     else                                                        //温度小于0
  997.         {        
  998.                 b=~b+1;                                                //取反码再加一
  999.                 b=b*0.0625;                                        //再运算
  1000.                 write_com(0x80+0x40+2);                //在LCD1602对应的位置写一个负号
  1001.                 write_date(0x2d);
  1002.         }
  1003.         return b;                                                //返回b,此时以表示温度
  1004. }
  1005. void temperature_dispaly(char add,char dat)                         //温度显示函数:第一个:参数的地址,第二个:参数的内容
  1006. {
  1007.         uchar shi,ge;
  1008.         shi=dat/10;                                                                                 //把温度的十位提取出来
  1009.         ge=dat%10;                                                                                 //把温度的个位提取出来
  1010.         write_com(0x80+0x40+add);                                                    //要写的地址
  1011.         write_date(0x30+shi);                                                            //十位的内容   1602字符库
  1012.         write_date(0x30+ge);                                                     //个位的内容        1602字符库
  1013. }
  1014. /*****************************************定时器初始化和主函数***********************************************************/
  1015. void T0_init(void)
  1016. {
  1017.         TMOD=0x11;                                              //设置定时器0为工作方式1
  1018.         TH0=(65536-50000)/256;              //50MS定时
  1019.         TL0=(65536-50000)%256;
  1020.         EA=1;                                                      //开定时器T0的中断        总中断
  1021.         ET0=1;                                                   //允许T0中断
  1022. //        TR0=1;                                                   //开启定时器
  1023. }
  1024. void main()
  1025. {
  1026.         AUTO_LED=0;                                         //默认自动模式
  1027.         temperature=readtemperature();
  1028.         init();                                                 //液晶初始化
  1029.         T0_init();                                         //定时器初始化
  1030.         delay1(8000);
  1031.         while(1)
  1032.         {
  1033.                 if(Adjust==0)                         //非调节模式下显示时间人数和温度
  1034.                 {        
  1035.                         temperature=readtemperature();                        //读取温度
  1036.                         temperature_dispaly(3,temperature);                //显示温度
  1037.                         Time_Display();                 //显示时间
  1038.                         Open();                                  //动作判断,根据光线和声响开关


  1039. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

0.png
全部资料下载:
191基于51单片机的教室智能照明控制系统.rar (13.12 MB, 下载次数: 889)

评分

参与人数 18黑币 +106 收起 理由
brighthall + 10 很给力!
都市郎 + 10 很给力!
sxswwg + 5 很给力!
z1z1 + 5 很给力!
居居糖 + 5
大树下面吃草莓 + 5 回帖助人的奖励!
青春不再 + 5 很好,对我学习单片机很有帮助,并且完成了.
lingang + 6 共享资料的黑币奖励!
cym@ + 5 共享资料的黑币奖励!
the-sunset + 5 很给力!
QQwert + 5 赞一个!
hhhhhrrr + 5 很给力!
芦苇劫 + 5 很给力!
bd3cg + 5 谢谢分享
练氏 + 10
xinhui + 5 很给力!
永无止境Jack + 5 很给力!
简单的哥 + 5

查看全部评分

回复

使用道具 举报

遇见之影 发表于 2017-5-4 23:34 | 显示全部楼层
可以的
回复

使用道具 举报

daduan 发表于 2017-5-16 09:00 | 显示全部楼层
超级棒
回复

使用道具 举报

hjx5548 发表于 2017-5-16 18:41 | 显示全部楼层
谢谢分享
回复

使用道具 举报

vanp 发表于 2017-5-17 15:39 | 显示全部楼层
回复

使用道具 举报

vanp 发表于 2017-5-17 15:40 | 显示全部楼层

求分享 谢谢了
回复

使用道具 举报

状状 发表于 2017-5-19 11:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

gz1994 发表于 2017-5-25 07:19 | 显示全部楼层
谢谢分享
回复

使用道具 举报

massacred 发表于 2017-5-27 10:26 | 显示全部楼层
里面好像没有仿真文件啊
回复

使用道具 举报

FANGWEI 发表于 2017-5-27 21:05 | 显示全部楼层
正想我要做的东西谢谢!
回复

使用道具 举报

vanp 发表于 2017-6-1 07:45 | 显示全部楼层
有这个设计的毕业论文吗
回复

使用道具 举报

gdatgb 发表于 2017-6-3 16:07 | 显示全部楼层

谢谢分享
回复

使用道具 举报

lb688 发表于 2017-6-4 10:58 | 显示全部楼层
好资料,谢谢分享!
回复

使用道具 举报

ggg620 发表于 2017-6-6 22:38 | 显示全部楼层
支持+感谢楼主/
回复

使用道具 举报

永无止境Jack 发表于 2017-6-18 22:27 | 显示全部楼层
给力,特别棒
回复

使用道具 举报

一曲笙歌 发表于 2017-8-29 20:37 | 显示全部楼层
焊功赞一个!
回复

使用道具 举报

heyejun1 发表于 2017-9-29 14:03 | 显示全部楼层
赞一个,很好的东西
回复

使用道具 举报

青青于子衿 发表于 2017-10-24 18:31 | 显示全部楼层
感谢分享!给你个赞
回复

使用道具 举报

青青于子衿 发表于 2017-10-24 18:37 | 显示全部楼层
感谢楼主!给你个赞
回复

使用道具 举报

377489961 发表于 2017-10-25 19:59 | 显示全部楼层
我超喜欢你  你资料太完美了  我喜欢你  我喜欢你  有钱的话给你  虽然我没钱
回复

使用道具 举报

芦苇劫 发表于 2017-10-28 09:38 | 显示全部楼层
厉害啊 收藏啦
回复

使用道具 举报

顶楼主 发表于 2017-11-11 09:59 | 显示全部楼层
超级棒
回复

使用道具 举报

23#
无效楼层,该帖已经被删除
24#
无效楼层,该帖已经被删除
hhhhhrrr 发表于 2018-1-3 23:50 | 显示全部楼层
hhh
好工作如果
回复

使用道具 举报

qxdqx 发表于 2018-1-4 06:20 | 显示全部楼层
太好啦!多谢分享.
回复

使用道具 举报

都市郎 发表于 2018-1-25 22:41 | 显示全部楼层
万能板做得真漂亮
回复

使用道具 举报

z783794281 发表于 2018-3-12 09:27 | 显示全部楼层
正好需要谢谢
回复

使用道具 举报

1499487216 发表于 2018-3-28 16:58 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ljj17173 发表于 2018-4-1 20:42 | 显示全部楼层
很好的资料啊,我大一就得做这个,又得熬夜几个晚上了T_T
回复

使用道具 举报

柒柒十四 发表于 2018-4-2 10:13 | 显示全部楼层
解我燃眉之急,谢谢大神
回复

使用道具 举报

空城孤王 发表于 2018-4-8 13:43 | 显示全部楼层
厉害了
回复

使用道具 举报

bbsbbc 发表于 2018-4-11 11:01 | 显示全部楼层
非常非常给力
回复

使用道具 举报

小胖子、 发表于 2018-4-12 14:45 | 显示全部楼层

怎么我下载不了啊
回复

使用道具 举报

小胖子、 发表于 2018-4-13 18:14 | 显示全部楼层
请问proteus怎么可以仿真“自动”模式下的灯亮灭情况
回复

使用道具 举报

pan123456 发表于 2018-4-18 09:21 | 显示全部楼层
有人做了实物吗  为什么我程序下载到实物就初不了效果
回复

使用道具 举报

37#
无效楼层,该帖已经被删除
192251526 发表于 2018-4-19 14:56 来自手机 | 显示全部楼层
完美啊
回复

使用道具 举报

有橙子远方来 发表于 2018-4-22 13:26 | 显示全部楼层
非常感谢
回复

使用道具 举报

40#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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