找回密码
 立即注册
查看: 829|回复: 4

每日学习STC8A8K64D单片机学习之 NTC温度检测 串口485 数码管 模拟量 EEPROM综合程

[复制链接]

该用户从未签到

42

主题

7

回帖

246

积分

中级会员

积分
246
发表于 2023-6-8 20:17:57 | 显示全部楼层 |阅读模式
【声明】此程序仅用于学习与参考!     
*********************************************************************/
/*************  本程序功能说明  **************

读ADC测温度.

用STC的MCU的IO方式驱动8位数码管。

使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下,用户修改MCU主时钟频率时,自动定时于1ms.

右边4位数码管显示温度值, 分辨率0.1度.

NTC使用1%精度的MF52 10K@25度.

测温度时, 使用12位的ADC值, 使用对分查找表格来计算, 小数点后一位数是用线性插补来计算的.

下载时, 选择时钟 11.0592MHZ (用户可自行修改频率).


SF003L22NTC温控器增加RS485通讯功能程序

1、通讯波特率9600,N,8,1;
2、使用仿modbus通讯协议,总结提供协议解析说明;
3、通讯功能如下:
3.1、终端地址查询、AA 00 00 00 00 BB 设置功能; AA 00 01 00 00 BB
3.2、报警温度值查询、AA 00 02 00 00 BB 设定功能;AA 00 03 00 00 BB
3.3、实时温度查询功能;AA 00 04 00 00 BB
3.4、继电器输出报警状态查询功能;AA 00 05 00 00 BB 报警时主动上传报警状态功能;AA 00 05 00 00 BB
3.5、报警测试(同ESC)继电器和报警输出闭合控制功能;AA 00 06 00 00 BB
3.6、报警后实现解除报警继电器和报警输出断开控制功能;AA 00 07 00 00 BB
3.7、报警后实现静音功能;AA 00 08 00 00 BB

******************************************/

#include    "STC8A8K64D4.h"       //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
#include    "intrins.h"
#include    "eeprom.h"
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型

#define MAIN_Fosc   11059200L   //定义主时钟(精确计算115200波特率)
#define Baudrate3   9600L
#define UART3_BUF_LENGTH    10




#define S3RI 0x01
#define S3TI 0x02

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

/**传感器定义**/
//sbit P03 = P0^3; //AI4-P0.3 NTC 温度传感器
//sbit P04 = P0^4; //AI3-P0.4 NTC 温度传感器
//sbit P05 = P0^5; //AI2-P0.5 NTC 温度传感器
//sbit P06 = P0^6; //AI1-P0.6 NTC 温度传感器
/**按件输入定义**/
sbit SW1 = P6^5; //报警测试SW1-P6.5
sbit SW2 = P6^6; //设置SW2-P6.6
sbit SW3 = P6^7; //左移SW3-P6.7
sbit SW4 = P3^2; //右移SW4-P3.2
sbit SW5 = P6^4; //加SW5-P6.4
sbit SW6 = P4^0; //减SW6-P4.0
sbit SW7 = P5^5; //确定SW7-P5.5
sbit SW8 = P3^3; //脱机SW8-P3.3
sbit SW9 = P3^4; //静音SW9-P3.4
sbit SW10 = P3^5; //报警/复位SW10-P3.5
/**输出接口定义**/
sbit OUT1 = P7^4; //急停OUT1-P7.4
sbit OUT2 = P7^5; //急停OUT2-P7.5
sbit OUT3 = P7^6; //急停OUT3-P7.6
sbit OUT4 = P7^7; //急停OUT4-P7.7
sbit OUT5 = P4^1; //报警灯BELL-HL-P4.1
sbit OUT6 = P4^2; //报警声光BELL –P4.2

sbit RS485_DIR=P0^2;
/**数码管接口**/
//数码管段显示口 P1 和 P2
//sbit P53 = P5^3;  //AI1千位显示
//sbit P52 = P5^2;  //AI1百位显示
//sbit P07 = P0^7;  //AI1十位显示
//sbit P43 = P4^3;  //AI1个位显示

//sbit P63 = P6^3;  //AI2千位显示
//sbit P62 = P6^2;  //AI2百位显示
//sbit P61 = P6^1;  //AI2十位显示
//sbit P60 = P6^0;  //AI2个位显示

//sbit P73 = P7^3;  //AI3千位显示
//sbit P72 = P7^2;  //AI3百位显示
//sbit P71 = P7^1;  //AI3十位显示
//sbit P70 = P7^0;  //AI3个位显示

//sbit P37 = P3^7;  //AI4千位显示
//sbit P36 = P3^6;  //AI4百位显示
//sbit P51 = P5^1;  //AI4十位显示
//sbit P50 = P5^0;  //AI4个位显示

//RS485通讯:电路预留(通讯程序暂不编写,后期升级用)
/****************************** 用户定义宏 ***********************************/

#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
#define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒

/*****************************************************************************/


#define DIS_DOT     0x20
#define DIS_BLACK   0x10
#define DIS_        0x11


u8  TX3_Cnt;    //发送计数
u8  RX3_Cnt;    //接收计数
bit B_TX3_Busy; //发送忙标志
u8  idata RX3_Buffer[UART3_BUF_LENGTH]; //接收缓冲
/*************  本地常量声明    **************/
////u8 code t_display[]={                       //标准字库
////   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
//0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
////black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
//0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
//0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

////u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
uchar code seg7code[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0xFF,0xc0,0xBF,0x86,0x8e}; //11什么也不显示 10显示负号

/*************  本地变量声明   **************/

//u8  LED8[8];        //显示缓冲
u8  display_index;  //显示位索引
bit B_1ms;          //2ms标志
bit BJ_1ms;          //2ms标志
bit SZ_1ms;          //2ms标志
u16 msecond;//AD检测时间
u16 times;//长按测试SW1按键3秒后时间
u16 SZtimes;//SW2设置时间
uchar weix=0;//数码管控制位
uchar st=0;//数码管扫描
uchar st1=0;//数码管扫描
uchar A1=11,B1=11,C1=11,D1=11;//AI1数码管显示
uchar A2=11,B2=11,C2=11,D2=11;//AI2数码管显示
uchar A3=11,B3=11,C3=11,D3=11;//AI3数码管显示
uchar A4=11,B4=11,C4=11,D4=11;//AI4数码管显示
uint AI1=0;//NTC 温度传感器1 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;
uint AI2=0;//NTC 温度传感器2 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;
uint AI3=0;//NTC 温度传感器3 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;
uint AI4=0;//NTC 温度传感器4 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;

uint AI11=0;//NTC 温度传感器1 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;
uint AI12=0;//NTC 温度传感器2 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;
uint AI13=0;//NTC 温度传感器3 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;
uint AI14=0;//NTC 温度传感器4 AI1-P0.6,AI2-P0.5,AI3-P0.4,AI4-P0.3;

