定时器0 定时器2波特率发生器 AD转换
/***定时器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转换相关推荐
- 51单片机定时器2做串口波特率发生器
利用定时器计数器2作为串口波特率发生器(reg52.h文件缺少对T2CON的定义,需自己定义,在reg52.h头文件加sfr T2CON = 0xC8;). 程序如下: #include " ...
- AVR单片机 实验六 AD转换应用实验
AVR单片机 实验六 AD转换应用实验 1 实验目的 通过实验,了解AVR单片机模数转换器的初始化,及以定时器自动触发AD转换的方法和工作原理. 2 实验内容 (1) 调整可变电阻, 以获取模拟电压输 ...
- s5pv210——AD转换
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考博客http://www.cnblogs.com/biaohc/p/6286569.html 一.ADC的主要相关概念 1.量程(模拟量 ...
- 【STC15】定时器2模式0作为波特率发生器示例程序
[STC15]定时器2模式0作为波特率发生器示例程序 在此期间使用自制的STC开发板STC15W408AS和STC15F2K60S2分别测试了定时器2和定时器1作为波特率发生器,STC15F2K60S ...
- stc15f2k60f2单片机定时器_STC15F2系列单片机UART1使用定时器1做波特率发生器
#include #include "main.h" #include "intrins.h" //使用T2定时器2 ,控制串口1 波特率 #define F ...
- 单片机 STC15W204S-35I SOP16 - UART,模式 1,使用定时器 2 作为波特率发生器
文章目录 UART 原理图 模式 1 下载.测试 参考 UART 原理图 模式 1 配置: 1 个起始位, 8 位数据, 1 个停止位: 使用定时器 2 作为波特率发生器: 允许接收.发送请求中断: ...
- 实例7:stc8a8k定时器0,定时50ms,进入中断之后,加数20次到1秒,计算时间。
一.实验目的 1.熟悉定时器T0的使用: 2.按下按键KEY1,开始计时间,在OLED显示时间: 3.熟悉中断的作用: 二.实验设备 stc8a开发板: OLED屏幕,4脚OLED: 下载器: 三.实 ...
- 利用定时器0工作方式1——独立按键控制流水灯模式
目录 1.前言 1.1 项目资源 1.2 实验现象 2.定时器/计数器 2.1定时器/计数器0&1的相关寄存器 2.2定时器的工作方式(总结) 3.中断系统 3.1中断概念 3.2中断流程: ...
- 正弦波发生器(4-99Hz,AD转换)
正弦波发生装置 介绍 总体方案及设计思路 硬件框图 软件流程图 MATLAB采样量化编码程序 TLC5615传输程序 测试结果 原理图 整体程序 介绍 通过按键调整输出正弦波频率的大小,最小单位为1H ...
最新文章
- PostgreSQL非交互式键入密码
- DCT算法的原理及实现简介
- Animated Eye Candy for Programmers
- 计算a[0]*a[1]*...*a[n-1]/a[i]
- 《javaScript100例|03》自写javaScript+CSS轮显效果
- overflowhidden把内容遮住了怎么办_图片有水印怎么办?不用PS,有这4招就够了!...
- 用代码证明自己闲的蛋疼(三)——回溯法做数独
- python远程备份mysql_python远程备份mysql并压缩
- ofo 银行账户冻结;12306 事件嫌疑人被捕;京东刘强东放权二把手 | 极客头条
- Linux基础之while语句
- Redis详解(六)——Redis主从同步原理与配置
- “吃神么,买神么”的第一个Sprint计划(第三天)
- mysql学习之mysql集群
- (转)protein 数据库
- 大宗商品交易挂接银行的几个问题?
- 增加收入的 6 种方式
- 美团网手机客户端产品分析
- 图片处理-----毛玻璃效果
- AutoCAD2018打印eps文件
- 使用反向代理给 PPA 加速