求大神幫忙指導下.不懂問他,結果被罵了
這個程序在proteus中運行后,顯示屏的第二行最前面的4什么意思啊?有什么作用嗎?是一開始就設置好開關窗簾的時間和光強嗎?我按照程序的手動和自動設置了,怎么沒有反應?(在手動開關窗簾的那部分代碼,是怎么體現開關的?步進電機沒反應啊,是需要按哪個鍵嗎?自動模式下的光強怎么設置啊?不是預設值4嗎?在怎么設置光強?)【手動開關窗簾、智能窗簾處理函數】這的程序沒看懂,求指教 (附件和圖片怎么發不了?)另,這個程序是在proteus中仿真的,沒有實物
單片機源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit flag_200ms ;
sbit beep = P1^7; //蜂鳴器IO口定義
sbit LED=P2^7; //燈光模塊
sbit yw=P2^6; //煙霧模塊
bit flag_relay_en;
uchar flag_kaig_moshi=0;//開關模式
bit flag_zd_sd; //自動 手動 模式
bit flag_lj_en; //按鍵連加使能
bit flag_lj_3_en; //按鍵連3次連加后使能 加的數就越大了
uchar key_time,flag_value; //用做連加的中間變量
bit key_500ms ;
uchar menu_shudu = 20; //用來控制連加的速度
uchar value,i;
uchar k_shi=1,k_fen=2; //開窗簾時間
uchar g_shi=3,g_fen=4; //關窗簾時間
uint t_high; //高溫報警值
sbit DO=P3^7; //DO定義為P1口的第4位腳,連接ADC0832DO腳
sbit SCL=P3^6; //SCL定義為P1口的第3位腳,連接ADC0832SCL腳
sbit CS=P3^5; //CS定義為P1口的第4位腳,連接ADC0832CS腳
uchar 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()
{
SectorErase(0x2000);
byte_write(0x2000,flag_zd_sd);
byte_write(0x2001,k_shi%256);
byte_write(0x2002,k_fen%256);
byte_write(0x2003,g_shi%256);
byte_write(0x2004,g_fen%256);
byte_write(0x2005,t_high%256);
byte_write(0x2009,guanxian_set%256);
byte_write(0x2010,bjdj_value%256);
byte_write(0x2050,a_a);
}
/*************讀單片機內部EEPOM*************/
void read_eepom()
{
flag_zd_sd = byte_read(0x2000);
k_shi = byte_read(0x2001);
k_fen = byte_read(0x2002);
g_shi = byte_read(0x2003);
g_fen = byte_read(0x2004);
t_high = byte_read(0x2005);
guanxian_set = byte_read(0x2009);
bjdj_value = byte_read(0x2010);
a_a = byte_read(0x2050);
}
/*************初始化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 延時函數*******************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/*************時鐘的顯示***************/
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()
{
EA = 1; //開總中斷
TMOD = 0X01; //定時器0、工作方式1
ET0 = 1; //開定時器0中斷
TR0 = 1; //允許定時器0定時
}
/*************手動開關窗簾***************/
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)||(yw==0))
beep = ~beep; //蜂鳴器溫度煙霧報警
else
beep = 1;
}
}
bujindj(); //步進電機函數
}
}
void time0() interrupt 1
{
static uchar value;
TH0 = 0X3C;
TL0 = 0XB0; //50ms
value ++;
if(value >= 4) //200ms
{
value = 0;
flag_200ms = 1;
}
if(flag_lj_en == 1) //按下按鍵使能
{
key_time ++;
if(key_time >= menu_shudu) //500ms
{
key_time = 0;
key_500ms = 1; //500ms
flag_value ++;
if(flag_value > 3)
{
flag_value = 10;
flag_lj_3_en = 1; //3次后1.5秒后連加大些
}
}
}
}
|