bit bz1=0;//输入标志1
bit bz2=0;//输入标志2
bit bz3=0;//输入标志3
bit bz4=0;//输入标志4
bit bz5=0;//输入标志5
bit bz6=0;//输入标志6
bit bz7=0;//输入标志7
bit bz8=0;//输入标志8
bit bz9=0;//输入标志9
bit bz10=0;//输入标志10
bit bjbz=0;//报警标志位
bit jybz=0;//静音功能:达到设置温度报警输出后,按下静音SW9点动信号,报警声光BELL断开停止声光报警;
bit bjcsbz=0;//报警测试:长按测试SW1按键3秒后,六路同时吸合输出
uchar bjcssj=0;//报警测试时间:长按测试SW1按键3秒后,六路同时吸合输出
uint dateA,dateB,dateC,dateD,dateX;//四个温度报警值阀值设置
bit ENbz=0;//报警使能控制位
bit szbz=0;//参数设置标志
bit shan1=0;
bit shan2=0;
bit shan3=0;
bit shan4=0;
bit shan5=0;
bit shan6=0;
bit shan7=0;
bit shan8=0;
bit shan9=0;
bit shan10=0;
bit shan11=0;
bit shan12=0;
bit shan13=0;
bit shan14=0;
bit shan15=0;
bit shan16=0;
bit shanbz=0;
uchar shanshuo=0;//闪烁变量
bit cs_shanshuo=0;//测试闪烁标志
uint SStime=0;
uchar TD1xsd=0XFF,TD2xsd=0XFF,TD3xsd=0XFF,TD4xsd=0XFF;//小数点标志
uchar E1=10,E2=10,E3=10,E4=10,E5=10,E6=10,E7=10,E8=10,E9=10,E10=10,E11=10,E12=10,E13=10,E14=10,E15=10,E16=10;
bit write=0;
uchar add=0;
bit addbz=0;//写入标志
bit szbz1=0;//设置标志
bit KEY_EN=0;
bit yc_shanshuobz=0;//溢出闪烁标志
uint yc_sec=0;
bit bjss1=0;//报警闪烁
bit bjss2=0;//报警闪烁
bit bjss3=0;//报警闪烁
bit bjss4=0;//报警闪烁

bit yc_bjss1=0;//报警闪烁
bit yc_bjss2=0;//报警闪烁
bit yc_bjss3=0;//报警闪烁
bit yc_bjss4=0;//报警闪烁
uchar tongD=0;//通道变量
bit flag_zx=0;
bit fabz3=0;//地址查询标志
bit wdcxbz=0;//温度查询标志
bit wdszbz=0;//温度设置标志
bit sswdbz=0;//实时温度标志
bit bjztbz=0;//报警状态查询功能
bit bjztbz1=0;//报警状态查询功能 主动标志
bit bjcs=0;//报警测试(同ESC)继电器和报警输出闭合控制功能
//  MF52E 10K at 25, B = 3950, ADC = 12 bits
u16 code temp_table[]={
140,    //;-40  0
149,    //;-39  1
159,    //;-38  2
168,    //;-37  3
178,    //;-36  4
188,    //;-35  5
199,    //;-34  6
210,    //;-33  7
222,    //;-32  8
233,    //;-31  9
246,    //;-30  10
259,    //;-29  11
272,    //;-28  12
286,    //;-27  13
301,    //;-26  14
317,    //;-25  15
333,    //;-24  16
349,    //;-23  17
367,    //;-22  18
385,    //;-21  19
403,    //;-20  20
423,    //;-19  21
443,    //;-18  22
464,    //;-17  23
486,    //;-16  24
509,    //;-15  25
533,    //;-14  26
558,    //;-13  27
583,    //;-12  28
610,    //;-11  29
638,    //;-10  30
667,    //;-9   31
696,    //;-8   32
727,    //;-7   33
758,    //;-6   34
791,    //;-5   35
824,    //;-4   36
858,    //;-3   37
893,    //;-2   38
929,    //;-1   39
965,    //;0    40
1003,   //;1    41
1041,   //;2    42
1080,   //;3    43
1119,   //;4    44
1160,   //;5    45
1201,   //;6    46
1243,   //;7    47
1285,   //;8    48
1328,   //;9    49
1371,   //;10   50
1414,   //;11   51
1459,   //;12   52
1503,   //;13   53
1548,   //;14   54
1593,   //;15   55
1638,   //;16   56
1684,   //;17   57
1730,   //;18   58
1775,   //;19   59
1821,   //;20   60
1867,   //;21   61
1912,   //;22   62
1958,   //;23   63
2003,   //;24   64
2048,   //;25   65
2093,   //;26   66
2137,   //;27   67
2182,   //;28   68
2225,   //;29   69
2269,   //;30   70
2312,   //;31   71
2354,   //;32   72
2397,   //;33   73
2438,   //;34   74
2479,   //;35   75
2519,   //;36   76
2559,   //;37   77
2598,   //;38   78
2637,   //;39   79
2675,   //;40   80
2712,   //;41   81
2748,   //;42   82
2784,   //;43   83
2819,   //;44   84
2853,   //;45   85
2887,   //;46   86
2920,   //;47   87
2952,   //;48   88
2984,   //;49   89
3014,   //;50   90
3044,   //;51   91
3073,   //;52   92
3102,   //;53   93
3130,   //;54   94
3157,   //;55   95
3183,   //;56   96
3209,   //;57   97
3234,   //;58   98
3259,   //;59   99
3283,   //;60   100
3306,   //;61   101
3328,   //;62   102
3351,   //;63   103
3372,   //;64   104
3393,   //;65   105
3413,   //;66   106
3432,   //;67   107
3452,   //;68   108
3470,   //;69   109
3488,   //;70   110
3506,   //;71   111
3523,   //;72   112
3539,   //;73   113
3555,   //;74   114
3571,   //;75   115
3586,   //;76   116
3601,   //;77   117
3615,   //;78   118
3628,   //;79   119
3642,   //;80   120
3655,   //;81   121
3667,   //;82   122
3679,   //;83   123
3691,   //;84   124
3702,   //;85   125
3714,   //;86   126
3724,   //;87   127
3735,   //;88   128
3745,   //;89   129
3754,   //;90   130
3764,   //;91   131
3773,   //;92   132
3782,   //;93   133
3791,   //;94   134
3799,   //;95   135
3807,   //;96   136
3815,   //;97   137
3822,   //;98   138
3830,   //;99   139
3837,   //;100  140
3844,   //;101  141
3850,   //;102  142
3857,   //;103  143
3863,   //;104  144
3869,   //;105  145
3875,   //;106  146
3881,   //;107  147
3887,   //;108  148
3892,   //;109  149
3897,   //;110  150
3902,   //;111  151
3907,   //;112  152
3912,   //;113  153
3917,   //;114  154
3921,   //;115  155
3926,   //;116  156
3930,   //;117  157
3934,   //;118  158
3938,   //;119  159
3942    //;120  160
};
/*************  本地函数声明    **************/
u16 get_temperature(u16 adc);//AD值温度变换
u16 Get_ADC12bitResult(u8 channel); //channel = 0~15//AD采集

