標(biāo)題:
基于STC8A8單片機(jī)智能窗簾源程序
[打印本頁(yè)]
作者:
whwteng
時(shí)間:
2020-7-8 14:08
標(biāo)題:
基于STC8A8單片機(jī)智能窗簾源程序
LCD1602-光控-按鍵-電機(jī)-ds1302-ds18b20-ad采集,后續(xù)把原理圖和PCB補(bǔ)上,因?yàn)樵诠疚募こ滩辉,沒(méi)辦法上傳,望能幫到你們
單片機(jī)源程序如下:
#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;//開(kāi)關(guān)模式
bit flag_zd_sd; //自動(dòng) 手動(dòng) 模式
bit flag_lj_en; //按鍵連加使能
bit flag_lj_3_en; //按鍵連3次連加后使能 加的數(shù)就越大了
u8 key_time,flag_value; //用做連加的中間變量
bit key_500ms ;
u8 menu_shudu = 20; //用來(lái)控制連加的速度
u8 value,i;
u8 k_shi=1,k_fen=2; //開(kāi)窗簾時(shí)間
u8 g_shi=3,g_fen=4; //關(guān)窗簾時(shí)間
u16 t_high; //高溫報(bào)警值
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; //減
/*************寫(xiě)單片機(jī)內(nèi)部EEPOM*************/
void write_eepom()
{
IapEraseSector(0x0000); //擦除這個(gè)地址的
IapProgramByte(0x0000,flag_zd_sd); //自動(dòng),手動(dòng)模式存入
IapProgramByte(0x0200,k_shi%256); //開(kāi)窗時(shí)間-小時(shí)存入-8位
IapProgramByte(0x0400,k_fen%256); //開(kāi)窗時(shí)間-分鐘存入-8位
IapProgramByte(0x0600,g_shi%256); //關(guān)窗時(shí)間-小時(shí)存入-8位
IapProgramByte(0x0800,g_fen%256); //關(guān)窗時(shí)間-分鐘存入-8位
IapProgramByte(0x0A00,t_high%256); //高溫報(bào)警值存入-8位
IapProgramByte(0x0C00,guanxian_set%256); //關(guān)窗設(shè)置存入-8位
IapProgramByte(0x0E00,bjdj_value%256); //步進(jìn)電機(jī)的量存入-8位
IapProgramByte(0x1000,a_a);
}
/*************讀單片機(jī)內(nèi)部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; //模式設(shè)置
a_a = 1;
k_shi=8;
k_fen=2; //開(kāi)
g_shi=3;
g_fen=4; //關(guān)
t_high = 35;
guanxian_set = 4;
bjdj_value = 0;
write_eepom();
}
}
#include "menu.h"
/***************讀數(shù)模轉(zhuǎn)換數(shù)據(jù)****************/
//請(qǐng)先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來(lái)讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來(lái)理解,本函數(shù)是模擬0832的串行協(xié)議進(jìn)行的
// 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; //開(kāi)始
SCL=1; //第一個(gè)上升沿
SCL=0;
DO=SGL;
SCL=1; //第二個(gè)上升沿
SCL=0;
DO=ODD;
SCL=1; //第三個(gè)上升沿
SCL=0; //第三個(gè)下降沿
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0; //開(kāi)始從第四個(gè)下降沿接收數(shù)據(jù)
value<<=1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{ //接收校驗(yàn)數(shù)據(jù)
value1>>=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
CS=1;
SCL=1;
if(value==value1) //與校驗(yàn)數(shù)據(jù)比較,正確就返回?cái)?shù)據(jù),否則返回0
return value;
return 0;
}
/******************1ms 延時(shí)函數(shù)-晶振24兆*******************/
void delay_1ms(u16 q) //當(dāng)q=1時(shí),精確延時(shí)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);
}
/*************定時(shí)器0初始化程序***************/
void init_time0()
{
TMOD = Tmod_Data;
TH0 = 0X15;
TL0 = 0XA0; //30ms
ET0 = 1; //開(kāi)定時(shí)器0中斷
TR0 = 1; //允許定時(shí)器0定時(shí)
EA = 1; //開(kāi)總中斷
}
/*************手動(dòng)開(kāi)關(guān)窗簾***************/
void shoudong_kaiguan() //手動(dòng)開(kāi)關(guān)窗簾
{
if(flag_zd_sd == 0) //手動(dòng)模式
{
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; //手動(dòng)開(kāi)窗
if(key_can == 3)
flag_z_f = 2; //手動(dòng)關(guān)窗
if(flag_lj_en == 0)
flag_z_f = 0;
}
}
}
if(flag_kaig_moshi == 0)
{
if(flag_zd_sd == 1) //自動(dòng)模式
{
if(guanxian <= guanxian_set)
flag_z_f = 2; //手動(dòng)開(kāi)窗
else
flag_z_f = 1; //手動(dòng)關(guān)窗
}
}
}
/*********************智能窗簾處理函數(shù)***********************/
void zinengchuanglian_dis() //智能窗簾處理函數(shù)
{
if((miao == 0) && (fen == k_fen) && (shi == k_shi)) //定時(shí)開(kāi)窗
{
flag_z_f = 2; //關(guān)窗
beep=0; //鬧鐘到
flag_kaig_moshi = 1;
}
if((miao == 0) && (fen == g_fen) && (shi == g_shi)) //定時(shí)關(guān)窗
{
flag_z_f = 1; //開(kāi)窗
flag_kaig_moshi = 2;
}
}
void main()
{
init_eepom(); //初始化EEPROM
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化顯示
init_ds1302_io(); //初始化ds1302Io
init_time0(); //初始化定時(shí)器
menu_1_break(); //菜單初始界面
init_ds1302(); //ds1302初始化
temperature1 = read1_temp(); //讀溫度1
delay_1ms(650);
while(1)
{
key(); //按鍵程序
if(key_can < 10)
{
key_with();
}
shoudong_kaiguan(); //手動(dòng)開(kāi)關(guān)窗簾
if(flag_200ms == 1)
{
flag_200ms = 0;
temperature1 = read1_temp(); //讀溫度1 環(huán)境溫度
if(temperature1 >= 99)
temperature1 = 99;
zinengchuanglian_dis(); //智能窗簾處理函數(shù)
guanxian = ad0832read(1,0) * 9.0 / 255;
if((menu_1 == 0))
{
read_time(); //讀時(shí)間
init_1602_ds1302(); //顯示時(shí)鐘
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; //溫度報(bào)警 ,蜂鳴器報(bào)警
else
beep = 1;
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有程序51hei提供下載:
源碼-智能窗簾.zip
(126.18 KB, 下載次數(shù): 15)
2020-7-8 14:04 上傳
點(diǎn)擊文件名下載附件
基于STC8diy智能窗簾
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1