LCD1602-光控-按鍵-電機-ds1302-ds18b20-ad采集,后續把原理圖和PCB補上,因為在公司文件工程不在,沒辦法上傳,望能幫到你們
單片機源程序如下:
- #include <STC8.h>
- #include "INIT.h"
- bit flag_200ms ;
- sbit beep = P1^0; //蜂鳴器IO口定義
- sbit LED=P1^5; //燈光模塊
- bit flag_relay_en;
- u8 flag_kaig_moshi=0;//開關模式
- bit flag_zd_sd; //自動 手動 模式
- bit flag_lj_en; //按鍵連加使能
- bit flag_lj_3_en; //按鍵連3次連加后使能 加的數就越大了
- u8 key_time,flag_value; //用做連加的中間變量
- bit key_500ms ;
- u8 menu_shudu = 20; //用來控制連加的速度
- u8 value,i;
- u8 k_shi=1,k_fen=2; //開窗簾時間
- u8 g_shi=3,g_fen=4; //關窗簾時間
-
- u16 t_high; //高溫報警值
- sbit DO=P1^3; //DO定義為P1口的第4位腳,連接ADC0832DO腳
- sbit SCL=P1^2; //SCL定義為P1口的第3位腳,連接ADC0832SCL腳
- sbit CS=P1^1; //CS定義為P1口的第4位腳,連接ADC0832CS腳
- u8 guanxian,guanxian_set = 4; //光線
- void write_eepom();
- #include "eepom52.h"
- #include "key.h"
- #include "ds1302.h"
- #include "lcd1602.h"
- #include "18b20_2lu.h"
- #include "bujindianji.h"
- sbit key_jia = P3^1; //加
- sbit key_jie = P3^2; //減
- /*************寫單片機內部EEPOM*************/
- void write_eepom()
- {
- IapEraseSector(0x0000); //擦除這個地址的
- IapProgramByte(0x0000,flag_zd_sd); //自動,手動模式存入
- IapProgramByte(0x0200,k_shi%256); //開窗時間-小時存入-8位
- IapProgramByte(0x0400,k_fen%256); //開窗時間-分鐘存入-8位
- IapProgramByte(0x0600,g_shi%256); //關窗時間-小時存入-8位
- IapProgramByte(0x0800,g_fen%256); //關窗時間-分鐘存入-8位
- IapProgramByte(0x0A00,t_high%256); //高溫報警值存入-8位
- IapProgramByte(0x0C00,guanxian_set%256); //關窗設置存入-8位
- IapProgramByte(0x0E00,bjdj_value%256); //步進電機的量存入-8位
- IapProgramByte(0x1000,a_a);
- }
- /*************讀單片機內部EEPOM*************/
- void read_eepom()
- {
- flag_zd_sd = IapReadByte(0x0000);
- k_shi = IapReadByte(0x0200);
- k_fen = IapReadByte(0x0400);
- g_shi = IapReadByte(0x0600);
- g_fen = IapReadByte(0x0800);
- t_high = IapReadByte(0x0A00);
- guanxian_set = IapReadByte(0x0C00);
- bjdj_value = IapReadByte(0x0E00);
- a_a = IapReadByte(0x1000);
- }
- /*************初始化EEPROM************/
- void init_eepom() //初始化EEPROM
- {
- read_eepom();
- if(a_a == 0xff)
- {
- flag_zd_sd = 1; //模式設置
- a_a = 1;
- k_shi=8;
- k_fen=2; //開
- g_shi=3;
- g_fen=4; //關
- t_high = 35;
- guanxian_set = 4;
- bjdj_value = 0;
- write_eepom();
- }
- }
- #include "menu.h"
- /***************讀數模轉換數據****************/
- //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
- // 1 0 0 通道
- // 1 1 1 通道
- unsigned char ad0832read(bit SGL,bit ODD)
- {
- unsigned char i=0,value=0,value1=0;
- SCL=0;
- DO=1;
- CS=0; //開始
- SCL=1; //第一個上升沿
- SCL=0;
- DO=SGL;
- SCL=1; //第二個上升沿
- SCL=0;
- DO=ODD;
- SCL=1; //第三個上升沿
- SCL=0; //第三個下降沿
- DO=1;
- for(i=0;i<8;i++)
- {
- SCL=1;
- SCL=0; //開始從第四個下降沿接收數據
- value<<=1;
- if(DO)
- value++;
- }
- for(i=0;i<8;i++)
- { //接收校驗數據
- value1>>=1;
- if(DO)
- value1+=0x80;
- SCL=1;
- SCL=0;
- }
- CS=1;
- SCL=1;
- if(value==value1) //與校驗數據比較,正確就返回數據,否則返回0
- return value;
- return 0;
- }
- /******************1ms 延時函數-晶振24兆*******************/
- void delay_1ms(u16 q) //當q=1時,精確延時1ms
- {
- u16 i,j;
- for(i=q;i>0;i--)
- for(j=1845;j>0;j--);
- }
- /*************1602顯示ds1302初始化程序***************/
- void init_1602_ds1302()
- {
- write_sfm2_ds1302(2,4,nian);
- write_sfm2_ds1302(2,7,yue);
- write_sfm2_ds1302(2,10,ri);
- write_sfm2_ds1302(1,4,shi);
- write_sfm2_ds1302(1,7,fen);
- write_sfm2_ds1302(1,10,miao);
- write_sfm1(1,14,week);
- }
- /*************定時器0初始化程序***************/
- void init_time0()
- {
- TMOD = Tmod_Data;
- TH0 = 0X15;
- TL0 = 0XA0; //30ms
- ET0 = 1; //開定時器0中斷
- TR0 = 1; //允許定時器0定時
- EA = 1; //開總中斷
- }
- /*************手動開關窗簾***************/
- void shoudong_kaiguan() //手動開關窗簾
- {
- if(flag_zd_sd == 0) //手動模式
- {
- if(guanxian <= guanxian_set)
- LED=0;
- else
- LED=1;
- if(menu_1 == 0)
- {
- if(flag_kaig_moshi == 0)
- {
- if(key_can == 2)
- flag_z_f = 1; //手動開窗
- if(key_can == 3)
- flag_z_f = 2; //手動關窗
- if(flag_lj_en == 0)
- flag_z_f = 0;
- }
- }
- }
- if(flag_kaig_moshi == 0)
- {
-
- if(flag_zd_sd == 1) //自動模式
- {
-
- if(guanxian <= guanxian_set)
- flag_z_f = 2; //手動開窗
-
-
- else
- flag_z_f = 1; //手動關窗
- }
- }
- }
-
- /*********************智能窗簾處理函數***********************/
- void zinengchuanglian_dis() //智能窗簾處理函數
- {
- if((miao == 0) && (fen == k_fen) && (shi == k_shi)) //定時開窗
- {
- flag_z_f = 2; //關窗
- beep=0; //鬧鐘到
- flag_kaig_moshi = 1;
- }
- if((miao == 0) && (fen == g_fen) && (shi == g_shi)) //定時關窗
- {
- flag_z_f = 1; //開窗
- flag_kaig_moshi = 2;
- }
- }
- void main()
- {
- init_eepom(); //初始化EEPROM
- init_1602(); //lcd1602初始化
- init_1602_dis_csf(); //lcd1602初始化顯示
- init_ds1302_io(); //初始化ds1302Io
- init_time0(); //初始化定時器
- menu_1_break(); //菜單初始界面
- init_ds1302(); //ds1302初始化
- temperature1 = read1_temp(); //讀溫度1
- delay_1ms(650);
- while(1)
- {
- key(); //按鍵程序
- if(key_can < 10)
- {
- key_with();
- }
- shoudong_kaiguan(); //手動開關窗簾
- if(flag_200ms == 1)
- {
- flag_200ms = 0;
- temperature1 = read1_temp(); //讀溫度1 環境溫度
- if(temperature1 >= 99)
- temperature1 = 99;
- zinengchuanglian_dis(); //智能窗簾處理函數
- guanxian = ad0832read(1,0) * 9.0 / 255;
- if((menu_1 == 0))
- {
- read_time(); //讀時間
- init_1602_ds1302(); //顯示時鐘
- write_sfm_18b20(2,13,temperature1); //顯示溫度
- write_sfm1(2,0,guanxian); //顯示溫度
- if(guanxian <= guanxian_set)
- LED=0;
- else
- LED=1;
- if(temperature1 >= t_high)
- beep = ~beep; //溫度報警 ,蜂鳴器報警
- else
- beep = 1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有程序51hei提供下載:
源碼-智能窗簾.zip
(126.18 KB, 下載次數: 15)
2020-7-8 14:04 上傳
點擊文件名下載附件
基于STC8diy智能窗簾 下載積分: 黑幣 -5
|