void clean1(void);//数码管12消隐
void clean2(void);//数码管34消隐
void DisplayScan(void);//数码管显示
void key(void);//按键函数
void xiaoyin();//闪烁消隐
void IapIdle();
char IapRead(int addr);
void IapProgram(int addr, char dat);
void IapErase(int addr);
//void    EEPROM_SectorErase(u16 EE_address);
//void    EEPROM_read_n(u16 EE_address,u8 *DataAddress,u8 length);
//u8      EEPROM_write_n(u16 EE_address,u8 *DataAddress,u8 length);
void    UART3_config(u8 brt);   // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
void    PrintString3(u8 *puts);
void    CLR_Buf3(void);
void bao_jing_wen_du_cha_xun();//报警温度值查询
void di_zhi_cha_xun();//终端地址查询
void shi_shi_wen_du_cha_xun();//实时温度查询功能
void bao_jing_cha_xun();//继电器输出报警状态查询功能

/********************************************************************
                            延时函数
*********************************************************************/
void delay(uint tt)
{
  uint ii,jj;
   for(ii=0;ii<tt;ii++)
   {
            for(jj=300;jj>0;jj--);
         { ;
         }
   }
}
///********************** 按键函数 ************************/
void key(void)//按键函数
{
if((SW2==0)&&(bz2==0)){delay(10);if(SW2==0){if(szbz1==0){szbz=1;szbz1=1;SZtimes=0;}else{weix=0;KEY_EN=0;szbz1=0;}bz2=1;}}
if((SW2==1)&&(bz2==1)){delay(10);if(SW2==1){szbz=0;bz2=0;}}
if(SZ_1ms==1)
{
SZ_1ms = 0;
if(++SZtimes>= 1500)    //3000ms到
{
KEY_EN=1;
weix=1;       
szbz=0;       
shanshuo=1;
SZtimes=0;       
shanbz=1;//闪烁标志
E1 = IapReadByte(0x00);
E2 = IapReadByte(0x01);
E3 = IapReadByte(0x02);
E4 = IapReadByte(0x03);
//E5 = IapReadByte(0x04);
//E6 = IapReadByte(0x05);
//E7 = IapReadByte(0x06);
//E8 = IapReadByte(0x07);
//E9 = IapReadByte(0x08);
//E10 = IapReadByte(0x09);
//E11 = IapReadByte(0x0A);
//E12 = IapReadByte(0x0B);
//E13 = IapReadByte(0x0C);
//E14 = IapReadByte(0x0D);
//E15 = IapReadByte(0x0E);
//E16 = IapReadByte(0x0F);
}       
}
if(KEY_EN==1)
{
//        //长按设置SW2按键进入设置,再次单击设置SW2不保存并退出设置
if((SW3==0)&&(bz3==0)){delay(10);if(SW3==0){if(shanbz==1){shanshuo--;if(shanshuo<1){shanshuo=4;}}bz3=1;}}if((SW3==1)&&(bz3==1)){delay(10);if(SW3==1){bz3=0;}}//左移SW3
if((SW4==0)&&(bz4==0)){delay(10);if(SW4==0){if(shanbz==1){shanshuo++;if(shanshuo>4){shanshuo=1;}}bz4=1;}}if((SW4==1)&&(bz4==1)){delay(10);if(SW4==1){bz4=0;}}//右移SW4
if((SW5==0)&&(bz5==0)){delay(10);if(SW5==0)
{
if(shanshuo==1){E1++;if(E1>9){E1=0;}}       
if(shanshuo==2){E2++;if(E2>9){E2=0;}}
if(shanshuo==3){E3++;if(E3>9){E3=0;}}
if(shanshuo==4){E4++;if(E4>9){E4=0;}}

//if(shanshuo==5){E5++;if(E5>9){E5=0;}}
//if(shanshuo==6){E6++;if(E6>9){E6=0;}}
//if(shanshuo==7){E7++;if(E7>9){E7=0;}}
//if(shanshuo==8){E8++;if(E8>9){E8=0;}}

//if(shanshuo==9){E9++;if(E9>9){E9=0;}}
//if(shanshuo==10){E10++;if(E10>9){E10=0;}}
//if(shanshuo==11){E11++;if(E11>9){E11=0;}}
//if(shanshuo==12){E12++;if(E12>9){E12=0;}}

//if(shanshuo==13){E13++;if(E13>9){E13=0;}}
//if(shanshuo==14){E14++;if(E14>9){E14=0;}}
//if(shanshuo==15){E15++;if(E15>9){E15=0;}}
//if(shanshuo==16){E16++;if(E16>9){E16=0;}}
bz5=1;
}}if((SW5==1)&&(bz5==1)){delay(10);if(SW5==1){bz5=0;}}//加SW5
if((SW6==0)&&(bz6==0)){delay(10);if(SW6==0)
{
if(shanshuo==1){if(E1==0){E1=9;}else E1--;}       
if(shanshuo==2){if(E2==0){E2=9;}else E2--;}
if(shanshuo==3){if(E3==0){E3=9;}else E3--;}
if(shanshuo==4){if(E4==0){E4=9;}else E4--;}

//if(shanshuo==5){if(E5==0){E5=9;}else E5--;}
//if(shanshuo==6){if(E6==0){E6=9;}else E6--;}
//if(shanshuo==7){if(E7==0){E7=9;}else E7--;}
//if(shanshuo==8){if(E8==0){E8=9;}else E8--;}

//if(shanshuo==9){if(E9==0){E9=9;}else E9--;}
//if(shanshuo==10){if(E10==0){E10=9;}else E10--;}
//if(shanshuo==11){if(E11==0){E11=9;}else E11--;}
//if(shanshuo==12){if(E12==0){E12=9;}else E12--;}

//if(shanshuo==13){if(E13==0){E13=9;}else E13--;}
//if(shanshuo==14){if(E14==0){E14=9;}else E14--;}
//if(shanshuo==15){if(E15==0){E15=9;}else E15--;}
//if(shanshuo==16){if(E16==0){E16=9;}else E16--;}       
bz6=1;
}}if((SW6==1)&&(bz6==1)){delay(10);if(SW6==1){bz6=0;}}//减SW6
}
if((SW7==0)&&(bz7==0)){delay(10);if(SW7==0){write=1;weix=0;KEY_EN=0;szbz1=0;bz7=1;}}
if((SW7==1)&&(bz7==1)){delay(10);if(SW7==1){bz7=0;}}//SW7按键保存并退出

//       
if((SW1==0)&&(bz1==0)){delay(10);if(SW1==0){bjcsbz=1;bz1=1;}}
if((SW1==1)&&(bz1==1)){delay(10);if(SW1==1){bjcsbz=0;times=0;bz1=0;}}
//报警测试:长按测试SW1按键3秒后,六路同时吸合输出

if(BJ_1ms==1)
{
BJ_1ms = 0;
if((++times>= 1500)||(bjcs==1))    //3000ms到
{
bjcs=0;
cs_shanshuo=1;
bjcsbz=0;       
times = 0;
OUT1 = 0; //急停OUT1-P7.4
OUT2 = 0; //急停OUT2-P7.5
OUT3 = 0; //急停OUT3-P7.6
OUT4 = 0; //急停OUT4-P7.7
OUT5 = 0; //报警灯BELL-HL-P4.1
OUT6 = 0; //报警声光BELL –P4.2       
}       
}
if((SW10==0)&&(bz10==0)){
delay(10);
if(SW10==0)
{
bjbz=0;jybz=0;OUT1=1;OUT2=1;OUT3=1;OUT4=1;OUT5=1;OUT6=1;cs_shanshuo=0;yc_shanshuobz=0;
bjss1=0;yc_bjss1=0;
bjss2=0;yc_bjss2=0;
bjss3=0;yc_bjss3=0;
bjss4=0;yc_bjss4=0;       
bz10=1;
bjztbz1=0;//报警时主动上传报警状态功能       
}}
if((SW10==1)&&(bz10==1)){delay(10);if(SW10==1){bz10=0;}}
//复位功能:达到设置温度报警输出后,按下报警/复位SW10点动信号,六路同时断开输出;       
if((SW9==0)&&(bz9==0)){delay(10);if(SW9==0){jybz=1;OUT6 = 1;bz9=1;}}if((SW9==1)&&(bz9==1)){delay(10);if(SW9==1){bz9=0;}}       
//静音功能:达到设置温度报警输出后,按下静音SW9点动信号,报警声光BELL断开停止声光报警;
       
if(bjbz==1)//报警输出
{
//cs_shanshuo=1;
if(SW8!=0)//脱机功能:脱机SW8为自锁信号,当SW8无信号正常执行报警输出;当SW8有自锁信号时,达到设置温度时急停OUT1至OUT4无动作
{       
OUT1 = 0; //急停OUT1-P7.4
OUT2 = 0; //急停OUT2-P7.5
OUT3 = 0; //急停OUT3-P7.6
OUT4 = 0; //急停OUT4-P7.7
}else{OUT1 = 1;OUT2 = 1;OUT3 = 1;OUT4 = 1;}
OUT5 = 0; //报警灯BELL-HL-P4.1

if(bjztbz1==0){dateX=0xFF;bjztbz1=1;bjztbz=1;}//报警时主动上传报警状态功能;AA 00 05 00 00 BB

if(jybz==0)//静音功能:达到设置温度报警输出后,按下静音SW9点动信号,报警声光BELL断开停止声光报警;
{
OUT6 = 0; //报警声光BELL –P4.2
}
}

}

//void xiaoyin()//闪烁消隐
//{
//shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;
//}

/****************终端地址查询发送函数*********************/   
void di_zhi_cha_xun()//终端地址查询、AA 00 00 00 00 BB
{          
RS485_DIR=1;//发送控制开
S3BUF=0XAA;B_TX3_Busy = 1;while(B_TX3_Busy);//报头
S3BUF=add; B_TX3_Busy = 1;while(B_TX3_Busy);//地址
S3BUF=0X00;B_TX3_Busy = 1;while(B_TX3_Busy);//功能位
S3BUF=0X00;B_TX3_Busy = 1;while(B_TX3_Busy);//通道位
S3BUF=0X00;B_TX3_Busy = 1;while(B_TX3_Busy);//温度值
S3BUF=0XBB;B_TX3_Busy = 1;while(B_TX3_Busy);//报尾
RS485_DIR=0;//发送控制关       
}
/****************报警温度值查询发送函数*********************/
void bao_jing_wen_du_cha_xun()//报警温度值查询、AA 00 02 00 00 BB
{          
RS485_DIR=1;//发送控制开
S3BUF=0XAA;B_TX3_Busy = 1;while(B_TX3_Busy);//报头
S3BUF=add; B_TX3_Busy = 1;while(B_TX3_Busy);//地址
S3BUF=0X02;B_TX3_Busy = 1;while(B_TX3_Busy);//功能位
S3BUF=tongD;B_TX3_Busy = 1;while(B_TX3_Busy);//通道位
S3BUF=dateX;B_TX3_Busy = 1;while(B_TX3_Busy);//温度值
S3BUF=0XBB;B_TX3_Busy = 1;while(B_TX3_Busy);//报尾
RS485_DIR=0;//发送控制关       
}
/****************实时温度查询功能发送函数*********************/
void shi_shi_wen_du_cha_xun()//实时温度查询功能、AA 00 04 00 00 BB
{
RS485_DIR=1;//发送控制开
S3BUF=0XAA;B_TX3_Busy = 1;while(B_TX3_Busy);//报头
S3BUF=add; B_TX3_Busy = 1;while(B_TX3_Busy);//地址
S3BUF=0X04;B_TX3_Busy = 1;while(B_TX3_Busy);//功能位
S3BUF=tongD;B_TX3_Busy = 1;while(B_TX3_Busy);//通道位
S3BUF=dateX;B_TX3_Busy = 1;while(B_TX3_Busy);//温度值
S3BUF=0XBB;B_TX3_Busy = 1;while(B_TX3_Busy);//报尾
RS485_DIR=0;//发送控制关               
}
/****************继电器输出报警状态查询功能发送函数*********************/
void bao_jing_cha_xun()//继电器输出报警状态查询功能、AA 00 05 00 00 BB
{          
RS485_DIR=1;//发送控制开
S3BUF=0XAA;B_TX3_Busy = 1;while(B_TX3_Busy);//报头
S3BUF=add; B_TX3_Busy = 1;while(B_TX3_Busy);//地址
S3BUF=0X05;B_TX3_Busy = 1;while(B_TX3_Busy);//功能位
S3BUF=0x00;B_TX3_Busy = 1;while(B_TX3_Busy);//通道位
S3BUF=dateX;B_TX3_Busy = 1;while(B_TX3_Busy);//温度值
S3BUF=0XBB;B_TX3_Busy = 1;while(B_TX3_Busy);//报尾
RS485_DIR=0;//发送控制关               
}


