答案仅供参考,有错误欢迎指正,非常感谢!!!
文件较多,代码较长,感谢查看!!!
目录
题目分析
main.h
main.c
Init.h
Init.c
SMG.h
SMG.c
DSQ.h
DSQ.c
YanShi.h
YanShi.c
JZKey.h
JZKey.c
onewire.h
onewire.c
iic.h
iic.c
CSB.h
CSB.c
ChuanKou.h
ChuanKou.c
题目分析
这套题说真滴,是真的恶心,有一说一哈,估计能想出这套题的老师也是真的骚。最后的串口出现的问题,给我整了一天,人直接被整傻了,不过还好都给整出来了。
这里重点讨论一下接收指令和返回数据的格式。
它题目要求是这样子的:
我的理解是:“rn”不作转义字符,看到是啥,返回就是啥。还有,这套题我用了3个定时器。
main.h
#ifndef __MAIN_H_
#define __MAIN_H_
#define uchar unsigned char
#define uint unsigned int
#include
#include
#include
#include "Init.h"
#include "SMG.h"
#include "DSQ.h"
#include "YanShi.h"
#include "JZKey.h"
#include "onewire.h"
#include "iic.h"
#include "CSB.h"
#include "ChuanKou.h"
void SMG_XianShi();
void LED_XianShi();
#endif
main.c
#include "main.h"
uchar flag2=0;//定时器2标志位
uchar key_num=0;//键值
uchar jie_mian=0;//界面
uchar S13_AnTime_flag=0;//S13按键按下的时间标志位
uchar S12_AnTime_flag=0;//S12按键按下的时间标志位
uchar xian_shi=0;//显示
uchar can_shu=0;//参数
char WenDu_CanShu=30;//温度参数
char JuLi_CanShu=35;//距离参数
uint ci_shu=0;//次数
uchar DAC_KaiQi_flag=1;//DAC输出功能开启标志位
long int S12_KeyTime=0;//按键12按下的时间
long int S13_KeyTime=0;//按键13按下的时间
float wen_du;//温度
int WenDu_XianShi;//显示的温度
int ju_li;//距离
int WenDu_CanShu1=30;//温度参数,确定值
int JuLi_CanShu1=35;//距离参数,确定值
uchar zhi_ling[8];//接收到的指令
uchar i=0;//指令字符串的下标
uchar code ShuJu_ZhiLing[]="ST\r\n";//数据指令
uchar code CanShu_ZhiLing[]="PARA\r\n";//参数指令
uchar ZhiLing_TF=1;//指令的对错判断结果
uchar CSB_CaiJi_flag=100;//超声波采集虚拟中断标志位
uchar ChuanKou_time=0;//串口接收到错误指令的等待时间
void main(){
uchar j;
char FanHui_date[15];//向串口返回的数据
uchar key_num_old;//上一个键值
Init_BZ();
SMG_Init();
ChuanKou_Init();
DSQ_2_Init();
JZKey_Init();
while(1){
//采集温度
wen_du=DS18B20_GetWenDu();
WenDu_XianShi=wen_du*100;
//采集键值
key_num_old=key_num;
key_num=JZKey_GetKeynum();
if(key_num!=key_num_old||S13_AnTime_flag!=0||S12_AnTime_flag!=0){
if(S13_AnTime_flag==1){//S13按键为短按
jie_mian++;
jie_mian=jie_mian%2;
xian_shi=0;
can_shu=0;
S13_AnTime_flag=0;
if(jie_mian==0){
if(WenDu_CanShu!=WenDu_CanShu1||JuLi_CanShu!=JuLi_CanShu1){//如果参数发生变化
ci_shu++;//参数变动次数加l
IIC_EEPROM_XieDate(10,ci_shu&0x00ff);
Delay10ms();
IIC_EEPROM_XieDate(11,ci_shu>>8);
}
WenDu_CanShu1=WenDu_CanShu;
JuLi_CanShu1=JuLi_CanShu;
}
}
else if(S13_AnTime_flag==2){//S13按键为长按
DAC_KaiQi_flag++;//任何界面状态下,长按S13按键,可切换 DAC输出功能
DAC_KaiQi_flag=DAC_KaiQi_flag%2;
S13_AnTime_flag=0;
}
else if(S12_AnTime_flag==1){//S12按键为短按
if(jie_mian){//参数界面
can_shu++;
can_shu=can_shu%2;
}
else{//数据界面
xian_shi++;
xian_shi=xian_shi%3;
}
S12_AnTime_flag=0;
}
else if(S12_AnTime_flag==2){//S12为长按
ci_shu=0;//任何界面状态下,长按S12按键,可重置参数变动次数记录为0次。
S12_AnTime_flag=0;
IIC_EEPROM_XieDate(10,0);
Delay10ms();
IIC_EEPROM_XieDate(11,0);
}
else if(key_num==16){//按下S16
if(jie_mian==1&&can_shu==0){//在温度参数界面下,按下S16,温度参数减少2℃.
WenDu_CanShu=WenDu_CanShu-2;
if(WenDu_CanShu<0){
WenDu_CanShu=WenDu_CanShu+100;
}
}
else if(jie_mian==1&&can_shu==1){//在距离参数界面下,按下S16,距离参数减少5cm
JuLi_CanShu=JuLi_CanShu-5;
if(JuLi_CanShu<0){
JuLi_CanShu=JuLi_CanShu+100;
}
}
}
else if(key_num==17){//按下S17
if(jie_mian==1&&can_shu==0){//在温度参数界面下,按下S17,温度参数增加2℃。
WenDu_CanShu=WenDu_CanShu+2;
WenDu_CanShu=WenDu_CanShu%100;
}
else if(jie_mian==1&&can_shu==1){//在距离参数界面下,接下S17,距离参数增加5cm。
JuLi_CanShu=JuLi_CanShu+5;
JuLi_CanShu=JuLi_CanShu%100;
}
}
}
//采集距离
if(CSB_CaiJi_flag>=100){
ju_li=CSB_GetJuLi();
if(DAC_KaiQi_flag){//DAC输出功能启动状态
if(ju_li<=JuLi_CanShu1){
IIC_DAC_XieDate(102);
}
else{
IIC_DAC_XieDate(204);
}
}
else{//DAC输出功能关闭状态
IIC_DAC_XieDate(0.4*51.0);
}
CSB_CaiJi_flag=0;
}
//判断错误的指令
if(ChuanKou_time>=100){
ChuanKou_time=0;
i=0;
memset(zhi_ling,' ',sizeof(zhi_ling));
ChuanKou_FS_NeiRong("ERROR\r\n");
}
//指令对比,返回数据
if(i==6){//判断是否接收到"STrn"或者"PARAr"
Delay10ms();
if(i==6){
ZhiLing_TF=1;
for(j=0;j
#include "main.h"
uchar flag2=0;//定时器2标志位
uchar key_num=0;//键值
uchar jie_mian=0;//界面
uchar S13_AnTime_flag=0;//S13按键按下的时间标志位
uchar S12_AnTime_flag=0;//S12按键按下的时间标志位
uchar xian_shi=0;//显示
uchar can_shu=0;//参数
char WenDu_CanShu=30;//温度参数
char JuLi_CanShu=35;//距离参数
uint ci_shu=0;//次数
uchar DAC_KaiQi_flag=1;//DAC输出功能开启标志位
long int S12_KeyTime=0;//按键12按下的时间
long int S13_KeyTime=0;//按键13按下的时间
float wen_du;//温度
int WenDu_XianShi;//显示的温度
int ju_li;//距离
int WenDu_CanShu1=30;//温度参数,确定值
int JuLi_CanShu1=35;//距离参数,确定值
uchar zhi_ling[8];//接收到的指令
uchar i=0;//指令字符串的下标
uchar code ShuJu_ZhiLing[]="ST\r\n";//数据指令
uchar code CanShu_ZhiLing[]="PARA\r\n";//参数指令
uchar ZhiLing_TF=1;//指令的对错判断结果
uchar CSB_CaiJi_flag=100;//超声波采集虚拟中断标志位
uchar ChuanKou_time=0;//串口接收到错误指令的等待时间
void main(){
uchar j;
char FanHui_date[15];//向串口返回的数据
uchar key_num_old;//上一个键值
Init_BZ();
SMG_Init();
ChuanKou_Init();
DSQ_2_Init();
JZKey_Init();
while(1){
//采集温度
wen_du=DS18B20_GetWenDu();
WenDu_XianShi=wen_du*100;
//采集键值
key_num_old=key_num;
key_num=JZKey_GetKeynum();
if(key_num!=key_num_old||S13_AnTime_flag!=0||S12_AnTime_flag!=0){
if(S13_AnTime_flag==1){//S13按键为短按
jie_mian++;
jie_mian=jie_mian%2;
xian_shi=0;
can_shu=0;
S13_AnTime_flag=0;
if(jie_mian==0){
if(WenDu_CanShu!=WenDu_CanShu1||JuLi_CanShu!=JuLi_CanShu1){//如果参数发生变化
ci_shu++;//参数变动次数加l
IIC_EEPROM_XieDate(10,ci_shu&0x00ff);
Delay10ms();
IIC_EEPROM_XieDate(11,ci_shu>>8);
}
WenDu_CanShu1=WenDu_CanShu;
JuLi_CanShu1=JuLi_CanShu;
}
}
else if(S13_AnTime_flag==2){//S13按键为长按
DAC_KaiQi_flag++;//任何界面状态下,长按S13按键,可切换 DAC输出功能
DAC_KaiQi_flag=DAC_KaiQi_flag%2;
S13_AnTime_flag=0;
}
else if(S12_AnTime_flag==1){//S12按键为短按
if(jie_mian){//参数界面
can_shu++;
can_shu=can_shu%2;
}
else{//数据界面
xian_shi++;
xian_shi=xian_shi%3;
}
S12_AnTime_flag=0;
}
else if(S12_AnTime_flag==2){//S12为长按
ci_shu=0;//任何界面状态下,长按S12按键,可重置参数变动次数记录为0次。
S12_AnTime_flag=0;
IIC_EEPROM_XieDate(10,0);
Delay10ms();
IIC_EEPROM_XieDate(11,0);
}
else if(key_num==16){//按下S16
if(jie_mian==1&&can_shu==0){//在温度参数界面下,按下S16,温度参数减少2℃.
WenDu_CanShu=WenDu_CanShu-2;
if(WenDu_CanShu<0){
WenDu_CanShu=WenDu_CanShu+100;
}
}
else if(jie_mian==1&&can_shu==1){//在距离参数界面下,按下S16,距离参数减少5cm
JuLi_CanShu=JuLi_CanShu-5;
if(JuLi_CanShu<0){
JuLi_CanShu=JuLi_CanShu+100;
}
}
}
else if(key_num==17){//按下S17
if(jie_mian==1&&can_shu==0){//在温度参数界面下,按下S17,温度参数增加2℃。
WenDu_CanShu=WenDu_CanShu+2;
WenDu_CanShu=WenDu_CanShu%100;
}
else if(jie_mian==1&&can_shu==1){//在距离参数界面下,接下S17,距离参数增加5cm。
JuLi_CanShu=JuLi_CanShu+5;
JuLi_CanShu=JuLi_CanShu%100;
}
}
}
//采集距离
if(CSB_CaiJi_flag>=100){
ju_li=CSB_GetJuLi();
if(DAC_KaiQi_flag){//DAC输出功能启动状态
if(ju_li<=JuLi_CanShu1){
IIC_DAC_XieDate(102);
}
else{
IIC_DAC_XieDate(204);
}
}
else{//DAC输出功能关闭状态
IIC_DAC_XieDate(0.4*51.0);
}
CSB_CaiJi_flag=0;
}
//判断错误的指令
if(ChuanKou_time>=100){
ChuanKou_time=0;
i=0;
memset(zhi_ling,' ',sizeof(zhi_ling));
ChuanKou_FS_NeiRong("ERROR\r\n");
}
//指令对比,返回数据
if(i==6){//判断是否接收到"STrn"或者"PARAr"
Delay10ms();
if(i==6){
ZhiLing_TF=1;
for(j=0;j

