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 + -
显示快捷键?