/***触摸屏下位机测试直流电机速度 读P1.0 P1.1ADpast***/
/***STC15W404AS 板L331 CODE2251 2021 1 5显示0----102*/
/***STC ADC_CONTR寄存器 调节电位器按下按键速度改变***/
/***bit 7 ADC POWER 启动AD=0***********/
/***bit 6 SPEED1**(1 1) 90个时钟***(1 0)180个时钟*****/
/***bit 5 SPEED0**(0 1)360个时钟***(0 0)540个时钟*****/
/***bit 4 ADC FLAG*=1 转换结束标志位,软件清零*********/
/***bit 3 ADC START*=1开始转换,结束后转0**************/
/***bit 2 CHS2**000 001 010 011***P1.0**********/
/***bit 1 CHS1**100 101 110 111***P1.7**********/
/***bit 0 CHS0************SOP16 封装 ***/
/*P1.1 P1.0 P3.7 P3.6 P3.3 P3.2 P3.1 P3.0*******/
/*P1.2 P1.3 P1.4 P1.5 P5.4 VCC P5.5 GND********/
#include <REG52.H>
#include <intrins.h>
#include <string.h>
#include "stdio.h"
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
sfr P1ASF=0x9D; //P1口第2功能控制寄存器
uint ADvalue_x,ADvalue_y; //存放AD转换返回的结果
#define ADC_SPEEDLL 0x00 //540个时钟
uint aa=0; /****RUN FLAG****/
sbit INTPUT1=P5^4;
sbit INTPUT2=P5^5;
sbit INTPUT3=P1^4;
sbit INTPUT4=P1^5;
sbit OUT1=P3^2;
sbit OUT2=P3^3;
sbit P_WM1=P3^6; //
sbit P_WM2=P3^7; //
uint SPEED; //速度
uint ZERO=0; //
uint Ad_data;
uchar i; //循环总变量i
bit Receive_Flag;
bit Read_Flag; //定时器计数读AD标志
bit MOTORRUN;
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uint a[10]; //定义数组a 存储串口数据串
/*---------------延时子程序----------------*/
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; //
}
/****************按键计数器状态寄存器归零*************/
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|=0X02; //0000 0010
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 MOTFORWARD()
{
MOTORRUN=1;
printf("n0.val=%d\xff\xff\xff",SPEED); //电机速度
while(MOTORRUN) //电机循环标志,串口停机中断
{
if(!INTPUT3) //功能键
{
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT3) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT3) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
ADvalue_x=ADC_P10()/10; //
printf("n0.val=%d\xff\xff\xff",ADvalue_x); //电机速度
SPEED=ADvalue_x;
}
}
P_WM1=0;
delay(SPEED);
P_WM1=1;
delay(102-SPEED);
}
printf("n0.val=%d\xff\xff\xff",ZERO); //电机速度
}
/*****************/
void MOTBACK()
{
MOTORRUN=1;
printf("n0.val=%d\xff\xff\xff",SPEED); //电机速度
while(MOTORRUN) //电机循环标志,串口停机中断
{
if(!INTPUT4) //功能键
{
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); //电机速度
SPEED=ADvalue_y;
}
}
P_WM2=0;
delay(SPEED);
P_WM2=1;
delay(102-SPEED);
}
printf("n0.val=%d\xff\xff\xff",ZERO); //电机速度
}
/*------------初始化串口---------------------*/
void InitUart()
{
SCON=0X50; //8位数据,可变波特率
AUXR|=0x01; //串口1选择定时器2为波特率发生器
AUXR|=0X04; //定时器2时钟为Fosc,即1T
T2L=0XE0; //设置定时器处置 110592》9600
T2H=0XFE; //设置定时器处置 110592》9600
AUXR|=0X10; //启动定时器2
TI=1;
ES=1; //
EA=1;
}
/**************定时中断*************************/
void timer0() interrupt 1
{
TH0=0X53;
TL0=0X32;
aa++;
if(aa>=300)
{
ADvalue_y=ADC_P11()/10; //
ADvalue_x=ADC_P10()/10; //
OUT1=~OUT1;
aa=0;
Read_Flag=1; //计数器计数300,读AD一次
}
}
/*×--------UART 中断服务程序-------------------**/
/**×**把接收到的数据存进数组a[i]**i开机初始化****/
/***×*接收到触摸屏结束码Receive_Flag标志位置1****/
/****×主程序检测到标志码=1判断指令功能***********/
void Uart() interrupt 4 using 1
{
if(RI)
{
if(SBUF==0XFA) //触摸屏结束码
{
Receive_Flag=1; //接收数据标志置一
RI=0; //
i=0; //数组计数器归零
}
else
{
a[i]=SBUF; //数组下标位置的数据等于SBUF
RI=0; //
i++;
}
}
if(Receive_Flag==1) //设备停止 退出循环
{
if(a[0]==0XE0) //
{
if(a[1]==0X04) //关电机输出
{
MOTORRUN=0; //电机输出
Receive_Flag=1; //接收数据标志置一
i=0; //串口计数器归零
}
}
}
}
/*************************************************/
void main( ) /*主程序开始*/
{
reset_io();
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01;
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
TH0=0X53;
TL0=0X32;
ET0=1;
TR0=1;
Receive_Flag=0;
InitUart(); //初始化串口
printf("0XFF,0XFF,0XFF");
i=0; //数据接收计数器等于0
MOTORRUN=0;
Read_Flag=0; //读AD标志置零
while(1) //INTPUT1
{
delay1(10);
/***************开机键检测*************/
RstKey(); //按键复位
if(!INTPUT1) //功能键
{
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
TR0=0;
SPEED=ADvalue_x;
MOTFORWARD(); //前进
}
}
/**************************************/
RstKey(); //按键复位
if(!INTPUT2) //功能键
{
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT2) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT2) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
TR0=0;
SPEED=ADvalue_y;
MOTBACK(); //后退
}
}
/**************************************/
if(Read_Flag==1) //定时器AD值刷新标志
{
ADvalue_x=ADC_P10()/10; //
printf("n0.val=%d\xff\xff\xff",ADvalue_y); //电机速度
ADvalue_y=ADC_P11()/10; //
printf("n1.val=%d\xff\xff\xff",ADvalue_x); //电机速度
Read_Flag=0; //读AD标志置零
}
}
} //L331 CODE 2251 2021 2 7
触摸屏下位机测试直流电机速度 读P1.0 P1.1AD
最新推荐文章于 2024-05-02 23:57:59 发布