每日学习STC8A8K64D单片机学习之 NTC温度检测 串口485 数码管 模拟量 EEPROM综合程
【声明】此程序仅用于学习与参考!*********************************************************************/
/*************本程序功能说明**************
读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
u8TX3_Cnt; //发送计数
u8RX3_Cnt; //接收计数
bit B_TX3_Busy; //发送忙标志
u8idata RX3_Buffer; //接收缓冲
/*************本地常量声明 **************/
////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={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0xFF,0xc0,0xBF,0x86,0x8e}; //11什么也不显示 10显示负号
/*************本地变量声明 **************/
//u8LED8; //显示缓冲
u8display_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, //;-400
149, //;-391
159, //;-382
168, //;-373
178, //;-364
188, //;-355
199, //;-346
210, //;-337
222, //;-328
233, //;-319
246, //;-3010
259, //;-2911
272, //;-2812
286, //;-2713
301, //;-2614
317, //;-2515
333, //;-2416
349, //;-2317
367, //;-2218
385, //;-2119
403, //;-2020
423, //;-1921
443, //;-1822
464, //;-1723
486, //;-1624
509, //;-1525
533, //;-1426
558, //;-1327
583, //;-1228
610, //;-1129
638, //;-1030
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, //;100140
3844, //;101141
3850, //;102142
3857, //;103143
3863, //;104144
3869, //;105145
3875, //;106146
3881, //;107147
3887, //;108148
3892, //;109149
3897, //;110150
3902, //;111151
3907, //;112152
3912, //;113153
3917, //;114154
3921, //;115155
3926, //;116156
3930, //;117157
3934, //;118158
3938, //;119159
3942 //;120160
};
/*************本地函数声明 **************/
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;
u8j,k,min,max;
adc = 4096 - adc; //Rt接地
p = temp_table;
if(adc < p) return (0xfffe);
if(adc > p) return (0xffff);
min = 0; //-40度
max = 160; //120度
for(j=0; j<5; j++)//对分查表
{
k = min / 2 + max / 2;
if(adc <= p) max = k;
else min = k;
}
if(adc == p)i = min * D_SCALE;
else if(adc == p)i = max * D_SCALE;
else // min < temp < max
{
while(min <= max)
{
min++;
if(adc == p) {i = min * D_SCALE; break;}
else if(adc < p)
{
min--;
i = p; //min
j = (adc - i) * D_SCALE / (p - 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;P53 =0;}break;//千位显示
case 1: st++;if(yc_bjss1==0){clean1();P1=seg7code;P52 =0;}break;//百位显示
case 2: st++;if(yc_bjss1==0){clean1();P1=seg7code;P07 =0;}break;//十位显示
case 3: st++;if(yc_bjss1==0){clean1();P1=seg7code;P43 =0;}break;//个位显示
case 4: st=0;clean1();break;//个位显示
//case 4: st++;if(yc_bjss2==0){clean1();P1=seg7code;P63 =0;}break;//千位显示
//case 5: st++;if(yc_bjss2==0){clean1();P1=seg7code;P62 =0;}break;//百位显示
//case 6: st++;if(yc_bjss2==0){clean1();P1=seg7code;P61 =0;}break;//十位显示
//case 7: st++;if(yc_bjss2==0){clean1();P1=seg7code;P60 =0;}break;//个位显示
//case 8: st=0;clean1();break;//个位显示
default: break;
}
//switch(st1)
//{
//case 0: st1++;if(yc_bjss3==0){clean2();P2=seg7code;P73 =0;}break;//千位显示
//case 1: st1++;if(yc_bjss3==0){clean2();P2=seg7code;P72 =0;}break;//百位显示
//case 2: st1++;if(yc_bjss3==0){clean2();P2=seg7code;P71 =0;}break;//十位显示
//case 3: st1++;if(yc_bjss3==0){clean2();P2=seg7code;P70 =0;}break;//个位显示
//
//case 4: st1++;if(yc_bjss4==0){clean2();P2=seg7code;P37 =0;}break;//千位显示
//case 5: st1++;if(yc_bjss4==0){clean2();P2=seg7code;P36 =0;}break;//百位显示
//case 6: st1++;if(yc_bjss4==0){clean2();P2=seg7code;P51 =0;}break;//十位显示
//case 7: st1++;if(yc_bjss4==0){clean2();P2=seg7code;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;P53 =0;}break;//千位显示
case 1: st++;if(shan2==0){clean1();P1=seg7code;P52 =0;}break;//百位显示
case 2: st++;if(shan3==0){clean1();P1=seg7code&TD1xsd;P07 =0;}break;//十位显示
case 3: st++;if(shan4==0){clean1();P1=seg7code;P43 =0;}break;//个位显示
case 4: st=0;clean1();break;//个位显示
//case 4: st++;if(shan5==0){clean1();P1=seg7code;P63 =0;}break;//千位显示
//case 5: st++;if(shan6==0){clean1();P1=seg7code;P62 =0;}break;//百位显示
//case 6: st++;if(shan7==0){clean1();P1=seg7code&TD2xsd;P61 =0;}break;//十位显示
//case 7: st++;if(shan8==0){clean1();P1=seg7code;P60 =0;}break;//个位显示
//case 8: st=0;clean1();break;//个位显示
default: break;
}
//switch(st1)
//{
//case 0: st1++;if(shan9==0){clean2();P2=seg7code;P73 =0;}break;//千位显示
//case 1: st1++;if(shan10==0){clean2();P2=seg7code;P72 =0;}break;//百位显示
//case 2: st1++;if(shan11==0){clean2();P2=seg7code&TD3xsd;P71 =0;}break;//十位显示
//case 3: st1++;if(shan12==0){clean2();P2=seg7code;P70 =0;}break;//个位显示
//
//case 4: st1++;if(shan13==0){clean2();P2=seg7code;P37 =0;}break;//千位显示
//case 5: st1++;if(shan14==0){clean2();P2=seg7code;P36 =0;}break;//百位显示
//case 6: st1++;if(shan15==0){clean2();P2=seg7code&TD4xsd;P51 =0;}break;//十位显示
//case 7: st1++;if(shan16==0){clean2();P2=seg7code;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 = 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 = 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 = 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==0xaa)&&(RX3_Buffer==0xbb)&&(RX3_Buffer==add)) //如果开始位和结束位,还有地址都正确,进行下一步判断
{
if(RX3_Buffer==0x01)//修改板子地址
{
add=RX3_Buffer;
write=1;
fabz3=1;
}
else if(RX3_Buffer==0x02)//报警温度值查询
{
switch(RX3_Buffer)
{
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==0x03)//报警温度值设置
{
switch(RX3_Buffer)
{
case 0x01:dateA=RX3_Buffer;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;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;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;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==0x04)//实时温度查询功能
{
switch(RX3_Buffer)
{
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==0x05)//继电器输出报警状态查询功能
{
if(OUT5==0){dateX=0xFF;}else{dateX=0x00;}
bjztbz=1;
//switch(RX3_Buffer)
//{
//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==0x06)//报警测试(同ESC)继电器和报警输出闭合控制功能
{
BJ_1ms = 1;
bjcs=1;
}
else if(RX3_Buffer==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==0x08)//报警后实现静音功能;AA 00 08 00 00 BB
{
jybz=1;OUT6 = 1;
}
}
if((RX3_Buffer==0xaa)&&(RX3_Buffer==0x00)&&(RX3_Buffer==0x00)&&(RX3_Buffer==0x00)&&(RX3_Buffer==0x00)&&(RX3_Buffer==0xbb)) //如果开始位和结束位,还有地址都正确,进行下一步判断
{
fabz3=1;
}
CLR_Buf3();
}
if((S3CON & 0x02) != 0)
{
S3CON &= ~0x02; //Clear Tx flag
B_TX3_Busy = 0;
}
}
太好了,谢谢分享! 太需要学习这些例子了, 感谢分享 {:4_250:}
页:
[1]