/***定时器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

定时器0 定时器2波特率发生器 AD转换相关推荐

  1. 51单片机定时器2做串口波特率发生器

    利用定时器计数器2作为串口波特率发生器(reg52.h文件缺少对T2CON的定义,需自己定义,在reg52.h头文件加sfr T2CON = 0xC8;). 程序如下: #include " ...

  2. AVR单片机 实验六 AD转换应用实验

    AVR单片机 实验六 AD转换应用实验 1 实验目的 通过实验,了解AVR单片机模数转换器的初始化,及以定时器自动触发AD转换的方法和工作原理. 2 实验内容 (1) 调整可变电阻, 以获取模拟电压输 ...

  3. s5pv210——AD转换

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考博客http://www.cnblogs.com/biaohc/p/6286569.html 一.ADC的主要相关概念 1.量程(模拟量 ...

  4. 【STC15】定时器2模式0作为波特率发生器示例程序

    [STC15]定时器2模式0作为波特率发生器示例程序 在此期间使用自制的STC开发板STC15W408AS和STC15F2K60S2分别测试了定时器2和定时器1作为波特率发生器,STC15F2K60S ...

  5. stc15f2k60f2单片机定时器_STC15F2系列单片机UART1使用定时器1做波特率发生器

    #include #include "main.h" #include "intrins.h" //使用T2定时器2 ,控制串口1 波特率 #define  F ...

  6. 单片机 STC15W204S-35I SOP16 - UART,模式 1,使用定时器 2 作为波特率发生器

    文章目录 UART 原理图 模式 1 下载.测试 参考 UART 原理图 模式 1 配置: 1 个起始位, 8 位数据, 1 个停止位: 使用定时器 2 作为波特率发生器: 允许接收.发送请求中断: ...

  7. 实例7:stc8a8k定时器0,定时50ms,进入中断之后,加数20次到1秒,计算时间。

    一.实验目的 1.熟悉定时器T0的使用: 2.按下按键KEY1,开始计时间,在OLED显示时间: 3.熟悉中断的作用: 二.实验设备 stc8a开发板: OLED屏幕,4脚OLED: 下载器: 三.实 ...

  8. 利用定时器0工作方式1——独立按键控制流水灯模式

    目录 1.前言 1.1 项目资源 1.2 实验现象 2.定时器/计数器 2.1定时器/计数器0&1的相关寄存器 2.2定时器的工作方式(总结) 3.中断系统 3.1中断概念 3.2中断流程: ...

  9. 正弦波发生器(4-99Hz,AD转换)

    正弦波发生装置 介绍 总体方案及设计思路 硬件框图 软件流程图 MATLAB采样量化编码程序 TLC5615传输程序 测试结果 原理图 整体程序 介绍 通过按键调整输出正弦波频率的大小,最小单位为1H ...

最新文章

  1. PostgreSQL非交互式键入密码
  2. DCT算法的原理及实现简介
  3. Animated Eye Candy for Programmers
  4. 计算a[0]*a[1]*...*a[n-1]/a[i]
  5. 《javaScript100例|03》自写javaScript+CSS轮显效果
  6. overflowhidden把内容遮住了怎么办_图片有水印怎么办?不用PS,有这4招就够了!...
  7. 用代码证明自己闲的蛋疼(三)——回溯法做数独
  8. python远程备份mysql_python远程备份mysql并压缩
  9. ofo 银行账户冻结;12306 事件嫌疑人被捕;京东刘强东放权二把手 | 极客头条
  10. Linux基础之while语句
  11. Redis详解(六)——Redis主从同步原理与配置
  12. “吃神么,买神么”的第一个Sprint计划(第三天)
  13. mysql学习之mysql集群
  14. (转)protein 数据库
  15. 大宗商品交易挂接银行的几个问题?
  16. 增加收入的 6 种方式
  17. 美团网手机客户端产品分析
  18. 图片处理-----毛玻璃效果
  19. AutoCAD2018打印eps文件
  20. 使用反向代理给 PPA 加速

热门文章

  1. fk算法绘制层状介质理论地震图
  2. 使用FlatBuffers序列化数据
  3. 关于大家下载我的上传资源问题
  4. 经验分享:如何系统学习 Web 前端技术?
  5. 图像对齐(图像配准)方法记录
  6. 区块链技术应用大盘点(涵盖金融、医疗、政务等领域)
  7. 【开餐馆】 动态规划
  8. 什么是项目生命周期?如何划分项目阶段?有什么意义?
  9. ARGB1555内部存储空间的大小与ARGB转换方式
  10. proxmox 控制台无法连接_Proxmox VE网络配置