找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制的的灯网络系统单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:497325 发表于 2019-5-23 16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是自己初步做的一个灯网络系统
具体内容在附件中
希望可以为广大好友提供参考。

单片机源程序如下:
  1. /*******************************************************************************
  2. * 实验名                           : 万年历实验
  3. * 使用的IO             :
  4. * 实验效果       :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择
  5. *选择设置加1。
  6. *        注意

  7. 按下s5按键进入操作模式
  8. s3按下为选择改变数值
  9. s2按下加数值                                         :
  10. *******************************************************************************/

  11. #include<reg51.h>
  12. #include"lcd.h"
  13. #include"ds1302.h"

  14. sbit K1=P3^1;
  15. sbit K2=P3^0;
  16. sbit K3=P3^2;
  17. sbit K4=P3^3;
  18. sbit led8=P1^7;
  19. sbit led2=P1^1;
  20. sbit sda=P2^0;
  21. sbit scl=P2^1;
  22. sbit beep=P2^3;

  23. uchar led_num=100;     //用来判断亮度
  24. uchar out_light;
  25. uchar IRtime;          //储存检测红外高低电平持续时间
  26. uchar IRcord[4];  //储存解码后的4个字节数据
  27. uchar IRdata[33]; //包含起始码在内的33位数据
  28. bit IRpro_ok;          //解码后4个字节数据接收完成标志位
  29. bit IRok;                  //33位数据接收完成标志


  30. void Int1Configuration();
  31. void delay();
  32. void Display_led();
  33. void delay1(uint i);
  34. void LcdDisplay();
  35. unsigned char SetState,SetPlace;
  36. void Delay10ms(void);   //误差 0us
  37. void display_led();

  38. /*********************************DA AD部分***********************************/
  39. void start()
  40. {
  41.         scl=1;
  42.         _nop_();
  43.         sda=1;
  44.         delay();
  45.         sda=0;
  46.         delay();
  47.         scl=0;
  48.         _nop_();
  49. }
  50. void stop()
  51. {
  52.         scl=1;
  53.         _nop_();
  54.         sda=0;
  55.         delay();
  56.         sda=1;
  57.         delay();
  58. }
  59. void respons()
  60. {
  61.         scl=1;
  62.         _nop_();
  63.         sda=0;
  64.         delay();
  65.         scl=0;
  66.         _nop_();
  67. }
  68. void norespons()
  69. {
  70.         scl=1;
  71.         _nop_();
  72.         sda=1;
  73.         delay();
  74. }
  75. void init()
  76. {
  77.         scl=1;
  78.         _nop_();
  79.         sda=1;
  80.         _nop_();
  81. }
  82. void write_byte(uchar dat)
  83. {
  84.         uchar i,temp;
  85.         temp=dat;
  86.         for(i=0;i<8;i++)
  87.         {
  88.                 scl=0;
  89.                 _nop_();
  90.                 if((temp&0x80)==0x80)
  91.                         sda=1;          //写1
  92.                 else
  93.                         sda=0;          //写0
  94.                 scl=1;
  95.                 _nop_();
  96.                 temp<<=1;
  97.         }
  98.         scl=0;
  99.         _nop_();
  100. }
  101. uchar read_byte()
  102. {
  103.         uchar dat,i;
  104.         sda=1;
  105.         _nop_();
  106.         scl=0;
  107.         _nop_();
  108.         for(i=0;i<8;i++)
  109.         {
  110.                 scl=1;
  111.                 _nop_();
  112.                 if(sda)
  113.                         dat|=0x01;
  114.                 if(i<7)
  115.                          dat<<=1;
  116.                 scl=0;
  117.                 _nop_();        
  118.         }
  119.         return dat;
  120. }
  121. void DAC_write(uchar dat)
  122. {
  123.         start();
  124.         write_byte(0x90);
  125.         respons();
  126.         write_byte(0x40);
  127.         respons();
  128.         write_byte(dat);
  129.         respons();
  130.         stop();

  131. }
  132. uchar ADC_read(uchar com)
  133. {
  134.         uchar dat;
  135.         dat=com;
  136.         start();
  137.         write_byte(0x90);
  138.         respons();
  139.         write_byte(com);
  140.         respons();
  141.         start();
  142.         write_byte(0x91);
  143.         respons();
  144.         dat=read_byte();
  145.         norespons();                                                                                                                //100
  146.         stop();
  147.         return dat;
  148. }

  149. void CHG_light_out()
  150. {
  151.         init();
  152.         out_light=ADC_read(0x42);
  153.         if(out_light>=0&&out_light<=50)//强光亮
  154.         {
  155.                  led_num=100;
  156.         }
  157.                 if(out_light>50&&out_light<=100)//强平常光亮
  158.         {
  159.                  led_num=120;
  160.         }
  161.                 if(out_light>100&&out_light<=200)//平常光亮
  162.         {
  163.                  led_num=130;
  164.         }
  165.                 if(out_light>200)                                //弱平常光亮
  166.         {
  167.                  led_num=150;
  168.         }
  169. }
  170. void beep_play()
  171. {
  172.         beep=0;
  173.         delay1(50);
  174.         beep=1;
  175. }

  176. void Display_led()
  177. {
  178.         uchar i;
  179.         init();
  180.         if(TIME[2]==0x12)
  181.         {
  182.                  DAC_write(led_num);
  183.                  if(IRcord[2]==0x0c)
  184.                  {
  185.                          led_num=led_num+10;
  186.                         beep_play();
  187.                         if(led_num==160)
  188.                         {
  189.                                 led_num==100;
  190.                         }
  191.                         IRcord[2]=0;
  192.                  }
  193.                

  194.         }
  195.          else
  196.                  {
  197.                          DAC_write(0);
  198.                  }
  199. }
  200. /************************************红外通讯部分*******************************/
  201. void init_IR()
  202. {
  203.         TMOD=0x02;  //定时器0工作模式二,8位自动重装
  204.         TL0=TH0=0;  //定时器0溢出一次时间为256个机器周期
  205.         EA=1;       //开启总中断
  206.         ET0=1;      //开启定时器0中断
  207.         TR0=1;      //启动定时器0

  208.         IT0=1;      //外部中断1跳边沿触发
  209.         EX0=1;      //开启外部中断1

  210. }
  211. //把提取的33次脉宽进行解码 NEC协议
  212. void IRcordpro()
  213. {
  214.         uchar i;//i是用于计数处理4个字节
  215.         uchar j;//j用于计数处理1个字节的8位数据
  216.         uchar k;//k用于计数处理33次脉宽
  217.         k = 1;//从第一位脉宽开始处理,丢掉起始码
  218.         for(i = 0; i < 4; i++)
  219.         {
  220.                 for(j = 0; j < 8; j++)
  221.                 {
  222.                         //如果脉宽大于数据0标准的1125us那么就判定为数据1
  223.                         if(IRdata[k] > 5) IRcord[i] |= 0x80;//写1
  224.                         //只能右移7次,如果右移8次则会把第一位数据移出去
  225.                         if(j < 7) IRcord[i] >>= 1;
  226.                         k++; //处理下一次脉宽
  227.                 }
  228.         }
  229.         IRpro_ok = 1;//解码完成
  230. }
  231. void menu()
  232. {
  233.         if(IRcord[2]==0x47)
  234.         {
  235.                 IRcord[2]=0;
  236.                  beep_play();
  237.                 SetState=~SetState;
  238.                 SetPlace=0;
  239.                 Ds1302Init();

  240.         }
  241. }

  242. /*******************************************************************************/

  243. /*******************************************************************************
  244. * 函数名         : main
  245. * 函数功能                   : 主函数
  246. * 输入           : 无
  247. * 输出                  : 无
  248. *******************************************************************************/

  249. void main()
  250. {
  251.         unsigned char i;
  252.         Int1Configuration();
  253.         LcdInit();
  254.         init_IR();
  255.         Ds1302Init();
  256.          CHG_light_out();
  257.          
  258.         while(1)
  259.         {        
  260.                         LcdWriteCom(0x80);
  261.                                 LcdWriteCom(0x0f);
  262.                 if(IRok)//判断33次脉宽是否提取完成
  263.                 {
  264.                          IRcordpro();//根据脉宽解码出4个字节的数据
  265.                         IRok = 0;//清零脉宽检查完成标志位等待下一次脉宽检查
  266.                         if(IRpro_ok)//判断解码是否完成
  267.                         {
  268.                                 if(IRcord[2]==0x40)
  269.                                 {
  270.                                         //led8=0;
  271.                                 }
  272.                         }
  273.                 }         
  274.                 Display_led();
  275.                 menu();
  276.                 if(SetState==0)
  277.                 {
  278.                         Ds1302ReadTime();
  279.                 }
  280.                 else
  281.                 {

  282.                                 if(IRcord[2]==0x44)
  283.                                 {
  284.                                   SetPlace++;
  285.                         
  286.                                         beep_play();
  287.                                         if(SetPlace>=7)
  288.                                                 SetPlace=0;
  289.                                                 IRcord[2]=0;
  290.                                  }
  291.                         

  292.                 if(IRcord[2]==0x40)
  293.                 {
  294.                                         TIME[SetPlace]++;
  295.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  296.                                         {
  297.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  298.                                         }
  299.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  300.                                         {
  301.                                                 TIME[SetPlace]=0;
  302.                                         }
  303.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  304.                                         {
  305.                                                 TIME[SetPlace]=0;
  306.                                         }
  307.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  308.                                         {
  309.                                                 TIME[SetPlace]=0;        
  310.                                         }
  311.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  312.                                         {
  313.                                                 TIME[SetPlace]=0;
  314.                                         }        
  315.                                         if((TIME[SetPlace]>=0x8)&&(SetPlace==5))                //周只能到7
  316.                                         {
  317.                                                 TIME[SetPlace]=1;
  318.                                         }               
  319. //                                        if(SetPlace==5)                //月只能到12
  320. //                                        {
  321. //                                                TIME[SetPlace]=;
  322. //                                        }
  323.                                         beep_play();
  324.                                         IRcord[2]=0;        
  325.                                 }                                                                        
  326.                 }
  327.                 LcdDisplay();        
  328.         }
  329.         
  330. }
  331. /*******************************************************************************
  332. * 函数名         : LcdDisplay()
  333. * 函数功能                   : 显示函数
  334. * 输入           : 无
  335. * 输出                  : 无
  336. *******************************************************************************/

  337. void LcdDisplay()
  338. {
  339.         LcdWriteCom(0x80+0X40);
  340.         LcdWriteData('0'+TIME[2]/16);                                //时
  341.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  342.         LcdWriteData('-');
  343.         LcdWriteData('0'+TIME[1]/16);                                //分
  344.         LcdWriteData('0'+(TIME[1]&0x0f));        
  345.         LcdWriteData('-');
  346.         LcdWriteData('0'+TIME[0]/16);                                //秒
  347.         LcdWriteData('0'+(TIME[0]&0x0f));

  348.         LcdWriteCom(0x80);
  349.         LcdWriteData('2');
  350.         LcdWriteData('0');
  351.         LcdWriteData('0'+TIME[6]/16);                        //年
  352.         LcdWriteData('0'+(TIME[6]&0x0f));
  353.         LcdWriteData('-');
  354.         LcdWriteData('0'+TIME[4]/16);                        //月
  355.         LcdWriteData('0'+(TIME[4]&0x0f));
  356.         LcdWriteData('-');
  357.         LcdWriteData('0'+TIME[3]/16);                        //日
  358.         LcdWriteData('0'+(TIME[3]&0x0f));
  359.         LcdWriteCom(0x8D);
  360.         LcdWriteData('0'+(TIME[5]&0x07));        //星期                        
  361. }
  362. /*******************************************************************************
  363. * 函数名         : Int0Configuration()
  364. * 函数功能                   : 配置外部中断0
  365. * 输入           : 无
  366. * 输出                  : 无
  367. *******************************************************************************/

  368. void Int1Configuration()
  369. {
  370.         //设置INT1
  371.         IT1=1;//跳变沿出发方式(下降沿)
  372.         EX1=1;//打开INT1的中断允许。
  373.         EA=1;//打开总中断        
  374. }
  375. /*******************************************************************************
  376. * 函数名         : Int0()
  377. * 函数功能                   : 外部中断0 中断函数
  378. * 输入           : 无
  379. * 输出                  : 无
  380. *******************************************************************************/

  381. void Int1() interrupt 2                 
  382. {
  383. //        Delay10ms();
  384.         //if(K3==0)
  385.                  beep_play();
  386.                 SetState=~SetState;
  387.                 SetPlace=0;
  388.                 Ds1302Init();        
  389.         
  390. }

  391. //定时器0中断,每中断一次需要256*1.085us =  277.76us
  392. void time0() interrupt 1
  393. {
  394. ……………………

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

所有资料51hei提供下载:
灯网络系统.zip (54.55 KB, 下载次数: 5)


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

使用道具 举报

沙发
ID:1 发表于 2019-5-24 05:46 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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