📄 test.lst
字号:
C51 COMPILER V8.18 TEST 11/30/2009 13:34:26 PAGE 1
C51 COMPILER V8.18, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN Test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Test.c OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"stc12c5a.h" //包含STC12C5A60S2单片机的寄存器定义头文件
2 #include"ISD51.h" //包含ISD51调试功能所需头文件
3
4 #define _DEBUG //启用ISD51调试功能
5
6 sbit P37=P3^7;
7 sbit steerPWM=P4^2;
8
9 unsigned char speed; //给定速度--实际为驱动电机PWM的占空比
10 unsigned int duty=78,duty1; //驱动舵机PWM占空比
11 unsigned char b[7]; //路经检测二值化后的值
12 char locate; //黑线偏差坐标
13 char locate_hist; //历史黑线偏差坐标
14 bit black_flag; //检测到黑线的标志变量
15
16 void T0_ISR(void) interrupt 1 //定时器0中断--在IO上产生周期为20ms的PWM波形驱动舵机
17 {
18 1 static unsigned int period=0;
19 1
20 1 period++;
21 1 if(period<=duty) steerPWM=1;
22 1 else steerPWM=0;
23 1 if(period>=1000) //计数1000次实现定时20ms
24 1 {
25 2 period=0;
26 2 duty=duty1;
27 2 }
28 1 }
29
30 void PWM1_init(void) //PWM初始化--驱动电机用
31 {
32 1 CMOD=0x80; //PCA 在空闲模式下停止 PCA 计数器工作
33 1 //PCA 时钟模式为fosc/12,禁止 PCA 计数器溢出中断
34 1 CCON=0x0; //禁止PCA计数器工作,清除中断标志、计数器溢出标志
35 1 CL=0x0; //清0计数器
36 1 CH=0x0;
37 1 CCAPM1=0x02; //设置模块1
38 1 PCA_PWM1=0x00;
39 1 }
40
41 void TIMER_init(void) //定时器初始化
42 {
43 1 TMOD=0x22; //定时器01都为工作方式2
44 1 TL0=0xee;
45 1 TH0=0xee; //自动装入初值,定时20us,
46 1 TR0=1; //启动定时器0
47 1 ET0=1; //允许定时器0中断
48 1 TH1=0xFD; //产生9600bps的时间常数
49 1 TL1=0xFD;
50 1 TR1=1; //启动定时器1
51 1 }
52
53 void AD_init(void) //AD初始化
54 {
55 1 unsigned int i;
C51 COMPILER V8.18 TEST 11/30/2009 13:34:26 PAGE 2
56 1
57 1 ADC_CONTR=0x80; //开A/D转换电源,第一次使用时要打开内部模拟电源
58 1 for (i=0;i<10000;i++); //适当延时
59 1
60 1 P1ASF=0xff; //P1口 7路AD转换 AD0--AD6
61 1 }
62
63 char abs(char data1) //求绝对值子程序
64 {
65 1 data1=(data1<0)?(-data1):data1;
66 1 return data1;
67 1 }
68
69 void Get_data(void) //获取路径信息
70 {
71 1 unsigned int i;
72 1 unsigned int res,resl; //AD结果暂存
73 1 unsigned char status=0; //AD转换状态
74 1 unsigned int a[7]; //路经检测的AD采样值
75 1
76 1 black_flag=0;
77 1 ADC_CONTR=0x80; //打开AD电源
78 1 for (i=0;i<10000;i++); //适当延时
79 1
80 1 for(i=0;i<7;i++)
81 1 {
82 2 ADC_CONTR=(0x80|i); //设定转换通道
83 2 ADC_CONTR|=0x08; //开始AD转换
84 2 status=0;
85 2 while(status==0) //等待转换完
86 2 {
87 3 status=ADC_CONTR&0x10;
88 3 }
89 2 ADC_CONTR&=0xE7; //清零
90 2
91 2 res=ADC_RES; //读AD转换结果
92 2 resl=ADC_RESL;
93 2 a[i]=res*256+resl;
94 2
95 2 if(a[i]<0x02ff) b[i]=0; //二值化
96 2 else
97 2 {
98 3 b[i]=1;
99 3 black_flag=1;
100 3 }
101 2 }
102 1 }
103
104 void main (void)
105 {
106 1 AUXR1=0x44; //PWM1转到P4.3口,AD高两位存在ADC_RES
107 1 PCON|=0x80; //波特率加倍
108 1 SCON=0x50; //8位可变波特率,无校验
109 1 //P1M0=0x00; //P1口用作AD口,设为输入
110 1 //P1M1=0xff;
111 1 P37=1;
112 1
113 1 #ifdef _DEBUG
114 1 ISDinit (); //初始化ISD51
115 1 #endif
116 1
117 1 TIMER_init();
C51 COMPILER V8.18 TEST 11/30/2009 13:34:26 PAGE 3
118 1 AD_init();
119 1 PWM1_init();
120 1
121 1 CR=1; //允许PCA计数
122 1 EA = 1; //允许全局中断
123 1
124 1 while(1)
125 1 {
126 2 Get_data(); //获取路径信息
127 2 if(black_flag==1) //能够检测到黑线时
128 2 {
129 3 locate=((-12)*b[0]+(-8)*b[1]+(-4)*b[2]+0*b[3]+4*b[4]+8*b[5]+12*b[6])/(b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6
-]);
130 3 //计算偏差坐标 -12 0 12
131 3 locate_hist=locate; //保存历史
132 3 }
133 2 else //检测不到黑线时,偏差用历史值
134 2 locate=locate_hist;
135 2
136 2 duty1=72+locate*5/4; //根据偏差计算转角
137 2
138 2 if(duty1<62) duty1=58; //转角限幅
139 2 if(duty1>88) duty1=93;
140 2
141 2 speed=0x8e-5*abs(locate); //根据偏差给定速度
142 2 CCAP1L=speed;
143 2 CCAP1H=speed;
144 2 }
145 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 523 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 16
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -