📄 wendu.lst
字号:
C51 COMPILER V7.09 WENDU 08/02/2005 14:26:27 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE WENDU
OBJECT MODULE PLACED IN Wendu.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Wendu.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************************************************************
2 * 文件名: Wendu.c
3 * 功能描述: 实现闭环温度控制,将给定值与测量值在数码管上显示
4 **************************************************************/
5
6 #include <reg51.h>
7 #include <absacc.h>
8 #include <math.h>
9
10 void pid(void);
11 void init(void);
12 void Display(void);
13 void clear();
14
15 int mmul(int x, int y); /*16位乘法,溢出赋极值*/
16 int madd(int x, int y); /*16位加法,溢出赋极值*/
17 int change32_16(int z, int t); /*将32位数转化成16位*/
18 char change16_8(int wd); /*将16位数转化成8位*/
19
20 #define C8255_A XBYTE[0x7F00]
21 #define C8255_B XBYTE[0x7F01]
22 #define C8255_C XBYTE[0x7F02]
23 #define C8255_CON XBYTE[0x7F03]
24
25 #define AD0809 XBYTE[0xFEFF]
26
27 sbit P17 = P1^7;
28
29 char TS = 0x64;
30 int X = 0x80;
31 char SPEC = 0x28; // 数字给定(40)
32 char IBAND = 0x60; // 积分分离值
33 int KP = 12; // 比例系数
34 char KI = 20; // 积分系数
35 char KD = 32; // 微分系数
36 int CK; // 控制量:PID算法产生用于控制的量
37 int TC; // 采样周期变量
38 char FPWM; // PWM脉冲中间标志位
39 int CK_1; // 控制量变量:记录上次控制量值
40 int AAAA; // PWM脉冲高电平时间计算
41 int VAA; // AAAA变量
42 int BBB; // PWM脉冲低电平时间计算
43 int VBB; // BBB变量
44 int TKMARK; // 采样标志值
45 int ADMARK; // AD转换结束标志位
46 int ADVALUE; // AD采样值保存
47 int YK; // 反馈:测量温度值
48 int EK;
49 int EK_1;
50 int AEK;
51 int BEK;
52
53 unsigned char DIS;
54 // BCD码显示表
55 unsigned char Led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6f};
C51 COMPILER V7.09 WENDU 08/02/2005 14:26:27 PAGE 2
56 unsigned char b[] = {0x00, 0x00, 0x00, 0x00}; // 位选
57
58 // 温度表
59 unsigned char code a[0x100]={0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,
60 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
61 0x1D, 0x1E, 0x1E, 0x1F, 0x20, 0x21, 0x23, 0x24, 0x25,
62 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E,
63 0x2F, 0x31, 0x32, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
64 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
65 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A,
66 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x4F, 0x50, 0x51,
67 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A,
68 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63,
69 0x64, 0x64, 0x65, 0x65, 0x66, 0x66, 0x67, 0x68, 0x69,
70 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70,
71 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
72 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82,
73 0x83, 0x84, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A,
74 0x8B, 0x8C, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94,
75 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9B, 0x9C,
76 0x9C, 0x9D, 0x9D, 0x9E, 0x9E, 0x9F, 0x9F, 0xA0, 0xA1,
77 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA,
78 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2,
79 0xB3, 0xB4, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
80 0xBB, 0xBD, 0xBE, 0xBE, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5,
81 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2,
82 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC,
83 0xDD, 0xDE, 0xE3, 0xE6, 0xE9, 0xEC, 0xF0, 0xF2, 0xF6,
84 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
85 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
86 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
87 0xFF, 0xFF, 0xFF, 0xFF };
88
89 void delay(unsigned int time)
90 {
91 1 unsigned int i;
92 1 for(i=0; i<time; i++);
93 1 }
94
95 void main()
96 {
97 1 init();
98 1
99 1 while (1)
100 1 {
101 2 while (1)
102 2 {
103 3 if (TKMARK == 0x01) //采样周期到否
104 3 break;
105 3 }
106 2
107 2 TKMARK = 0x00;
108 2
109 2 while (1)
110 2 {
111 3 if (ADMARK == 0x01) //AD转换是否结束
112 3 break;
113 3 }
114 2
115 2 ADMARK = 0x00;
116 2
117 2 YK = a[ADVALUE]; //查温度表
C51 COMPILER V7.09 WENDU 08/02/2005 14:26:27 PAGE 3
118 2 DIS = (char)YK;
119 2
120 2 pid(); //调PID运算函数
121 2
122 2 if( CK <= 0x80) //根据CK产生PWM
123 2 AAAA = 0x00;
124 2 else
125 2 AAAA = CK - 0x80;
126 2
127 2 BBB = 0x7f - AAAA;
128 2 }
129 1 }
130
131 void init(void) //初始化函数
132 {
133 1 YK = 0x00; //变量初始化
134 1 EK = 0x00;
135 1 EK_1 = 0x00;
136 1 AEK = 0x00;
137 1 BEK = 0x00;
138 1 CK = 0x00;
139 1 CK_1 = 0x00;
140 1 BBB = 0x00;
141 1 VBB = 0x00;
142 1 ADVALUE = 0x00;
143 1 TKMARK = 0x00;
144 1 ADMARK = 0x00;
145 1 TC = 0x00;
146 1 FPWM = 0x01;
147 1 AAAA = 0x7F;
148 1 VAA = 0x7F;
149 1
150 1 C8255_CON = 0x81;
151 1 Display();
152 1 clear();
153 1
154 1 TMOD = 0x11; // T1, T0 16位定时器
155 1 IP = 0x02; // pt0 定时器0中断为高优先级
156 1 IT1 = 1; // 外中断1为下降沿有效
157 1 EX1 = 1; // 允许INT1中断
158 1 TH0 = 0xD8;
159 1 TL0 = 0xEF;
160 1
161 1 TH1 = 0xD8;
162 1 TL1 = 0xEF;
163 1 ET0 = ET1 = 1; //使能定时器中断
164 1 TR0 = TR1 = 1; //启动定时器
165 1 EA = 1;
166 1 AD0809 = 1; // 启动AD
167 1 }
168
169 void myint3(void) interrupt 3 // 定时器1,LED显示
170 {
171 1 TH1 = 0xD8;
172 1 TL1 = 0xEF;
173 1 ET1 = 1;
174 1 Display();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -