长春工业大学本科毕业设计(论文)
定时器1的工作方式为方式1
TH0=(65536-1500)/256; //求模定时器0初值为1.5mS中断 18.432M时TH0=0xfa,TL0=0x00
TL0=(65536-1500)%6; //求余
ET0=1; //开定时器0中断 TR0=1; //启动定时器0
TH1=0xfc; //定时器1为1mS中断 18.432M时TH1=0xfd,TL1=0x75
TL1=0x18; ET1=1; TR1=1; TH2 = 0xb1; TL2 = 0xe0; RCAP2H = 0xb1; RCAP2L = 0xe0; T2CON = 0x04;
ET2=1; TR2=1; EX0=1; IT0=1; EA=1; }
void exint0() interrupt 0 {
if(csbz==1) {
l298a=1; l298b=1; l298c=0;
EX0=0; zdbz=1; P36=0; } }
//
//开定时器1中断 //启动定时器1 //T2是20ms定时器 //开定时器2中断 //开定时器2中断 //允许外部中断0中断 //低电平中断 //开总中断 //外部中断0,作用是终点线判别 //终点测试标志 //电机正传 //停止电机 //禁止外部中断0中断 //终点标志 32
长春工业大学本科毕业设计(论文)
void timer0() interrupt 1 using 1 //定时器0中断服务程序 定时器0与定时器2负责舵机控制 {
TR0=0; //关闭定时器0 duoji=0; //舵机控制口 TH0=(65536-pluse)/256; //求模 TL0=(65536-pluse)%6; //求余 }
void timer1() interrupt 3 using 2 //定时器1中断服务程序 负责pwm调速 {
TH1=0xfc; //定时器1为1mS中断 18.432M时TH1=0xfd,TL1=0x75
TL1=0x18; //
zdjsq1++; //中断次数计数器+1 zdjsq2++; //中断次数计数器+1 if(zdjsq1<=pwma) {
l298c=1; //电机转动 } else {
l298c=0; }
if(zdjsq1>10) zdjsq1=0; }
void timer2(void) interrupt 5 using 3 //定时器2中断服务程序 定时器0与定时器2负责舵机控制 {
duoji=1; //舵机控制口 TF2=0;
TR0=1; //启动定时器0 }
33
长春工业大学本科毕业设计(论文)
//************************************************************************
// A/D转换测试程序
//************************************************************************
//AT89C/LE516AD 系列 MCU 的 A/D 转换功能。 时钟 11.0592MHz //转换结果以 16 进制形式输出到串行口,可以用串行口调试程序观察输出结果。
uchar get_AD_result(uchar channel) //channel=选择 A/D 当前通道 {
uchar AD_finished = 0; // 存储 A/D 转换标志 ADC_DATA = 0;
ADC_CONTR = channel; //选择 A/D 当前通道 delay5ms(); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADC_START = 1, 启动A/D转换 AD_finished = 0;
while ( AD_finished == 0 ) //等待A/D转换结束 {
AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1 测试A/D转换结束否 }
ADC_CONTR &= 0xF7; //1111,0111 令 ADC_START = 0, 关闭A/D转换,
return (ADC_DATA); // 返回 A/D 转换结果高8位 }
void main() {
uchar adsj0,adsj1,adsj2; uint adsj3;
P1 = P1 | 0x07; // 0000,0111,要设置为 A/D 转换的P1.0和P1.1口,先设为高 //?????????????????
34
长春工业大学本科毕业设计(论文)
P1_ADC_EN = 0x07; // 0000,0111, P1 的P1.0,P1.1设置为 A/D 转换输入脚 //?????????????????
// 断开P1.0,P1.1内部上拉电阻 begin(); //定时器初始化程序
while(zdjsq2!=2000) //开机延时=2秒 {
zdjsq1=0; }
zdjsq2=0;
while(1) {
adsj0=get_AD_result(0); if(adsj0>=50) {
pluse=1350; } pwma=5;
l298a=1; l298b=0; /* else {
if(adsj0>=40) { pwma=9; } else {
if(adsj0>=30) { pwma=8; } else
//????????????? //P1.0 为 A/D 当前通道, 测量结果 //电机正传 35
长春工业大学本科毕业设计(论文)
{
if(adsj0>=20) { pwma=7; } else {
if(adsj0>=10) { pwma=6; } else { pwma=5; } } } }
} */
adsj1=get_AD_result(1); //P1.1 为 A/D 当前通道, 测量结果 左侧传感器
if(adsj1>adsj0) //右侧传感器值大,偏左 {
if(adsj1>30) {
pluse=1100; //舵机右转 } else {
pluse=1350-(adsj1*8); }
zhuanwanbz=1; //转弯标志=1右转 }
adsj2=get_AD_result(2); //P1.2 为 A/D 当前通道, 测量结果
36