/**********************************************/
void main(void)
{

P0M1 = 0x78;   P0M0 = 0x00;   //设置为准双向口          //        P03-P06 设置为AD输入
P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口

display_index = 0;
P_SW2 |= 0x80;
ADCTIM = 0x3f;                //设置 ADC 内部时序,ADC采样时间建议设最大值
P_SW2 &= 0x7f;
ADCCFG = 0x2f;                //设置 ADC 时钟为系统时钟/2/16/16
ADC_CONTR = 0x80; //使能 ADC 模块

AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
TH0 = (u8)(Timer0_Reload / 256);
TL0 = (u8)(Timer0_Reload % 256);
ET0 = 1;    //Timer0 interrupt enable
TR0 = 1;    //Tiner0 run

UART3_config(0);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
EA = 1; //允许全局中断


E1 = IapReadByte(0x00);
if(E1>12){E1=0;}
E2 = IapReadByte(0x01);
if(E2>9){E2=1;}
E3 = IapReadByte(0x02);
if(E3>9){E3=2;}
E4 = IapReadByte(0x03);
if(E4>9){E4=0;}
//E5 = IapReadByte(0x04);
//if(E5>12){E5=0;}
//E6 = IapReadByte(0x05);
//if(E6>9){E6=1;}
//E7 = IapReadByte(0x06);
//if(E7>9){E7=2;}
//E8 = IapReadByte(0x07);
//if(E8>9){E8=0;}
//E9 = IapReadByte(0x08);
//if(E9>12){E9=0;}
//E10 = IapReadByte(0x09);
//if(E10>9){E10=1;}
//E11 = IapReadByte(0x0A);
//if(E11>9){E11=2;}
//E12 = IapReadByte(0x0B);
//if(E12>9){E12=0;}
//E13 = IapReadByte(0x0C);
//if(E13>12){E13=0;}
//E14 = IapReadByte(0x0D);
//if(E14>9){E14=1;}
//E15 = IapReadByte(0x0E);
//if(E15>9){E15=2;}
//E16 = IapReadByte(0x0F);
//if(E16>9){E16=0;}
add = IapReadByte(0x10);
if(add >250){add = 0x01;}
//dateA=310;
//dateB=310;
//dateC=310;
//dateD=310;
dateA=E2*100+E3*10+E4;
//dateB=E6*100+E7*10+E8;
//dateC=E10*100+E11*10+E12;
//dateD=E14*100+E15*10+E16;
//write=1;
di_zhi_cha_xun();
//PrintString3("UART3 Test");  //UART3发送一个字符串       

while(1)
{
if(fabz3==1){fabz3=0;di_zhi_cha_xun();}//地址查询标志
if(wdcxbz==1){wdcxbz=0;bao_jing_wen_du_cha_xun();}//温度查询标志
if(wdszbz==1){wdszbz=0;bao_jing_wen_du_cha_xun();}//温度设置标志
if(sswdbz==1){sswdbz=0;shi_shi_wen_du_cha_xun();}//实时温度标志
if(bjztbz==1){bjztbz=0;bao_jing_cha_xun();}//继电器输出报警状态查询功能

//if(add==1)
//{       
key();//按键函数
//}       
if(B_1ms)   //1ms到
{
B_1ms = 0;
if(++msecond >= 300)    //300ms到
{
msecond = 0;
if(cs_shanshuo==0)
{
AI1 = Get_ADC12bitResult(14);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
//AI2 = Get_ADC12bitResult(13);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
//AI3 = Get_ADC12bitResult(12);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
//AI4 = Get_ADC12bitResult(11);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
//if(AI1>=3942){AI1 =3942;}
//if(AI2>=3942){AI2 =3942;}
//if(AI3>=3942){AI3 =3942;}
//if(AI4>=3942){AI4 =3942;}

if(bjss1==0)
{
if(AI1 > 4000){A1 = 10;A2 = 10;A3 = 10;A4 = 10;}       
if(AI1 < 4000)
{
AI1 = get_temperature(AI1); //计算温度值
//AI11 = AI1; //计算温度值
if(AI1 >= 400){A1 =  11;AI1 = AI1 -400;}       //温度 >= 0度
else{A1 =  10; AI1  = 400 - AI1;}   //温度 <  0度
AI1 =AI1/10;
AI11=AI1;
if(AI1>=120){AI1=120;}
A2 =  AI1 / 100;     //显示温度值
A3 = (AI1 % 100)/10;
A4 = AI1 % 10 ;       
if(A2==0){A2=11;}
if((A2==0)&&(A3==0)){A3=11;}
}}
//if(bjss2==0)
//{
//if(AI2 > 4000){B1 = 10;B2 = 10;B3 = 10;B4 = 10;}       
//if(AI2 < 4000)
//{
//AI2 = get_temperature(AI2); //计算温度值
//if(AI2 >= 400){B1 =  11;AI2 = AI2 -400;}       //温度 >= 0度
//else{B1 =  10; AI2  = 400 - AI2;}   //温度 <  0度
//AI2 =AI2/10;
//AI12=AI2;
//if(AI2>=120){AI2=120;}
//B2 =  AI2 / 100;     //显示温度值
//B3 = (AI2 % 100) / 10;
//B4 = AI2 % 10 ;
//if(B2==0){B2=11;}
//if((B2==0)&&(B3==0)){B3=11;}
//}}
//if(bjss3==0)
//{
//if(AI3 > 4000){C1 = 10;C2 = 10;C3 = 10;C4 = 10;}       
//if((AI3 < 4000)&&(AI3 >= 300))
//{
//AI3 = get_temperature(AI3); //计算温度值
//if(AI3 >= 400){C1 =  11;AI3 = AI3 -400;}       //温度 >= 0度
//else{C1 =  10; AI3  = 400 - AI3;}   //温度 <  0度
//AI3 =AI3/10;
//AI13=AI3;
//if(AI3>=120){AI3=120;}
//C2 =  AI3 / 100;     //显示温度值
//C3 = (AI3 % 100) / 10;
//C4 = AI3 % 10 ;
//if(C2==0){C2=11;}
//if((C2==0)&&(C3==0)){C3=11;}
//}}
//if(bjss4==0)
//{
//if(AI4 > 4000){D1 = 10;D2 = 10;D3 = 10;D4 = 10;}
//if((AI4 < 4000)&&(AI4 > 300))
//{
//AI4 = get_temperature(AI4); //计算温度值
//if(AI4 >= 400){D1 =  11;AI4 = AI4 -400;}       //温度 >= 0度
//else{D1 =  10; AI4  = 400 - AI4;}   //温度 <  0度
//AI4 =AI4/10;
//AI14=AI4;
//if(AI4>=120){AI4=120;}
//D2 =  AI4 / 100;     //显示温度值
//D3 = (AI4 % 100) / 10;
//D4 = AI4 % 10 ;
//if(D2==0){D2=11;}
//if((D2==0)&&(D3==0)){D3=11;}
//}        }

}
else
{
A1 = E1;     //测试显示温度值
A2 = E2;
A3 = E3;
A4 = E4;
//B1 = E5;     //测试显示温度值
//B2 = E6;
//B3 = E7;
//B4 = E8;
//C1 = E9;     //测试显示温度值
//C2 = E10;
//C3 = E11;
//C4 = E12;
//D1 = E13;     //测试显示温度值
//D2 = E14;
//D3 = E15;
//D4 = E16;
}
if(AI11>=dateA)//判断是否有超过报警值数据
{
delay(10);if(AI11>=dateA){bjss1=1;bjbz=1;A1 = E1;A2 = E2;A3 = E3;A4 = E4;}
}
//else{bjss1=0;yc_bjss1=0;}
//if(AI12>=dateB)//判断是否有超过报警值数据
//{
//delay(10);if(AI12>=dateB){bjss2=1;bjbz=1;B1 = E5;B2 = E6;B3 = E7;B4 = E8;}
//}
////else{bjss2=0;yc_bjss2=0;}
//if(AI13>=dateC)//判断是否有超过报警值数据
//{
//delay(10);if(AI13>=dateC){bjss3=1;bjbz=1;C1 = E9;C2 = E10;C3 = E11;C4 = E12;}
//}
////else{bjss3=0;yc_bjss3=0;}
//if(AI14>=dateD)//判断是否有超过报警值数据
//{
//delay(10);if(AI14>=dateD){bjss4=1;bjbz=1;D1 = E13;D2 = E14;D3 = E15;D4 = E16;}
//}
////else{bjss4=0;yc_bjss4=0;}


}
}
if(write==1)
{
write=0;
       
dateA=E2*100+E3*10+E4;
//dateB=E6*100+E7*10+E8;
//dateC=E10*100+E11*10+E12;
//dateD=E14*100+E15*10+E16;
       
IapEraseSector(0X00);       
IapProgramByte(0x00, E1);
IapProgramByte(0x01, E2);
IapProgramByte(0x02, E3);
IapProgramByte(0x03, E4);
//IapProgramByte(0x04, E5);
//IapProgramByte(0x05, E6);
//IapProgramByte(0x06, E7);
//IapProgramByte(0x07, E8);
//IapProgramByte(0x08, E9);
//IapProgramByte(0x09, E10);
//IapProgramByte(0x0A, E11);
//IapProgramByte(0x0B, E12);
//IapProgramByte(0x0C, E13);
//IapProgramByte(0x0D, E14);
//IapProgramByte(0x0E, E15);
//IapProgramByte(0x0F, E16);
       

}
}
}

/**********************************************/

//========================================================================
// 函数: u16 Get_ADC12bitResult(u8 channel)
// 描述: 查询法读一次ADC结果.
// 参数: channel: 选择要转换的ADC.
// 返回: 12位ADC结果.
// 版本: V1.0, 2012-10-22
//========================================================================
u16 Get_ADC12bitResult(u8 channel)  //channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;

ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //启动 AD 转换
_nop_();
_nop_();
_nop_();
_nop_();

while((ADC_CONTR & 0x20) == 0)  ;   //wait for ADC finish
ADC_CONTR &= ~0x20;     //清除ADC结束标志
return  (((u16)ADC_RES << 8) | ADC_RESL);
}




/********************  计算温度 ***********************************************/
// 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
// 为了通用, ADC输入为12bit的ADC值.
// 电路和软件算法设计: Coody
/**********************************************/

#define     D_SCALE     10      //结果放大倍数, 放大10倍就是保留一位小数
u16 get_temperature(u16 adc)
{
u16 code *p;
u16 i;
u8  j,k,min,max;

adc = 4096 - adc;   //Rt接地
p = temp_table;
if(adc < p[0])      return (0xfffe);
if(adc > p[160])    return (0xffff);

min = 0;        //-40度
max = 160;      //120度

for(j=0; j<5; j++)  //对分查表
{
k = min / 2 + max / 2;
if(adc <= p[k]) max = k;
else            min = k;
}
if(adc == p[min])  i = min * D_SCALE;
else if(adc == p[max])  i = max * D_SCALE;
else    // min < temp < max
{
while(min <= max)
{
min++;
if(adc == p[min])   {i = min * D_SCALE; break;}
else if(adc < p[min])
{
    min--;
    i = p[min]; //min
    j = (adc - i) * D_SCALE / (p[min+1] - i);
    i = min;
    i *= D_SCALE;
    i += j;
    break;
}
}
}
return i;
}
/********************** 数码管显示消隐函数 ************************/
void clean1()
{
P53 =1;P52 =1;P07 =1;P43 =1;P63 =1;P62 =1;P61 =1;P60 =1;
}
void clean2()
{
P37 =1;P36 =1;P51 =1;P50 =1;P73 =1;P72 =1;P71 =1;P70 =1;
}
/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{   

if(weix==0)
{
if(yc_shanshuobz==0)//溢出闪烁标志
{
switch(st)
{
case 0: st++;if(yc_bjss1==0){clean1();P1=seg7code[A1];P53 =0;}break;//千位显示
case 1: st++;if(yc_bjss1==0){clean1();P1=seg7code[A2];P52 =0;}break;//百位显示
case 2: st++;if(yc_bjss1==0){clean1();P1=seg7code[A3];P07 =0;}break;//十位显示
case 3: st++;if(yc_bjss1==0){clean1();P1=seg7code[A4];P43 =0;}break;//个位显示       
case 4: st=0;clean1();break;//个位显示       
//case 4: st++;if(yc_bjss2==0){clean1();P1=seg7code[B1];P63 =0;}break;//千位显示
//case 5: st++;if(yc_bjss2==0){clean1();P1=seg7code[B2];P62 =0;}break;//百位显示
//case 6: st++;if(yc_bjss2==0){clean1();P1=seg7code[B3];P61 =0;}break;//十位显示
//case 7: st++;if(yc_bjss2==0){clean1();P1=seg7code[B4];P60 =0;}break;//个位显示       
//case 8: st=0;clean1();break;//个位显示       
default: break;
}

//switch(st1)
//{
//case 0: st1++;if(yc_bjss3==0){clean2();P2=seg7code[C1];P73 =0;}break;//千位显示
//case 1: st1++;if(yc_bjss3==0){clean2();P2=seg7code[C2];P72 =0;}break;//百位显示
//case 2: st1++;if(yc_bjss3==0){clean2();P2=seg7code[C3];P71 =0;}break;//十位显示
//case 3: st1++;if(yc_bjss3==0){clean2();P2=seg7code[C4];P70 =0;}break;//个位显示       
//       
//case 4: st1++;if(yc_bjss4==0){clean2();P2=seg7code[D1];P37 =0;}break;//千位显示
//case 5: st1++;if(yc_bjss4==0){clean2();P2=seg7code[D2];P36 =0;}break;//百位显示
//case 6: st1++;if(yc_bjss4==0){clean2();P2=seg7code[D3];P51 =0;}break;//十位显示
//case 7: st1++;if(yc_bjss4==0){clean2();P2=seg7code[D4];P50 =0;}break;//个位显示       
//case 8: st1=0;clean2();break;//个位显示       
//default: break;
//}
}
else{P1=P2=0xFF;}
}
if(weix==1)
{
switch(st)
{
case 0: st++;if(shan1==0){clean1();P1=seg7code[E1];P53 =0;}break;//千位显示
case 1: st++;if(shan2==0){clean1();P1=seg7code[E2];P52 =0;}break;//百位显示
case 2: st++;if(shan3==0){clean1();P1=seg7code[E3]&TD1xsd;P07 =0;}break;//十位显示
case 3: st++;if(shan4==0){clean1();P1=seg7code[E4];P43 =0;}break;//个位显示       
case 4: st=0;clean1();break;//个位显示       

//case 4: st++;if(shan5==0){clean1();P1=seg7code[E5];P63 =0;}break;//千位显示
//case 5: st++;if(shan6==0){clean1();P1=seg7code[E6];P62 =0;}break;//百位显示
//case 6: st++;if(shan7==0){clean1();P1=seg7code[E7]&TD2xsd;P61 =0;}break;//十位显示
//case 7: st++;if(shan8==0){clean1();P1=seg7code[E8];P60 =0;}break;//个位显示       
//case 8: st=0;clean1();break;//个位显示       
default: break;
}
//switch(st1)
//{
//case 0: st1++;if(shan9==0){clean2();P2=seg7code[E9];P73 =0;}break;//千位显示
//case 1: st1++;if(shan10==0){clean2();P2=seg7code[E10];P72 =0;}break;//百位显示
//case 2: st1++;if(shan11==0){clean2();P2=seg7code[E11]&TD3xsd;P71 =0;}break;//十位显示
//case 3: st1++;if(shan12==0){clean2();P2=seg7code[E12];P70 =0;}break;//个位显示       
//       
//case 4: st1++;if(shan13==0){clean2();P2=seg7code[E13];P37 =0;}break;//千位显示
//case 5: st1++;if(shan14==0){clean2();P2=seg7code[E14];P36 =0;}break;//百位显示
//case 6: st1++;if(shan15==0){clean2();P2=seg7code[E15]&TD4xsd;P51 =0;}break;//十位显示
//case 7: st1++;if(shan16==0){clean2();P2=seg7code[E16];P50 =0;}break;//个位显示       
//case 8: st1=0;clean2();break;//个位显示       
//default: break;
//}
}
}

/********************** Timer0 2ms中断函数 *用的是11.0592M晶振***********************/
void timer0 (void) interrupt 1
{
DisplayScan();  //2ms扫描显示一位  
if(cs_shanshuo==1){yc_sec++;if(yc_sec>=300)
{
yc_sec=0;
//if(bjss1==1){yc_bjss1=!yc_bjss1;}
//if(bjss2==1){yc_bjss2=!yc_bjss2;}
//if(bjss3==1){yc_bjss3=!yc_bjss3;}
//if(bjss4==1){yc_bjss4=!yc_bjss4;}
yc_shanshuobz=!yc_shanshuobz;

}}
if(bjbz==1){yc_sec++;if(yc_sec>=300)
{
yc_sec=0;
if(bjss1==1){yc_bjss1=!yc_bjss1;}
//if(bjss2==1){yc_bjss2=!yc_bjss2;}
//if(bjss3==1){yc_bjss3=!yc_bjss3;}
//if(bjss4==1){yc_bjss4=!yc_bjss4;}

}}

B_1ms = 1;      //2ms标志
if(bjcsbz==1){BJ_1ms = 1;}      //2ms标志       
if(szbz==1){SZ_1ms = 1;}        //2ms标志       
SStime++;
if(SStime==200)
{
SStime=0;
if(shanshuo==1){shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan1=!shan1;}
if(shanshuo==2){shan1=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan2=!shan2;}
if(shanshuo==3){shan1=0;shan2=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan3=!shan3;}
if(shanshuo==4){shan1=0;shan2=0;shan3=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan4=!shan4;}
//if(shanshuo==5){shan1=0;shan2=0;shan3=0;shan4=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan5=!shan5;}
//if(shanshuo==6){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan6=!shan6;}
//if(shanshuo==7){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan7=!shan7;}
//if(shanshuo==8){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan8=!shan8;}
//if(shanshuo==9){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan9=!shan9;}
//if(shanshuo==10){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan10=!shan10;}
//if(shanshuo==11){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=0;shan11=!shan11;}
//if(shanshuo==12){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan13=0;shan14=0;shan15=0;shan16=0;shan12=!shan12;}
//if(shanshuo==13){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan14=0;shan15=0;shan16=0;shan13=!shan13;}
//if(shanshuo==14){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan15=0;shan16=0;shan14=!shan14;}
//if(shanshuo==15){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan16=0;shan15=!shan15;}
//if(shanshuo==16){shan1=0;shan2=0;shan3=0;shan4=0;shan5=0;shan6=0;shan7=0;shan8=0;shan9=0;shan10=0;shan11=0;shan12=0;shan13=0;shan14=0;shan15=0;shan16=!shan16;}
}
}
//========================================================================
// 函数: void PrintString3(u8 *puts)
// 描述: 串口3发送字符串函数。
// 参数: puts:  字符串指针.
// 返回: none.
//========================================================================
void PrintString3(u8 *puts)
{
    for (; *puts != 0;  puts++)     //遇到停止符0结束
    {
        S3BUF = *puts;
        B_TX3_Busy = 1;
        while(B_TX3_Busy);
    }
}

//========================================================================
// 函数: SetTimer2Baudraye(u16 dat)
// 描述: 设置Timer2做波特率发生器。
// 参数: dat: Timer2的重装值.
// 返回: none.

//========================================================================
void SetTimer2Baudraye(u16 dat)  // 使用Timer2做波特率.
{
    AUXR &= ~(1<<4);    //Timer stop
    AUXR &= ~(1<<3);    //Timer2 set As Timer
    AUXR |=  (1<<2);    //Timer2 set as 1T mode
    T2H = dat / 256;
    T2L = dat % 256;
    IE2  &= ~(1<<2);    //禁止T2中断
    AUXR |=  (1<<4);    //Timer run enable
}
//========================================================================
// 函数: void UART3_config(u8 brt)
// 描述: UART3初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART3_config(u8 brt)    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
{
    if(brt == 2)
    {
        SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate3);
        S3CON = 0x10;       //8位数据, 使用Timer2做波特率发生器, 允许接收
    }
                else
                {
        S3CON = 0x50;       //8位数据, 使用Timer3做波特率发生器, 允许接收
        T3H = (65536UL - (MAIN_Fosc / 4) / Baudrate3) / 256;
        T3L = (65536UL - (MAIN_Fosc / 4) / Baudrate3) % 256;
        T4T3M = 0x0a;
                }
    IE2 |= 0x08;          //允许UART3中断
    P_SW2 &= ~0x02;
    //P_SW2 |= 0x02;      //UART3 switch bit1 to: 0: P0.0 P0.1,  1: P5.0 P5.1

    B_TX3_Busy = 0;
    TX3_Cnt = 0;
    RX3_Cnt = 0;
}
void CLR_Buf3(void)
{
u8 k;
for(k=0;k<6;k++)      //将串口1缓存数组的值都清为零
{
RX3_Buffer[k] = 0;
}

}
//========================================================================
// 函数: void UART3_int (void) interrupt UART3_VECTOR
// 描述: UART3中断函数。
// 参数: nine.
// 返回: none.
//========================================================================
//void UART3_int (void) interrupt 17
//{
//    if((S3CON & 0x01) != 0)
//    {
//        S3CON &= ~0x01;    //Clear Rx flag
//        RX3_Buffer[RX3_Cnt] = S3BUF;
//        if(++RX3_Cnt >= UART3_BUF_LENGTH)   RX3_Cnt = 0;
//    }

