AD转换和步进电机

主要功能

1.使用ad转换模块,调节滑动变阻器输出实际电压值显示在数码管上。在步进电机正转时,根据输出的电压值调节步进电机转速。
2.使用按键S1 S2 S3 S4控制步进电机,其中S1控制步进电机正反转;S2长按步进电机暂停;S3按下步进电机反转时高速状态;S4按下步进电机反转时为低速状态。(反转时默认高速状态

main.c

#include"reg52.h"
#include"XPT2046.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P1^5;    sbit S1=P3^1;    //正反转
sbit S2=P3^0;    //暂停
sbit S3=P3^2;    //加速
sbit S4=P3^3;    //减速
u8 state=1;      //转向1正0反
u16 time=0;   //定义延时变量
u16 time1=80;   //定义延时变量
unsigned char code tableZ[8]={0x1,0x3,0x2,0x6,0x4,0xc,0x8,0x9};  //四相八拍正
unsigned char code tableF[8]={0x9,0x8,0xc,0x4,0x6,0x2,0x3,0x1};
u8 SMG_dat[8]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
u8 code SMG_duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******延时函数********/
void delay(u16 i)
{while(i--);
}
/*******处理电压数据函数*************/
void display_V()
{int temp=0;   //ad值int ad_value;unsigned int voltage_display = 0;float index = 1.222;float voltage = 0;static u8 i;if(i==50)                        //隔一段时间读取  {  i=0;EA=0;            //关中断ad_value =  Read_AD_Data(0x94);      //AIN0EA=1;            //开中断}voltage =  index * ad_value;temp = (int)voltage;time = temp/10;i++;SMG_dat[7]=0x3e;SMG_dat[6]=0x00;SMG_dat[5]=0x00;SMG_dat[4]=0x00;// SMG_dat[3]=0x00;
//  SMG_dat[2]=SMG_duanma[temp/1000]|0x80;
//  SMG_dat[1]=SMG_duanma[temp%1000/100];
//  SMG_dat[0]=SMG_duanma[temp%100/10];SMG_dat[3]=SMG_duanma[temp/1000]|0x80;SMG_dat[2]=SMG_duanma[temp%1000/100];SMG_dat[1]=SMG_duanma[temp%100/10];SMG_dat[0]=SMG_duanma[temp%10];
}/*******电机工作函数********/void motowork()
{ unsigned char i;P1 = 0x00;if(state==1){for(i=0; i<8; i++)  { P1 = tableZ[i]&0x1f;    delay(time);}}else {for(i=0; i<8; i++)  {P1 = tableF[i]&0x1f;    delay(time1);} }}/********按键功能函数*******/void keyS1(){if(state==1){state=0;}else if(state==0){state=1;}}void keyS2(){if(S2==0){P1 = 0x00;}}
void keyS3()
{if(time1==580)     //{   time1=80;}
}
void keyS4()
{if(time1==80){   time1=580;}
}/*************按键扫描函数************/
void scankey1()
{if(S1==0)          //检测按键K1是否按下{ delay(1000);   //消除抖动 一般大约10msif(S1==0)    //再次判断按键是否按下{keyS1();  //}while(!S1);   //检测按键是否松开}        if(S2==0)       { delay(1000); if(S2==0)     {keyS2(); }while(!S2); }   if(S3==0)       { delay(1000);  if(S3==0)    {keyS3();  }while(!S3);    }       if(S4==0)       { delay(1000);   if(S4==0)  {keyS4(); }while(!S4);   }  }
/********定时器*********/
void Timer0Init(void)         //1ms
{TMOD=0X01;  //定时器0  方式1TH0=(65535-1000)/256;TL0=(65535-1000)%256;  //装载初值ET0=1; //开启定时器中断使能EA=1;  //开启总中断TR0=1;
}void ServiceTimer0() interrupt 1
{   static unsigned char i = 0;TH0=(65535-1000)/256;TL0=(65535-1000)%256;      //重新P0 = 0x00;                                  //消隐switch(i)                                   //根据i的值进行位选,依次点亮八个数码管{case 0 :LSA = 0; LSB = 0; LSC = 0;i++; P0 = SMG_dat[0];break;case 1 :LSA = 1; LSB = 0; LSC = 0;i++; P0 = SMG_dat[1];break;case 2 :LSA = 0; LSB = 1; LSC = 0;i++; P0 = SMG_dat[2];break;case 3 :LSA = 1; LSB = 1; LSC = 0;i++; P0 = SMG_dat[3];break;case 4 :LSA = 0; LSB = 0; LSC = 1;i++; P0 = SMG_dat[4];break;case 5 :LSA = 1; LSB = 0; LSC = 1;i++; P0 = SMG_dat[5];break;case 6 :LSA = 0; LSB = 1; LSC = 1;i++; P0 = SMG_dat[6];break;case 7 :LSA = 1; LSB = 1; LSC = 1;i=0; P0 = SMG_dat[7];break;default:break;}}
/********主函数*********/
void main()
{beep = 0x00;Timer0Init();while(1){scankey1(); motowork();display_V();    //处理电压值}}

2.XPT2046.c

#include"XPT2046.h"/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/void SPI_Write(uchar dat)
{uchar i;CLK = 0;for(i=0; i<8; i++){DIN = dat >> 7;   //放置最高位dat <<= 1;CLK = 0;           //上升沿放置数据CLK = 1;}
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/uint SPI_Read(void)
{uint i, dat=0;CLK = 0;for(i=0; i<12; i++)      //接收12位数据{dat <<= 1;CLK = 1;CLK = 0;dat |= DOUT;}return dat;
}/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{uchar i;uint AD_Value;CLK = 0;CS  = 0;SPI_Write(cmd);for(i=6; i>0; i--);     //延时等待转换结果CLK = 1;   //发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_nop_();AD_Value=SPI_Read();CS = 1;return AD_Value;
}

3.XPT2046.h

#ifndef    __XPT2046_H_
#define   __XPT2046_H_//---包含头文件---//
#include<reg52.h>
#include<intrins.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint  unsigned int
#endif#ifndef ulong
#define ulong  unsigned long
#endif//---定义使用的IO口---//
sbit DOUT = P3^7;    //输出
sbit CLK  = P3^6;    //时钟
sbit DIN  = P3^4;    //输入
sbit CS   = P3^5;    //片选uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);#endif

问题总结

在使用软件延时方式控制步进电机时,数码管如果用软件延时那么数码管显示值会有轻微闪烁。
解决方法:数码管的显示延时利用定时器中断,这样可以避免步进电机延时对数码管显示的影响

普中科技开发板AD转换和步进电机相关推荐

  1. 普中科技开发板使用说明书_普中科技单片机实验板使用操作说明.pdf

    普中科技单片机实验板使用操作说明 单片机学习的良师益友 好帮手单片机学习套件 -PRECHIN 用手册 普中科技有限公司 P R E C H I N - V 2 . 0 开发板 Version 1.2 ...

  2. 普中科技开发板使用说明书_百度大脑加持,米尔科技FZ3深度学习计算卡评测

    如果你要问我现在电子产业什么最热,那无疑是AI,而基于大数据训练的深度学习技术可以说是目前AI应用的最广,最成功的产品形态了,覆盖我们生活的方方面面,诸如购物.看病.新闻编辑等,在这高深技术的背后少不 ...

  3. 【51单片机】:关于51单片机仿真器(普中科技开发板STC89C51)的疑惑(做个记录)

    学习目标: 由于一些特殊原因,重学51单片机,真是无力吐槽,学把,认真学.         仿真器,最主要的作用是仿真调试,每次检查代码找不到任何问题比如说debug.先全速运行几秒后点击停止,看程序 ...

  4. python控制51单片机的红绿灯_基于51单片机的红绿灯实现(使用普中科技开发板)...

    C语言基础比较薄弱,红绿灯的倒计时和切换上,用了三个if()嵌套,总感觉应该有更好的方案,如果你恰巧知道,请教教我,在此谢过.以下是程序部分: //红绿灯设计:利用定时器实现LED灯亮灭,数码管倒计时 ...

  5. 8路抢答器(普中科技开发板)

    #include <reg51.h> //#include <keyscan.h> //#include <display.h>#define uchar unsi ...

  6. 基于普中科技开发板制作的数码管显示可调时钟

    目录 前言: 模块化代码: 定时器扫描按键代码: 定时器扫描数码管: 主函数main代码: 前言: 功能说明:通过按键1控制模式选择:模式0------时钟显示模式,模式1:------时钟设置模式 ...

  7. 【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记

    使用74HC595芯片驱动LED点阵屏的使用笔记 1.控制显示LED点阵屏的思路 2.74HC595芯片的学习 2.1.74HC595芯片是什么? 2.2.74HC595芯片各引脚解释以及分析 2.3 ...

  8. 普中PZ6808L-F4开发板TFTLCD显示屏使用笔记

    0x00 开发板介绍 这学期学的STM32开发,实验室里的开发板型号为PZ6808L-F4 整个板子是这样的 这块板子是F103和F407双核的,但我学的一直就是F407,所以本文所有问题只针对F40 ...

  9. 普中单片机开发板HC6800-EM3 v2.2 3.0无法烧录下载程序解决

    普中科技单片机在淘宝上买了很久了,一直没用,现在要做设计,就拿来看看.这一看不要紧,刚开始就坑死人了写不进程序.研究了一晚上.其实很简单就是短路帽没接对. l 开发板:普中Prechin HC6800 ...

最新文章

  1. Unity脚本生成插件:Script Create Dialog
  2. online_judge_1046
  3. no scp yes 不提示_linux脚本实现scp命令自动输入密码和yes/no等确认信息
  4. Android 代码优化工具FindBugs
  5. R+python︱XGBoost极端梯度上升以及forecastxgb(预测)+xgboost(回归)双案例解读
  6. 吴恩达机器学习作业代码(python)
  7. 沉筛得招牢蛹得客频冉酶厍笨频涸
  8. 51NOD - 1381 1381 硬币游戏【思维+数学期望】
  9. 推荐一款2.5v 基准 电压源 芯片
  10. bootstrap导航栏.nav和.navbar区别
  11. 开源中国众包第三波阿里云悬赏项目,总金额 6 万
  12. 轻松解决mscorsvw.exe进程CPU占用高的问题
  13. php curl 客户端,php通过curl设置客户端cookie
  14. 彻底解决win10时间同步失败
  15. Windows下字符串替换操作java.lang.IllegalArgumentException: character to be escaped is missing
  16. JAVA 中配置IKAnalyzer扩展词库和停止词库
  17. Linux中suid提权
  18. C++ std::mutex 用法详解
  19. java基础巩固-宇宙第一AiYWM:为了维持生计,Spring全家桶_Part1-1(Spring左膀右臂中的左膀IOC第一篇~全是概念,Spring为啥辣么6)~整起
  20. Steam教育在新时代中综合学习论

热门文章

  1. 《Exceptional C++ Style》开放样章译稿
  2. ieee计算机论文格式,[计算机]小论文撰写格式.doc
  3. mac和window电脑 解决github打不开问题
  4. 2017年第27届中国国际钓鱼用品贸易展览会会刊(参展商名录)
  5. Error: EPERM: operation not permitted(权限问题 errro permit)
  6. 黑苹果2k显示器开启hidpi_黑苹果MAC系统1080P显示模糊问题处理
  7. 共赴数智金融未来,2023数智金融峰会即将召开
  8. 数据推荐 | 手势识别训练数据集
  9. IMS应用领域|IMS连接器系统使自动驾驶成为可能
  10. iphonex桌面的计算机不见了,iPhone 桌面上找不到应用图标了怎么办?