找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STC8A8单片机智能窗帘源程序

[复制链接]
跳转到指定楼层
楼主
ID:327265 发表于 2020-7-8 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LCD1602-光控-按键-电机-ds1302-ds18b20-ad采集,后续把原理图和PCB补上,因为在公司文件工程不在,没办法上传,望能帮到你们

单片机源程序如下:
  1. #include <STC8.h>
  2. #include "INIT.h"


  3. bit flag_200ms ;
  4. sbit beep = P1^0;     //蜂鸣器IO口定义
  5. sbit LED=P1^5;        //灯光模块
  6. bit flag_relay_en;   
  7. u8 flag_kaig_moshi=0;//开关模式
  8. bit flag_zd_sd;                  //自动 手动 模式

  9. bit flag_lj_en;                 //按键连加使能
  10. bit flag_lj_3_en;         //按键连3次连加后使能 加的数就越大了
  11. u8 key_time,flag_value;      //用做连加的中间变量
  12. bit key_500ms  ;
  13. u8 menu_shudu = 20;  //用来控制连加的速度
  14. u8 value,i;

  15. u8 k_shi=1,k_fen=2;        //开窗帘时间
  16. u8 g_shi=3,g_fen=4;                        //关窗帘时间

  17. u16 t_high;                  //高温报警值

  18. sbit DO=P1^3;                //DO定义为P1口的第4位脚,连接ADC0832DO脚
  19. sbit SCL=P1^2;                //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
  20. sbit CS=P1^1;                //CS定义为P1口的第4位脚,连接ADC0832CS脚
  21. u8 guanxian,guanxian_set = 4;     //光线
  22. void write_eepom();


  23. #include "eepom52.h"
  24. #include "key.h"
  25. #include "ds1302.h"
  26. #include "lcd1602.h"
  27. #include "18b20_2lu.h"
  28. #include "bujindianji.h"

  29. sbit key_jia = P3^1;   //加
  30. sbit key_jie = P3^2;   //减


  31. /*************写单片机内部EEPOM*************/
  32. void write_eepom()
  33. {        
  34.         IapEraseSector(0x0000);               //擦除这个地址的
  35.         IapProgramByte(0x0000,flag_zd_sd);     //自动,手动模式存入
  36.         IapProgramByte(0x0200,k_shi%256);      //开窗时间-小时存入-8位
  37.         IapProgramByte(0x0400,k_fen%256);      //开窗时间-分钟存入-8位
  38.         IapProgramByte(0x0600,g_shi%256);      //关窗时间-小时存入-8位
  39.         IapProgramByte(0x0800,g_fen%256);      //关窗时间-分钟存入-8位
  40.         IapProgramByte(0x0A00,t_high%256);     //高温报警值存入-8位
  41.         IapProgramByte(0x0C00,guanxian_set%256);        //关窗设置存入-8位
  42.         IapProgramByte(0x0E00,bjdj_value%256);          //步进电机的量存入-8位
  43.         IapProgramByte(0x1000,a_a);        
  44. }

  45. /*************读单片机内部EEPOM*************/
  46. void read_eepom()
  47. {
  48.         flag_zd_sd = IapReadByte(0x0000);        
  49.         k_shi  = IapReadByte(0x0200);        
  50.         k_fen  = IapReadByte(0x0400);        
  51.         g_shi  = IapReadByte(0x0600);        
  52.         g_fen  = IapReadByte(0x0800);        
  53.         t_high  = IapReadByte(0x0A00);        
  54.         guanxian_set  = IapReadByte(0x0C00);        
  55.         bjdj_value  = IapReadByte(0x0E00);        
  56.         a_a = IapReadByte(0x1000);
  57. }        

  58. /*************初始化EEPROM************/
  59. void init_eepom()        //初始化EEPROM
  60. {
  61.         read_eepom();
  62.          if(a_a == 0xff)        
  63.         {
  64.                 flag_zd_sd = 1;     //模式设置
  65.                 a_a = 1;
  66.                 k_shi=8;
  67.                 k_fen=2;                        //开
  68.                 g_shi=3;
  69.                 g_fen=4;                        //关
  70.                 t_high  = 35;        
  71.                 guanxian_set = 4;
  72.                 bjdj_value  = 0;
  73.                 write_eepom();               
  74.         }
  75. }
  76. #include "menu.h"

  77. /***************读数模转换数据****************/        
  78. //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
  79.                                                 //  1  0  0 通道
  80.                                                 //  1  1  1 通道
  81. unsigned char ad0832read(bit SGL,bit ODD)
  82. {
  83.         unsigned char i=0,value=0,value1=0;               
  84.                 SCL=0;
  85.                 DO=1;
  86.                 CS=0;                //开始
  87.                 SCL=1;                //第一个上升沿        
  88.                 SCL=0;
  89.                 DO=SGL;
  90.                 SCL=1;          //第二个上升沿
  91.                 SCL=0;
  92.                 DO=ODD;
  93.                 SCL=1;            //第三个上升沿
  94.                 SCL=0;            //第三个下降沿
  95.                 DO=1;
  96.                 for(i=0;i<8;i++)
  97.                 {
  98.                         SCL=1;
  99.                         SCL=0; //开始从第四个下降沿接收数据
  100.                         value<<=1;
  101.                         if(DO)
  102.                                 value++;                                                
  103.                 }
  104.                 for(i=0;i<8;i++)
  105.                 {                        //接收校验数据
  106.                         value1>>=1;
  107.                         if(DO)
  108.                                 value1+=0x80;
  109.                         SCL=1;
  110.                         SCL=0;
  111.                 }
  112.                 CS=1;
  113.                 SCL=1;        
  114.                 if(value==value1)                //与校验数据比较,正确就返回数据,否则返回0        
  115.                         return value;
  116.         return 0;
  117. }



  118. /******************1ms 延时函数-晶振24兆*******************/
  119. void delay_1ms(u16 q)   //当q=1时,精确延时1ms
  120. {
  121.         u16 i,j;
  122.         for(i=q;i>0;i--)
  123.                 for(j=1845;j>0;j--);
  124. }

  125. /*************1602显示ds1302初始化程序***************/
  126. void init_1602_ds1302()
  127. {
  128.         write_sfm2_ds1302(2,4,nian);        
  129.         write_sfm2_ds1302(2,7,yue);        
  130.         write_sfm2_ds1302(2,10,ri);        
  131.         write_sfm2_ds1302(1,4,shi);        
  132.         write_sfm2_ds1302(1,7,fen);        
  133.         write_sfm2_ds1302(1,10,miao);
  134.         write_sfm1(1,14,week);               
  135. }                                                                           


  136. /*************定时器0初始化程序***************/
  137. void init_time0()         
  138. {
  139.         TMOD = Tmod_Data;         
  140.         TH0 = 0X15;
  141.         TL0 = 0XA0;           //30ms
  142.         ET0  = 1;                  //开定时器0中断
  143.         TR0  = 1;                  //允许定时器0定时
  144.         EA   = 1;                   //开总中断
  145. }

  146. /*************手动开关窗帘***************/
  147. void shoudong_kaiguan()          //手动开关窗帘
  148. {
  149.         if(flag_zd_sd == 0)          //手动模式
  150.         {
  151.                 if(guanxian <= guanxian_set)
  152.                          LED=0;
  153.                         else
  154.                          LED=1;
  155.                 if(menu_1 == 0)
  156.                 {
  157.                         if(flag_kaig_moshi == 0)
  158.                         {
  159.                                 if(key_can == 2)
  160.                                         flag_z_f = 1;     //手动开窗
  161.                                 if(key_can == 3)
  162.                                         flag_z_f = 2;     //手动关窗
  163.                                 if(flag_lj_en == 0)
  164.                                         flag_z_f = 0;
  165.                         }
  166.                 }
  167.         }
  168.         if(flag_kaig_moshi == 0)
  169.         {
  170.         
  171.                 if(flag_zd_sd == 1)          //自动模式
  172.                 {
  173.                         
  174.                         if(guanxian <= guanxian_set)
  175.                                 flag_z_f = 2;     //手动开窗
  176.                         
  177.                                 
  178.                         else
  179.                                 flag_z_f = 1;     //手动关窗
  180.                 }
  181.         }
  182. }

  183.                                                                                                                         
  184. /*********************智能窗帘处理函数***********************/
  185. void zinengchuanglian_dis()          //智能窗帘处理函数
  186. {
  187.         if((miao == 0) && (fen == k_fen) && (shi == k_shi))          //定时开窗
  188.         {
  189.                 flag_z_f = 2;    //关窗
  190.                 beep=0;                          //闹钟到
  191.                 flag_kaig_moshi = 1;
  192.         }
  193.         if((miao == 0) && (fen == g_fen) && (shi == g_shi))          //定时关窗
  194.         {
  195.                 flag_z_f = 1;     //开窗   
  196.                 flag_kaig_moshi = 2;
  197.         }

  198. }


  199. void main()
  200. {        
  201.         init_eepom();                 //初始化EEPROM
  202.         init_1602();                 //lcd1602初始化
  203.         init_1602_dis_csf(); //lcd1602初始化显示
  204.         init_ds1302_io();         //初始化ds1302Io
  205.         init_time0();                 //初始化定时器
  206.         menu_1_break();             //菜单初始界面
  207.         init_ds1302();                 //ds1302初始化
  208.         temperature1 = read1_temp();  //读温度1
  209.         delay_1ms(650);
  210.         while(1)
  211.         {
  212.                 key();                         //按键程序
  213.                 if(key_can < 10)
  214.                 {
  215.                         key_with();        
  216.                 }
  217.                 shoudong_kaiguan();          //手动开关窗帘
  218.                 if(flag_200ms == 1)
  219.                 {               
  220.                         flag_200ms = 0;
  221.                         temperature1 = read1_temp();  //读温度1        环境温度
  222.                         if(temperature1 >= 99)
  223.                                 temperature1 = 99;
  224.                         zinengchuanglian_dis();          //智能窗帘处理函数
  225.                         guanxian = ad0832read(1,0) * 9.0 / 255;
  226.                         if((menu_1 == 0))
  227.                         {
  228.                                 read_time();                  //读时间
  229.                                 init_1602_ds1302();   //显示时钟
  230.                                 write_sfm_18b20(2,13,temperature1);        //显示温度
  231.                                 write_sfm1(2,0,guanxian);        //显示温度
  232.                                           if(guanxian <= guanxian_set)
  233.                          LED=0;
  234.                         else
  235.                          LED=1;
  236.                                 if(temperature1 >= t_high)
  237.                                         beep =        ~beep;   //温度报警 ,蜂鸣器报警
  238.                                 else
  239.                                         beep = 1;        
  240. ……………………

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

所有程序51hei提供下载:
源码-智能窗帘.zip (126.18 KB, 下载次数: 15)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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