📄 car.lst
字号:
C51 COMPILER V7.20 CAR 04/16/2006 22:44:43 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE CAR
OBJECT MODULE PLACED IN car.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\c51.exe car.c DB OE
line level source
1 //P0.7, P1.0为PWM脉宽输出 对电机PWM控制而言,为了得到平稳电流,PWM频率宜在1kHz以上,采用8位PWM输出
2 //设置T2为系统时基 500Hz,周期为2ms.
3
4 #include <c8051F330.h>
5 typedef unsigned char uchar;
6 typedef unsigned int uint;
7
8 sfr16 ADC0VAL=0xbd; //ADC0转换值=ADC0L+ADC0H
9 sfr16 PCA0CP0=0xfb; //CEX0捕捉比较寄存器=PCA0CPL0+PCA0CPH0
10 sfr16 PCA0CP1=0xe9;
11 sfr16 PCA0CP2=0xeb;
12 sfr16 TMR2=0xcc; //定时器2计数器寄存器
13 sfr16 TMR2RL=0xca; //定时器2重载寄存器
14
15 #define SYSCLK 12250000 //采用内部晶振,12.25M
16 #define T2_Freq = 500 //T2系统时基500Hz
17 #define car_mode_front 0x0a //1010 小车前进
18 #define car_mode_back 0x06 //0101 小车后退
19 #define car_mode_stop 0x0f //1111 小车急停
20 #define car_mode_resolve 0x09 //1001 小车原地旋转
21 //-----------------------------------------------------------------------------
22 // 函数声明
23 //-----------------------------------------------------------------------------
24
25 void Timer2_ISR ();
26
27 //-----------------------------------------------------------------------------
28 // 全局变量
29 //-----------------------------------------------------------------------------
30
31 uchar count_led=0; //LED延时控制变量
32 uchar count_pwm=0; //PWM占空比进行数据刷新控制变量
33 sbit P15_LED=P1^5;
34 sbit P10=P1^0;
35 sbit P11=P1^1;
36 sbit P12=P1^2;
37 sbit P13=P1^3;
38 uchar pwm1;
39 uchar pwm2;
40 char Car_mode=2;
41 bit Car_mode_temp=1;
42
43
44 //-----------------------------------------------------------------------------
45 // T0初始化
46 //-----------------------------------------------------------------------------
47 /*void Timer0_Init()
48 {
49
50
51 }*/
52
53 void Timer2_Init (uint val) //2ms
54 {
55 1 TMR2CN = 0x00; // 选择定时器2外部时钟为(SYSCLK/12),16 位自动重装载方式
C51 COMPILER V7.20 CAR 04/16/2006 22:44:43 PAGE 2
56 1 CKCON &= 0xdf; // Timer2 clocked based on T2XCLK;
57 1 TMR2RL = ~val+1; // Init reload values
58 1 TMR2 = 0xffff; // set to reload immediately
59 1 ET2 = 1; // enable Timer2 interrupts
60 1 TR2 = 1; // 启动定时器2
61 1 }
62
63
64
65 //-----------------------------------------------------------------------------
66 // PWM初始化,PWM频率为12.5M/256=93.8KHz
67 //-----------------------------------------------------------------------------
68
69 void Pca_Init()
70 {
71 1 PCA0MD|=0x00; //PCA采用系统时钟24M,PCA溢出中断禁止
72 1 PCA0CN=0x40; //启动PCA计数器
73 1 PCA0CPM0=0x42; //CEX0为8位PWM输出模式
74 1 PCA0CPM1=0x42; //CEX1为8位PWM输出模式
75 1 }
76
77 //-----------------------------------------------------------------------------
78 // 小车运行方式设置
79 //-----------------------------------------------------------------------------
80 void Car_mode_set(uchar mode) //pwm1,pwm2的范围在0-255内
81 {
82 1 switch (mode)
83 1 {
84 2 case 1: P10=0;P11=1;P12=0;P13=1; break;
85 2 case 2: P10=1;P11=0;P12=1;P13=0; break;
86 2 case 3: P10=1;P11=1;P12=1;P13=1; break;
87 2 case 4: P10=1;P11=0;P12=0;P13=1; break;
88 2 default : break;
89 2 }
90 1 }
91
92 //-----------------------------------------------------------------------------
93 // PWM占空比设置
94 //-----------------------------------------------------------------------------
95 void Pwm_set(uchar pwm1,uchar pwm2) //pwm1,pwm2的范围在0-255内
96 {
97 1 PCA0CPH0=pwm1;
98 1 PCA0CPH1=pwm2;
99 1 }
100 //-----------------------------------------------------------------------------
101 // 数据初始化
102 //-----------------------------------------------------------------------------
103 void Data_Init() //pwm1,pwm2的范围在0-255内
104 {
105 1 P10=1;P11=0;P12=1;P13=0;
106 1 }
107
108 //-----------------------------------------------------------------------------
109 // 处理器配置
110 //-----------------------------------------------------------------------------
111
112 void config()
113 {
114 1 // uint i,j;
115 1 PCA0MD&=0x9f; //看门狗定时器被禁止
116 1 //用端口输入方式寄存器(PnMDIN)选择所有端口引脚输入方式
117 1 P0MDIN=0xff; // 0为模拟输入,1为数字输入
C51 COMPILER V7.20 CAR 04/16/2006 22:44:43 PAGE 3
118 1 P1MDIN=0xff;
119 1 // 用端口输出方式寄存器(PnMDOUT)选择所有端口引脚的输出方式(漏极开路或推挽)
120 1 P0MDOUT=0xc0; //1为推挽输出
121 1 P1MDOUT=0xff;
122 1 // 用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的那些引脚
123 1 P0SKIP=0x0f; // 1时对应交叉开关跳过
124 1 P1SKIP=0xff;
125 1 //将引脚分配给要使用的外设 ,使能交叉开关(XBARE = ‘1’)
126 1 XBR0=0x01; //XBR0.0=1:UART TX0, RX0连到端口引脚P0.4和P0.5。
127 1 XBR1=0xc2; //弱上拉禁止;交叉开关使能;:CEX0、CEX1连到端口引脚
128 1
129 1
130 1 // 晶振配置,开始采用内部晶振,等稳定后采用外部晶振
131 1 CLKSEL=0x00; //选择内部晶振
132 1 OSCICN=0x82; //内部H-F振荡器使能, SYSCLK为内部H-F频振荡器2分频 24.5/2=12.25MHz 2>>>0
133 1 /* OSCXCN=0x67; // 关闭 01100111 使能外部振荡器,晶体振荡器方式 24MHz
134 1 for (i=0;i<20;i++) // 等待至少1ms
135 1 {
136 1 for(j=0;j<200;j++);
137 1 }
138 1 while(!OSCXCN^7); //查询XTLVLD =>'1'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -