一.程序试题




二.参考程序
main.c函数
/*头文件声明区*/
#include <STC15F2K60S2.H>
#include "key.h"
#include "seg.h"
#include "ds1302.h"
#include "onewire.h"
/*变量声明区*/
unsigned char key_Slow_Down;//按键减速专用变量 10ms
unsigned int seg_Slow_Down;//数码管减速专用变量 100ms
unsigned char seg_mode = 0; //数码管模式变量
unsigned char work_mode = 0; //工作模式变量:0为温度控制,1为时间控制
unsigned char key_Val,key_Down,key_Old,key_Up;//按键扫描专用变量
unsigned char seg_Pos;//数码管、LED扫描变量
//unsigned char seg_Point[8] = {1,1,5,3,4,5,6,7}; //数码管小数点数据存放数组
unsigned char seg_Buf[8] = {10,10,10,10,10,10,10,10}; //存储数码管显示数据的数组
unsigned char uLed[8] = {0,0,0,0,0,0,0,0}; //Led显示数据存放数组:0不亮,1亮
//定义DS1302读操作的日历时钟存储器地址
unsigned char code Read_RTC_addr[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//定义DS1302写操作的日历时钟存储器地址
unsigned char code Write_RTC_addr[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char TIME[7] = {0x50,0x25,0x23,0x15,0x12,0x07,0x22};//秒,分,时,日,月,周,年
unsigned int DS18B20_Read();
unsigned char Temp_Disp = 25;//温度实时显示变量,便于后面与控制温度作比较
unsigned char Temp_ctrol = 23;//温度参数
unsigned char L3_flag = 0; //L3闪烁标志位(当继电器吸合时每100ms闪烁一次)
unsigned char L3_100ms = 0; //L3专用定时变量
/*按键减速专用变量:10ms检测一次*/
void Key_Proc()
{
if(key_Slow_Down) return;
key_Slow_Down = 1; //按键减速程序
key_Val = Key_Read();//读取按键按下的键码值
key_Down = key_Val & (key_Old ^ key_Val);//捕捉下降沿
key_Up = ~key_Val & (key_Old ^ key_Val);//捕捉上升沿
key_Old = key_Val;//辅助扫描
/***在处于时间显示界面的前提下,长按S17跳转到分—秒显示,松手跳转回来***/
if(seg_mode == 1){
if(key_Old == 17)
seg_mode = 3;
}
if(seg_mode == 3)
if(key_Up == 17)
seg_mode = 1;
switch(key_Down) //实现界面切换参数的改变
{
case 12:
if(++seg_mode == 3) seg_mode = 0; //界面切换
break;
case 16: //控制界面+
if(seg_mode == 2){
if(Temp_ctrol<99)
Temp_ctrol++;
else
Temp_ctrol = 10;
}
break;
case 13:
//