/***定时器0 定时器2波特率发生器 AD转换***/
/***程序测试 2021 3 19*******************/
#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include "stdio.h"
#include <stdlib.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define uint unsigned int
#define uchar unsigned char
sfr P1ASF=0x9D; //P1口第2功能控制寄存器
uint ADvalue_x,ADvalue_y; //存放AD转换返回的结果
#define ADC_SPEEDLL 0x00 //540个时钟
sbit INTPUT3=P1^4; //X轴速度刷新
sbit INTPUT4=P1^5; //Y轴速度刷新
sbit INTPUT1=P5^4; //X轴启动
sbit INTPUT2=P5^5; //Y轴启动
sbit OUT1=P3^2;
sbit OUT2=P3^3;
sbit P_WM1=P3^6; //
sbit P_WM2=P3^7; //
bit timeflag; /****/
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uint vala,valb,aa; /**/
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) //1T模式
#define BAUD 9600 //串口波特率
#define uint unsigned int
#define uchar unsigned char
uint vala,val,aa; /**/
bit MOTORX_RUN; //X轴启动标志
bit MOTORY_RUN; //Y轴启动标志
bit MotorX_LowFlag; //电机X轴低电平计数标志
bit MotorY_LowFlag; //电机Y轴低电平计数标志
uint MotorX_LowCounter; //电机X轴低电平计数器
uint MotorX_HighCounter; //电机X轴高电平计数器
uint MotorY_LowCounter; //电机X轴低电平计数器
uint MotorY_HighCounter; //电机X轴高电平计数器
/*---------------延时子程序----------------*/
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<2000;j++)
;
}
/*---------------延时子程序----------------*/
void delay (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<10;j++)
;
}
/*************关所有输出*******************************/
void reset_io()
{
P_WM1=1;
P_WM2=1;
INTPUT1=1; //
INTPUT2=1; //
P1M0=0X00;
P1M1=0X00;
P2M0=0X00;
P2M1=0X00;
P3M0=0X00;
P3M1=0X00;
P5M0=0X00;
P5M1=0X00;
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
delay(5); //延时
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
delay(5); //延时
}
/*****************************************/
unsigned int ADC_P10() //
{
uint i;
uchar status=0; //AD转换结束标志
uint AD_Dat=0; //10位AD转换值
ADC_CONTR|=0X80; //打开ADC转换电源,第一次使用时要打开内部电源
for(i=0;i<10000;i++) //等待电源稳定1ms
P1ASF|=0X00; //0000 0000
ADC_CONTR=0XE0; //1110 0000 通道P1.0
for(i=0;i<1000;i++) //如果多通道测量,更换通道后延时200us
ADC_CONTR|=0X08; //启动AD转换 0000 1000ADC_START
while(status==0) //等待AD转换结束
{
status=ADC_CONTR&0X10; //判断ADC_FLAG是否等于1,
}
ADC_CONTR&=0XE7; //将ADC_FLAG清零
AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03); //
return AD_Dat; //
}
/*****************************************/
unsigned int ADC_P11() //
{
uint i;
uchar status=0; //AD转换结束标志
uint AD_Dat=0; //10位AD转换值
ADC_CONTR|=0X80; //打开ADC转换电源,第一次使用时要打开内部电源
for(i=0;i<10000;i++) //等待电源稳定1ms
P1ASF|=0X01; //0000 0001
ADC_CONTR=0XE1; //1110 0001 BIT 7电源 6 5速度90个时钟 001 P1.1
for(i=0;i<1000;i++) //如果多通道测量,更换通道后延时200us
ADC_CONTR|=0X08; //启动AD转换
while(status==0) //等待AD转换结束
{
status=ADC_CONTR&0X10; //判断ADC_FLAG是否等于1,
}
ADC_CONTR&=0XE7; //将ADC_FLAG清零
AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03); //
return AD_Dat; //
}
/*********************************/
void tm0_isr() interrupt 1
{
val++;
if(val>10)
{
val=0;
OUT1=~OUT1;
}
//X轴电机高低电平切换
if(MOTORX_RUN==1) //X轴电机开启标志
{
P_WM1=0; //开X轴输出
if(MotorX_LowFlag==1) //低电平计数标志等于1
{
MotorX_LowCounter++;
if(MotorX_LowCounter>=ADvalue_x)//
{
MotorX_LowFlag=0; //低电平计数标志等于0高电平开始计数
MotorX_HighCounter=102-ADvalue_x;//赋高电平占空比值
}
}
else
{
P_WM1=1; //关X轴输出
MotorX_HighCounter++;
if(MotorX_HighCounter>=ADvalue_x)//
{
MotorX_LowFlag=1; //低电平计数标志等于1低电平开始计数
MotorX_LowCounter=ADvalue_x; //低电平计数器
}
}
}
//Y轴电机高低电平切换
if(MOTORY_RUN==1) //X轴电机开启标志
{
P_WM2=0; //开Y轴输出
if(MotorY_LowFlag==1) //低电平计数标志等于1
{
MotorY_LowCounter++;
if(MotorY_LowCounter>=ADvalue_y)//
{
MotorY_LowFlag=0; //低电平计数标志等于0高电平开始计数
MotorY_HighCounter=102-ADvalue_y;//赋高电平占空比值
}
}
else
{
P_WM2=1; //关Y轴输出
MotorY_HighCounter++;
if(MotorY_HighCounter>=ADvalue_y)//
{
MotorY_LowFlag=1; //低电平计数标志等于1低电平开始计数
MotorY_LowCounter=ADvalue_y; //
}
}
}
}
/*------------定时器2中断---------------------*/
void t2int() interrupt 12 //中断入口
{
vala++;
if(vala>100)
{
vala=0;
OUT2=~OUT2; //将测试口取反
}
}
/*------------初始化串口---------------------*/
void InitUart()
{
T2L=(65536-(FOSC/4/BAUD)); //设置波特率重装值
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0x14; //T2为1T模式, 并启动定时器2
IE2=0x01; //使能串口2中断
}
/*********************************/
void main()
{
reset_io();
AUXR|=0x04; //定时器2为1T模式
vala=0;
valb=0;
aa=0;
InitUart(); //初始化串口
TMOD|=0x00; //设置定时器为模式0(16位自动重装载)
TL0=T1MS; //初始化计时值
TH0=T1MS>>8;
TR0=1; //定时器0开始计时
ET0=1; //使能定时器0中断
EA=1;
delay1(100);
printf("xff\xff\xff");
while (1)
{
delay1(10);
/***************低电平X轴启动*************/
RstKey(); //按键复位
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
MOTORX_RUN=1; //X轴启动启动标志
MotorX_LowCounter=ADvalue_x;
MotorX_LowFlag=1; //定时器启动先发低电平 标志置1,内部循环切换
}
/***************高电平X轴停止*************/
RstKey(); //按键复位
if(MOTORX_RUN==1)
{
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT1) //按键高电平
{
LowVoltKey();
}
else if(!INTPUT1) //按键低电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
MOTORX_RUN=0; //X轴启动启动标志
}
}
/***************Y轴启动************/
RstKey(); //按键复位
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT2) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT2) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
MOTORY_RUN=1;
MotorY_LowCounter=ADvalue_y; //
MotorY_LowFlag=1; //定时器启动先发低电平 标志置1,内部循环切换
}
/***************高电平Y轴停止*************/
RstKey();
if(MOTORY_RUN==1)
{ //按键复位
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT2) //按键高电平
{
LowVoltKey();
}
else if(!INTPUT2) //按键低电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
MOTORY_RUN=0; //Y轴启动启动标志
}
}
/***************更新X轴电机速度***********************/
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT3) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT3) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
ADvalue_x=ADC_P10()/10; //
printf("n1.val=%d\xff\xff\xff",ADvalue_x); //
}
/***************更新Y轴电机速度***********************/
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT4) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT4) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
ADvalue_y=ADC_P11()/10; //
printf("n1.val=%d\xff\xff\xff",ADvalue_y); //
}
/**************************************/
}
} //L344 CODE 2018