main.lis
来自「为日本瑞萨苏州分公司做的一个温控系统」· LIS 代码 · 共 1,434 行 · 第 1/4 页
LIS
1,434 行
0000 .dbfile Main.c
0000 .dbfunc e main _main fV
0000 ; InitTime -> 2,X
0000 ; tmp -> 3,X
0000 ; ADValue -> 5,X
0000 _main::
0000 .dbline -1
0000 A7E5 ais #-27
0002 95 tsx
0003 .dbline 26
0003 ; //-------------------------------------------------------------------------*
0003 ; //工程文件名:Bake.prj *
0003 ; //硬件连接: *
0003 ; // TLC2543的CS,I/O CLOCK,DATA INPUT,DATA OUT分别接PTC0,PTD1~PTD3 *
0003 ; // LCD的数据口为PTB0~PTB7,控制口为PTC1~PTC4 *
0003 ; // 报警灯:红灯及蜂鸣器、绿灯、黄灯、Bake阀、Cool阀分别接PTA的第0~4脚 *
0003 ; // 温度电位器、时间电位器、热敏电阻、红外传感器分别接TLC2543的第0~3脚
0003 ; //程序描述:由TLC2543采集来的AD值确定设定时间、设定温度、当前温度和 *
0003 ; // Cool箱中是否有物体 *
0003 ; // 判断如果Bake炉内温度变化超过设定温度一定范围,则红灯闪并报警 *
0003 ; // 否则等加热到设定时间后黄灯闪,切掉Bake炉电源,提示取出加热物体 *
0003 ; // 放入Cool箱,冷却阀闭合,当物体移出Cool箱后,冷却阀断开 *
0003 ; //日 期:2007.04.25 *
0003 ; //-------------------------------------------------------------------------*
0003 ; #include "Includes.h" //总头文件
0003 ;
0003 ; //内部函数声明
0003 ; void LightAlarm(INT8U Light); //通过不同颜色灯闪,提示进一步操作
0003 ; INT16U ConvertCT(INT16U adv); //将AD值转换当前温度
0003 ; INT16U ConvertT(INT16U adv); //将AD值转换设定温度
0003 ; INT16U ConvertTime(INT16U adv); //将AD值转换设定时间
0003 ; void ReFlash(void);
0003 ;
0003 ; //主函数
0003 ; void main()
0003 ; {
0003 .dbline 32
0003 ; INT16U ADValue[11]; //11路A/D采集数据
0003 ; INT8U InitTime; //开始计时的基值
0003 ; INT16U tmp;
0003 ;
0003 ; //初始化
0003 ; DisableMCUInterrupt(); //禁止总中断
0003 9B SEI
0004 .dbline 33
0004 ; MCUInit(); //芯片初始化
0004 CD0000 jsr _MCUInit
0007 .dbline 34
0007 ; SPIInit(); //SPI初始化
0007 CD0000 jsr _SPIInit
000A .dbline 35
000A ; LCDInit(); //Lcd初始化
000A CD0000 jsr _LCDInit
000D .dbline 36
000D ; SCIInit(); //串口初始化
000D CD0000 jsr _SCIInit
0010 .dbline 37
0010 ; Timer1init(); //定时器1初始化
0010 CD0000 jsr _Timer1init
0013 .dbline 38
0013 ; SwitchOutput_Init(); //开关量输出初始化
0013 CD0000 jsr _SwitchOutput_Init
0016 95 tsx
0017 .dbline 39
0017 ; EnTm1OverflowInt(); //开放Timer1溢出中断
0017 1C20 bset #6,0x20
0019 .dbline 40
0019 ; EnableSCIReInt(); //开放串行中断
0019 1A14 bset #5,0x14
001B .dbline 41
001B ; EnableMCUInterrupt(); //开放总中断
001B 9A CLI
001C L2:
001C .dbline 44
001C ; MainLoop:
001C ; //初始化标志
001C ; StateFlag=1; //初始状态为1:开绿灯、Bake炉
001C A601 lda #1
001E B702 sta *_StateFlag
0020 .dbline 45
0020 ; CoolFlag=0; //开始工作时,Cool箱中是没物体的
0020 3F01 clr *_CoolFlag
0022 .dbline 46
0022 ; FlashFlag=0; //需要校准当前温度或修改MCU号时在串行中断里置1
0022 3F00 clr *_FlashFlag
0024 CC01BF jmp L4
0027 L3:
0027 .dbline 50
0027 ;
0027 ; //主循环
0027 ; while(1)
0027 ; {
0027 .dbline 52
0027 ; //1 采集A/D值,转换为设定温度、设定时间、当前温度和红外传感器值
0027 ; ADC11P(0,ADValue);
0027 AF05 aix #5
0029 89 pshx
002A 8B pshh
002B 4F clra
002C 87 psha
002D CD0000 jsr _ADC11P
0030 A703 ais #3
0032 95 tsx
0033 .dbline 53
0033 ; CurtTmp=ConvertCT(ADValue[0]); //第0路为当前温度
0033 E606 lda 6,X
0035 87 psha
0036 E605 lda 5,X
0038 87 psha
0039 CD01C5 jsr _ConvertCT
003C A702 ais #2
003E 95 tsx
003F 4E000C mov *__r0,*_CurtTmp
0042 4E000D mov *__r1,*_CurtTmp+1
0045 .dbline 54
0045 ; Temper=ConvertT(ADValue[1]); //第1路为设定温度
0045 E608 lda 8,X
0047 87 psha
0048 E607 lda 7,X
004A 87 psha
004B CD02D9 jsr _ConvertT
004E A702 ais #2
0050 95 tsx
0051 4E000E mov *__r0,*_Temper
0054 4E000F mov *__r1,*_Temper+1
0057 .dbline 55
0057 ; Time=ConvertTime(ADValue[2]); //第2路为设定时间
0057 E60A lda 10,X
0059 87 psha
005A E609 lda 9,X
005C 87 psha
005D CD034C jsr _ConvertTime
0060 A702 ais #2
0062 95 tsx
0063 4E0008 mov *__r0,*_Time
0066 4E0009 mov *__r1,*_Time+1
0069 .dbline 56
0069 ; Infrared=ADValue[3]; //第3路为红外传感器的值
0069 E60B lda 11,X
006B B706 sta *_Infrared
006D E60C lda 12,X
006F B707 sta *_Infrared+1
0071 .dbline 58
0071 ;
0071 ; ADCurtTmp=ADValue[0]; //校准当前温度时写flash用
0071 E605 lda 5,X
0073 B710 sta *_ADCurtTmp
0075 E606 lda 6,X
0077 B711 sta *_ADCurtTmp+1
0079 .dbline 59
0079 ; if(FlashFlag==1)
0079 B600 lda *_FlashFlag
007B A101 cmp #1
007D 2604 bne L9
007F .dbline 60
007F ; ReFlash();
007F CD041B jsr _ReFlash
0082 95 tsx
0083 L9:
0083 .dbline 63
0083 ;
0083 ; //2 根据不同状态,作不同处理
0083 ; switch(StateFlag)
0083 7F clr ,X
0084 B602 lda *_StateFlag
0086 E701 sta 1,X
0088 F6 lda ,X
0089 2606 bne X0
008B E601 lda 1,X
008D A101 cmp #1
008F 272D beq L14
0091 X0:
0091 F6 lda ,X
0092 2606 bne X1
0094 E601 lda 1,X
0096 A102 cmp #2
0098 2740 beq L15
009A X1:
009A F6 lda ,X
009B 2606 bne X2
009D E601 lda 1,X
009F A103 cmp #3
00A1 274C beq L18
00A3 X2:
00A3 F6 lda ,X
00A4 2609 bne X3
00A6 E601 lda 1,X
00A8 A104 cmp #4
00AA 2603 bne X8
00AC CC014A jmp L23
00AF X8:
00AF X3:
00AF F6 lda ,X
00B0 2609 bne X4
00B2 E601 lda 1,X
00B4 A105 cmp #5
00B6 2603 bne X9
00B8 CC0178 jmp L26
00BB X9:
00BB X4:
00BB CC01BF jmp L11
00BE X5:
00BE .dbline 64
00BE ; {
00BE L14:
00BE .dbline 66
00BE ; case 1://状态1:绿灯亮,Bake炉通电工作
00BE ; SwitchOutput(C_GreenLight,1); //系统开始工作后,绿灯常亮
00BE A601 lda #1
00C0 87 psha
00C1 87 psha
00C2 CD0000 jsr _SwitchOutput
00C5 A702 ais #2
00C7 .dbline 67
00C7 ; SwitchOutput(C_BakeSw,1); //使Bake炉开始工作
00C7 A601 lda #1
00C9 87 psha
00CA A603 lda #3
00CC 87 psha
00CD CD0000 jsr _SwitchOutput
00D0 A702 ais #2
00D2 95 tsx
00D3 .dbline 68
00D3 ; StateFlag=2; //进入状态2
00D3 A602 lda #2
00D5 B702 sta *_StateFlag
00D7 .dbline 69
00D7 ; break;
00D7 CC01BF jmp L12
00DA L15:
00DA .dbline 71
00DA ; case 2://状态2:等待炉内温度达到设定值
00DA ; if(CurtTmp>=Temper) //温度达到设定值
00DA 550C ldhx *_CurtTmp
00DC 750E cphx *_Temper
00DE 95 tsx
00DF 2403 bhs X10
00E1 CC01BF jmp L12
00E4 X10:
00E4 .dbline 72
00E4 ; {
00E4 .dbline 73
00E4 ; InitTime=MntTim; //记录此刻时间,作为加热时间的基值
00E4 B604 lda *_MntTim+1
00E6 E702 sta 2,X
00E8 .dbline 74
00E8 ; StateFlag=3; //进入状态3
00E8 A603 lda #3
00EA B702 sta *_StateFlag
00EC .dbline 75
00EC ; }
00EC .dbline 76
00EC ; break;
00EC CC01BF jmp L12
00EF L18:
00EF .dbline 78
00EF ; case 3://状态3:如果当前炉内温度偏离设定温度过大,则报警提示关闭系统
00EF ; if(CurtTmp>Temper) //允许正负偏一定值,tmp为两者的差值
00EF 550C ldhx *_CurtTmp
00F1 750E cphx *_Temper
00F3 95 tsx
00F4 230E bls L19
00F6 .dbline 79
00F6 ; tmp=CurtTmp-Temper;
00F6 B60D lda *_CurtTmp+1
00F8 B00F sub *_Temper+1
00FA E704 sta 4,X
00FC B60C lda *_CurtTmp
00FE B20E sbc *_Temper
0100 E703 sta 3,X
0102 200C bra L20
0104 L19:
0104 .dbline 81
0104 ; else
0104 ; tmp=Temper-CurtTmp;
0104 B60F lda *_Temper+1
0106 B00D sub *_CurtTmp+1
0108 E704 sta 4,X
010A B60E lda *_Temper
010C B20C sbc *_CurtTmp
010E E703 sta 3,X
0110 L20:
0110 .dbline 82
0110 ; if(tmp>C_TmpPC) //如果当前温度与设定温度偏差大于5,作异常处理
0110 E604 lda 4,X
0112 B700 sta *__r1
0114 E603 lda 3,X
0116 B700 sta *__r0
0118 5500 ldhx *__r0
011A 650005 cphx #5
011D 95 tsx
011E 2323 bls L21
0120 .dbline 83
0120 ; {
0120 .dbline 84
0120 ; SwitchOutput(C_BakeSw,0); //断开Bake阀
0120 4F clra
0121 87 psha
0122 A603 lda #3
0124 87 psha
0125 CD0000 jsr _SwitchOutput
0128 A702 ais #2
012A .dbline 85
012A ; SwitchOutput(C_GreenLight,0);//绿灯灭
012A 4F clra
012B 87 psha
012C A601 lda #1
012E 87 psha
012F CD0000 jsr _SwitchOutput
0132 A702 ais #2
0134 .dbline 86
0134 ; SwitchOutput(C_RedLight,1); //红灯亮并报警,直到掉电
0134 A601 lda #1
0136 87 psha
0137 A605 lda #5
0139 87 psha
013A CD0000 jsr _SwitchOutput
013D A702 ais #2
013F 95 tsx
0140 .dbline 87
0140 ; }
0140 CC01BF jmp L12
0143 L21:
0143 .dbline 89
0143 ; else
0143 ; {
0143 .dbline 90
0143 ; StateFlag=4; //进入状态4
0143 A604 lda #4
0145 B702 sta *_StateFlag
0147 .dbline 91
0147 ; }
0147 .dbline 92
0147 ; break;
0147 CC01BF jmp L12
014A L23:
014A .dbline 94
014A ; case 4://状态4:如果加热到设定时间,黄灯闪
014A ; CurtTime=MntTim-InitTime;
014A 3F00 clr *__r0
014C E602 lda 2,X
014E B700 sta *__r1
0150 B604 lda *_MntTim+1
0152 B000 sub *__r1
0154 B70B sta *_CurtTime+1
0156 B603 lda *_MntTim
0158 B200 sbc *__r0
015A B70A sta *_CurtTime
015C .dbline 95
015C ; if(CurtTime>=Time) //加热时间到,报警灯提示,直到Cool阀开
015C 550A ldhx *_CurtTime
015E 7508 cphx *_Time
0160 95 tsx
0161 250F blo L24
0163 .dbline 96
0163 ; {
0163 .dbline 97
0163 ; LightAlarm(C_YellowLight); //断开Bake阀、绿灯灭、黄灯闪
0163 A602 lda #2
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?