//    if((S3CON & 0x02) != 0)
//    {
//        S3CON &= ~0x02;    //Clear Tx flag
//        B_TX3_Busy = 0;
//    }
//}

//========================================================================
// 函数: void UART3_int (void) interrupt UART3_VECTOR
// 描述: UART3中断函数。
// 参数: nine.
// 返回: none.
//========================================================================
void UART3_int (void) interrupt 17
{
if((S3CON & 0x01) != 0)
{
S3CON &= ~0x01;    //Clear Rx flag
RX3_Buffer[RX3_Cnt++&0x0F] = S3BUF;  //把接受的数据存储到BUT数组中
//if(++RX3_Cnt >= UART3_BUF_LENGTH)   RX3_Cnt = 0;
if(RX3_Cnt>=6)
{       
RX3_Cnt=0;
flag_zx=1;
}
}
if(flag_zx==1)
{                     

flag_zx=0;
//0         1       2       3        4               
//起始位   地址位  功能位   数据位  结束位
if((RX3_Buffer[0]==0xaa)&&(RX3_Buffer[5]==0xbb)&&(RX3_Buffer[1]==add))          //如果开始位和结束位,还有地址都正确,进行下一步判断
{
if(RX3_Buffer[2]==0x01)  //修改板子地址
{
add=RX3_Buffer[3];       
write=1;       
fabz3=1;       
}

else if(RX3_Buffer[2]==0x02)  //报警温度值查询
{
switch(RX3_Buffer[3])
{
case 0x01:  tongD=0x01;dateX=dateA;wdcxbz=1;break;
case 0x02:  tongD=0x02;dateX=dateB;wdcxbz=1;break;
case 0x03:  tongD=0x03;dateX=dateC;wdcxbz=1;break;
case 0x04:  tongD=0x04;dateX=dateD;wdcxbz=1;break;
default:break;
}
}

else if(RX3_Buffer[2]==0x03)  //报警温度值设置
{
switch(RX3_Buffer[3])
{
case 0x01:  dateA=RX3_Buffer[4];tongD=0x01;dateX=dateA;E1=0;E2=dateA/100;E3=(dateA%100)/10;E4=dateA%10;wdszbz=1;write=1;break;
case 0x02:  dateB=RX3_Buffer[4];tongD=0x02;dateX=dateB;E5=0;E6=dateB/100;E7=(dateB%100)/10;E8=dateB%10;wdszbz=1;write=1;break;
case 0x03:  dateC=RX3_Buffer[4];tongD=0x03;dateX=dateC;E9=0;E10=dateC/100;E11=(dateC%100)/10;E12=dateC%10;wdszbz=1;write=1;break;
case 0x04:  dateD=RX3_Buffer[4];tongD=0x04;dateX=dateD;E13=0;E14=dateD/100;E15=(dateD%100)/10;E16=dateD%10;wdszbz=1;write=1;break;
default:break;
}
}

else if(RX3_Buffer[2]==0x04)  //实时温度查询功能
{
switch(RX3_Buffer[3])
{
case 0x01:  tongD=0x01;dateX=AI11;sswdbz=1;break;
case 0x02:  tongD=0x02;dateX=AI12;sswdbz=1;break;
case 0x03:  tongD=0x03;dateX=AI13;sswdbz=1;break;
case 0x04:  tongD=0x04;dateX=AI14;sswdbz=1;break;
default:break;
}
}

else if(RX3_Buffer[2]==0x05)  //继电器输出报警状态查询功能
{
       
if(OUT5==0){dateX=0xFF;}else{dateX=0x00;}
bjztbz=1;
//switch(RX3_Buffer[3])
//{
//case 0x01:  tongD=0x01;dateX=AI11;bjztbz=1;break;
//case 0x02:  tongD=0x02;dateX=AI12;bjztbz=1;break;
//case 0x03:  tongD=0x03;dateX=AI13;bjztbz=1;break;
//case 0x04:  tongD=0x04;dateX=AI14;bjztbz=1;break;
//default:break;
//}
}

else if(RX3_Buffer[2]==0x06)  //报警测试(同ESC)继电器和报警输出闭合控制功能
{
BJ_1ms = 1;
bjcs=1;
}

else if(RX3_Buffer[2]==0x07)  //报警后实现解除报警继电器和报警输出断开控制功能
{
bjbz=0;jybz=0;OUT1=1;OUT2=1;OUT3=1;OUT4=1;OUT5=1;OUT6=1;cs_shanshuo=0;yc_shanshuobz=0;
bjss1=0;yc_bjss1=0;
bjss2=0;yc_bjss2=0;
bjss3=0;yc_bjss3=0;
bjss4=0;yc_bjss4=0;       
}
else if(RX3_Buffer[2]==0x08)  //报警后实现静音功能;AA 00 08 00 00 BB
{
jybz=1;OUT6 = 1;
}

}
if((RX3_Buffer[0]==0xaa)&&(RX3_Buffer[1]==0x00)&&(RX3_Buffer[2]==0x00)&&(RX3_Buffer[3]==0x00)&&(RX3_Buffer[4]==0x00)&&(RX3_Buffer[5]==0xbb))          //如果开始位和结束位,还有地址都正确,进行下一步判断
{
fabz3=1;       
}
CLR_Buf3();                       
}
if((S3CON & 0x02) != 0)
{
        S3CON &= ~0x02;    //Clear Tx flag
        B_TX3_Busy = 0;
}
}

03、 NTC温度检测 串口 数码管 模拟量 EEPROM.zip

549.71 KB, 下载次数: 42

回复 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 16:02
  • 签到天数: 51 天

    [LV.5]常住居民I

    4

    主题

    88

    回帖

    208

    积分

    中级会员

    积分
    208
    发表于 2024-4-28 16:44:39 | 显示全部楼层
    太好了,谢谢分享!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 16:02
  • 签到天数: 51 天

    [LV.5]常住居民I

    4

    主题

    88

    回帖

    208

    积分

    中级会员

    积分
    208
    发表于 2024-4-28 16:45:14 | 显示全部楼层
    太需要学习这些例子了,
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    17 分钟前
  • 签到天数: 184 天

    [LV.7]常住居民III

    0

    主题

    486

    回帖

    591

    积分

    高级会员

    积分
    591
    发表于 2024-4-28 18:37:35 | 显示全部楼层
    感谢分享
    靡不有初,鲜克有终
    回复 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 79 天

    [LV.6]常住居民II

    0

    主题

    120

    回帖

    230

    积分

    禁止发言

    积分
    230
    发表于 2024-5-5 11:57:33 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-15 08:41 , Processed in 0.068241 second(s), 48 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表