51单片机 PWM电位器控制舵机

合集下载

电位器控制舵机

电位器控制舵机

电位器控制舵机章节一:引言电位器是一种可以调整电阻值的电子元件,而舵机是一种常用于控制机械臂、车辆舵轮等运动装置的电机。

本文旨在研究如何利用电位器来控制舵机的运动方向与角度。

首先,通过分析舵机的工作原理和电位器的特性,可以了解它们之间的关联性。

其次,本文将探讨如何设计电路以及调整电位器的参数,以实现对舵机的精确控制。

最后,我们将通过实验验证本文提出的方法的有效性和可行性。

章节二:舵机和电位器的工作原理和特性舵机是一种可以实现精确角度控制的电机。

它通常由电机、减速齿轮、角度传感器和控制电路组成。

其中,控制电路通过接收输入的控制信号,将电机旋转到目标角度。

角度传感器可以用编码器或者霍尔传感器实现角度的反馈,从而确保舵机的精准控制。

电位器是一种调整电阻值的元件。

它由一个固定的导电材料和一个滑动片组成。

当滑动片在导电材料上移动时,电阻值会随之改变。

电位器的特性是有一个固定的阻值范围和一个可调节的滑动范围。

章节三:电位器控制舵机的设计与实现为了实现电位器对舵机的控制,我们需要设计一个电路来接收电位器的输出信号并将其转化为舵机的控制信号。

一种常用的电路设计是使用运放作为信号放大器,通过调节运放的增益来实现对舵机角度的精确控制。

实际实现时,我们需要根据舵机的输入信号范围和滑动片的位置范围来调整电位器的阻值范围。

这样可以确保电位器的输出信号在合适的范围内,可以被电路正确解读。

另外,还需要根据具体的应用场景来调整电位器的滑动范围,以确保舵机的运动角度符合要求。

章节四:实验验证与结果分析在本章中,我们将通过实验来验证电位器对舵机的控制效果。

首先,我们将搭建一个电路实验平台,包括电位器、运放和舵机。

接下来,我们将通过调节电位器的滑动片位置,观察舵机的运动情况。

最后,我们将分析实验结果,并与理论设计进行比较。

实验结果显示,我们设计的电路可以有效地将电位器的输出信号转换为舵机的控制信号,并实现舵机的精确控制。

在不同的滑动片位置下,舵机可以准确地转动到相应的角度。

51系列单片机输出PWM的两种方法

51系列单片机输出PWM的两种方法

51系列单片机输出PWM的两种方法PWM(Pulse Width Modulation,脉宽调制)是一种常用的调制技术,通过改变信号的脉宽来控制输出电平的占空比。

在51系列的单片机中,常用的PWM输出方式有基于定时/计数器和软件实现两种方法。

一、基于定时/计数器的PWM输出方法:在51系列单片机中,内部有多个定时/计数器可用于实现PWM输出。

这些定时/计数器包括可编程定时/计数器T0、T1、T2和看门狗定时器。

1.T0定时/计数器:T0定时/计数器是最简单和最常用的PWM输出方式之一、通过配置T0定时/计数器的工作模式和重装值来实现PWM输出。

具体步骤如下:(1)选择T0的工作模式:将定时/计数器T0设置为工作在16位定时器模式,并使能PWM输出。

(2)设置T0的重装值:通过设定T0的装载值来定义PWM输出的周期。

(3)设置T0的计数初值:通过设定T0的计数初值来定义PWM输出的脉宽。

(4)启动T0定时/计数器:开启T0定时/计数器的时钟源,使其开始计数。

2.T1定时/计数器:T1定时/计数器相对于T0定时/计数器来说更加灵活,它具有更多的工作模式和功能,可以实现更复杂的PWM输出。

与T0定时/计数器类似,通过配置T1的工作模式、装载值和计数初值来实现PWM输出。

3.T2定时/计数器:T2定时/计数器在51系列单片机中的应用较少,但也可以用于实现PWM输出。

与T0和T1不同,T2定时/计数器没有独立的PWM输出功能,需要结合外部中断请求(INT)来实现PWM输出。

二、软件实现PWM输出方法:在51系列单片机中,除了利用定时/计数器来实现PWM输出外,还可以通过软件来实现PWM输出。

软件实现PWM的核心思想是利用延时控制来生成不同占空比的方波信号。

软件实现PWM输出的步骤如下:(1)设置IO口:选择一个适合的IO口,将其设置为输出模式。

(2)生成PWM信号:根据要求的PWM占空比,通过控制IO口的高低电平和延时的时间来生成PWM方波信号。

基于单片机89C51产生PWM信号来控制直流电机调速程序

基于单片机89C51产生PWM信号来控制直流电机调速程序

基于单片机89C51产生PWM信号来控制直流电机调速程序利用2051的T0产生双路PWM信号,推动L293D或L298N为直流电机调速,程序已通过调试。

/* =======直流电机的PWM速度控制程序======== */ /* 晶振采用11.0592M,产生的PWM的频率约为91Hz */#include#include#define uchar unsigned char#define uint unsigned intsbit en1=P1^0; /* L298的Enable A */sbit en2=P1^1; /* L298的Enable B */sbit s1=P1^2; /* L298的Input 1 */sbit s2=P1^3; /* L298的Input 2 */sbit s3=P1^4; /* L298的Input 3 */sbit s4=P1^5; /* L298的Input 4 */uchar t=0; /* 中断计数器 */uchar m1=0; /* 电机1速度值 */uchar m2=0; /* 电机2速度值 */uchar tmp1,tmp2; /* 电机当前速度值 *//* 电机控制函数 index-电机号(1,2); speed-电机速度(-100~100) */void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) /* 电机1的处理 */{m1=abs(speed); /* 取速度的绝对值 */if(speed<0) /* 速度值为负则反转 */{s1=0;s2=1;}else /* 不为负数则正转 */{s1=1;s2=0;}}if(index==2) /* 电机2的处理 */{m2=abs(speed); /* 电机2的速度控制 */ if(speed<0) /* 电机2的方向控制 */ {s3=0;s4=1;}else{s3=1;s4=0;}}}}void delay(uint j) /* 延时函数 */{for(j;j>0;j--);}void main(){uchar i;TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值 */TL0=0x9B;EA=1; /* 开中断 */ET0=1; /* 定时器0允许中断 */TR0=1; /* 启动定时器0 */while(1) /* 电机实际控制演示 */{for(i=0;i<=100;i++) /* 正转加速 */{motor(1,i);motor(2,i);delay(5000);}for(i=100;i>0;i--) /* 正转减速 */{motor(1,i);motor(2,i);delay(5000);}for(i=0;i<=100;i++) /* 反转加速 */{motor(1,-i);motor(2,-i);delay(5000);}for(i=100;i>0;i--) /* 反转减速 */{motor(1,-i);motor(2,-i);delay(5000);}}}void timer0() interrupt 1 /* T0中断服务程序 */{if(t==0) /* 1个PWM周期完成后才会接受新数值 */ {tmp1=m1;tmp2=m2;}if(tif(tt++;if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */ }。

51单片机控制直流电机PWM调速

51单片机控制直流电机PWM调速

51单片机控制直流电机PWM调速
实验目的
1.掌握脉宽调制(PWM) 的方法。

2.用程序实现脉宽调制,并对直流电机进行调速控制。

实验设备
PC 机一台,单片机最小系统,驱动板、直流电机,连接导线等
实验原理
1.PWM (Pulse Width Modulation) 简称脉宽调制。

即,通过改变输出脉冲
的占空比,实现对直流电机进行调压调速控制。

2.实验线路图:
实验内容:
1. 利用实验室提供的单片机应用系统及直流电机驱动电路板,编制控制程序,实现直流电机PWM调速控制。

实验思考题
本实验中是通过改变脉冲的占空比,周期T 不变的方法来改变电机转速的,还有什么办法能改变电机的转速,应该怎么实现?
附件:
L298简介:
L298N 为SGS-THOMSON Microelectronics 所出产的双全桥步进电机专用驱动芯片( Dual Full-Bridge Driver ) ,内部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge 的高电压、大电流双全桥式驱动器,接收标准TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号。

pwm舵机控制

pwm舵机控制

pwm舵机控制第一章:引言随着自动化技术的不断发展,舵机成为机器人、无人机、智能家居等领域中重要的执行器之一。

舵机控制的准确性和稳定性对于这些应用来说至关重要。

PWM(脉宽调制)技术已被广泛应用于舵机控制中,它通过控制舵机电源的脉冲宽度来实现舵机的位置控制。

本论文将重点研究PWM舵机控制方法,并进行相关性能分析和实验验证。

第二章:PWM舵机控制原理2.1 PWM技术概述脉宽调制技术是一种通过改变控制信号的脉冲宽度来控制设备的平均功率输出的方法。

在舵机控制中,PWM技术被用于控制电源脉冲信号的宽度,进而控制舵机的角度或位置。

通常,PWM信号的高电平代表一个角度,而低电平则代表另一个角度。

2.2 PWM舵机控制原理PWM舵机控制分为两个阶段:位置检测和角度控制。

在位置检测阶段,舵机读取输入信号的脉宽,通过内部电路将其转化为相应的角度。

而在角度控制阶段,PWM信号控制舵机的转动。

具体来说,当PWM信号的脉冲宽度大于一个阈值时,舵机向一个方向转动;当脉冲宽度小于该阈值时,舵机向另一个方向转动。

第三章:PWM舵机控制方法3.1 基于PID控制算法的PWM舵机控制PID控制算法是一种常用的控制算法,可以根据目标值与实际值的误差来调整控制信号,进而实现对舵机位置的控制。

在PWM舵机控制中,可以使用PID控制算法来计算控制信号的脉冲宽度,使舵机保持在目标角度附近。

3.2 基于反馈机制的PWM舵机控制在PWM舵机控制中,可以通过添加反馈机制来提高舵机的姿态控制精度。

反馈机制可以通过使用角度传感器或加速度传感器等设备来获取舵机的实际位置信息,并将其与目标位置进行比较。

通过不断调整控制信号的脉冲宽度,可以使舵机快速准确地达到目标姿态。

第四章:实验与结果分析本章将进行一系列实验来验证PWM舵机控制方法的性能。

实验中将计算不同PWM信号脉冲宽度对舵机位置和角度的影响,并进行比较分析。

通过实验结果的对比和分析,可以评估不同的舵机控制方法的优缺点,为实际应用提供指导。

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制--SQ这是最近一阶段自己学习所获,现分享与大家。

这里采用A T89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等注:考虑小直流电机自身因素,调速范围仅设有四级电路原理图:C语言程序源代码:/******************** 硬件资源分配*********************/数码管:显示电机状态(启停、正反、速度)、运行时间、是否转弯按键:K4 启动/暂停K3 正反转/转弯允许K2 加速/左转/运行时间清零K1 减速/右转/停止定时器:T0 数码管动态显示,输出PWMT1 运行时间记录********************************************************//*******主程序文件PWM.c******/#include <reg52.h>#include "Afx.h"#include "Config.c"#define CIRCLE 5 //脉冲周期//按键定义uchar key,key_tmp=0, _key_tmp=0;//显示定义uchar LedState=0xF0; //LED显示标志,0xF0不显示,Ox00显示uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通1、2、3、4位uchar dispbuf[4]={0,0,0,0}; //待显示数组uchar dispbitcnt=0; //选通、显示的位uchar mstcnt=0;uchar Centi_s=0,Sec=0,Min=0; //分、秒、1%秒//程序运行状态标志bit MotState=0; //电机启停标志bit DirState=0; //方向标志0前,1后uchar State1=-1;uchar State2=-1;uchar State3=0;uchar State4=-1;uchar LSpeed=0;uchar RSpeed=0;//其他uint RunTime=0;uint RTime_cnt=0;uint LWidth;uint RWidth; //脉宽uint Widcnt=1;uint Dispcnt;//函数声明void key_scan(void);void DisBuf(void);void K4(void);void K3(void);void K2(void);void K1(void);void disp( uchar H, uchar n );void main(void){P1|=0xF0;EA=1;ET0=1;ET1=1;TMOD=0x11;TH0=0xFC;TL0=0x66; //T0,1ms定时初值TH1=0xDB;TL1=0xFF; //T1,10ms定时初值TR0=1;Widcnt=1;while(1){key_scan();switch(key){case 0x80: K1(); break;case 0x40: K2(); break;case 0x20: K3(); break;case 0x10: K4(); break;default:break;}key=0;DisBuf();LWidth=LSpeed;RWidth=RSpeed;}}//按键扫描**模拟触发器防抖void key_scan(void){key_tmp=(~P3)&0xf0;if(key_tmp&&!_key_tmp) //有键按下{key=(~P3)&0xf0;}_key_tmp=key_tmp ;}//按键功能处理/逻辑控制void K4(void){if(State4==-1){State4=1;TR1=1;dispbuf[3]=1;LedState=0x00; //打开LEDMotState=1; //打开电机LSpeed=1;RSpeed=1; //初速设为1}else if(State4==1){State4=0;TR1=0;MotState=0; //关闭电机}else if(State4==0){MotState=1;if(State3==0){State4=1;TR1=1;}else if(State3==1){LSpeed=2;RSpeed=2;}}}void K3(void){if(State4==1)DirState=!DirState;if(State4==0){if(State3==0){State3=1; //可以转向标志1可以,0不可以TR1=1;dispbuf[3]=9;MotState=1;LSpeed=2;RSpeed=2;}else if(State3==1){State3=0;TR1=0;dispbuf[3]=0;MotState=0;}}}void K2(void){if(State4==1&&LSpeed<4&&RSpeed<4){LSpeed++;RSpeed++;}else if(State4==0){if(State3==0){//State4=-1;//LedState=0xF0;MotState=0;Sec=0;Min=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=0;LSpeed=2;RSpeed++;}}}void K1(void){if(State4==1&&LSpeed>1&&RSpeed>1){LSpeed--;RSpeed--;}else if(State4==0){if(State3==0){State4=-1;LedState=0xF0;MotState=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=1;LSpeed++;RSpeed=2;}}}//显示预处理void DisBuf(void){if(RTime_cnt==100){Sec++;RTime_cnt=0;}if(Sec==60){Min++;Sec=0;}if(State4==1){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;if(!DirState) //正转dispbuf[3]=LSpeed;if(DirState) //反转dispbuf[3]=LSpeed+4;}if(State4==0){if(State3==0){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;dispbuf[3]=0;}if(State3==1){dispbuf[0]=RSpeed;dispbuf[1]=LSpeed;dispbuf[2]=Min;dispbuf[3]=9;}}}//LED驱动void disp( uchar H, uchar n ){P1=n;P1|=LedState ;P1|=LED_code_d[H];}//T0中断**显示/方波输出void Time_0() interrupt 1{TH0=0xFC;TL0=0x66;Widcnt++;Dispcnt++;//电机驱动/方波输出if(Widcnt>CIRCLE){Widcnt=1;}if(Widcnt<=LWidth)LMot_P=!DirState&&MotState;elseLMot_P=DirState&&MotState;LMot_M=DirState&&MotState;if(Widcnt<=RWidth)RMot_P=!DirState&&MotState;elseRMot_P=DirState&&MotState;RMot_M=DirState&&MotState;//显示if(Dispcnt==5){disp(dispbitcnt,dispbuf[dispbitcnt]);dispbitcnt++;if(dispbitcnt==4){dispbitcnt=0;}Dispcnt=0;}}//T1中断**运行时间void Time_1() interrupt 3{TH1=0xDB;TL1=0xFF;RTime_cnt++;}/******配置文件Afx.h******/#ifndef _AFX_#define _AFX_typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long ulong;#endif/******IO配置文件Config.c******/#ifndef _Config_#define _Config_#include "Afx.h"#include <reg52.h>//显示定义sbit led=P3^2;//电机引脚定义sbit LMot_P=P2^2; sbit LMot_M=P2^3; sbit RMot_P=P2^0; sbit RMot_M=P2^1;#endif。

PWM电机调速原理及51单片机PWM程序经典

PWM电机调速原理及51单片机PWM程序经典

PWM电机调速原理及51单片机PWM程序经典pwm电机调速原理对于电机的转速调整,我们是采用脉宽调制(pwm)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。

不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端pe2和pd5上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。

此电路中用微处理机去同时实现脉宽调制,通常的方法存有两种:(1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻辑状态去产生脉宽调制信号,设置相同的延时时间获得相同的充电电流。

(2)硬件实验自动产生pwm信号,不挤占cpu处置的时间。

这就要用到atmega8515l的在pwm模式下的计数器1,具体内容可参考相关书籍。

51单片机pwm程序产生两个pwm,要求两个pwm波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256,pwm这个功能在pic单片机上就存有,但是如果你就要用51单片机的话,也就是可以的,但是比较的麻烦.可以用定时器t0去掌控频率,定时器t1去掌控充电电流:大致的的编程思路就是这样的:t0定时器中断就是使一个i0口输入高电平,在这个定时器t0的中断当中再生制动定时器t1,而这个t1就是使io口输入低电平,这样发生改变定时器t0的初值就可以发生改变频率,发生改变定时器t1的初值就可以发生改变充电电流。

*程序思路说明:****关于频率和占空比的确定,对于12m晶振,假定pwm输出频率为1khz,这样定时中断次数**预设为c=10,即0.01ms中断一次,则th0=ff,tl0=f6;由于预设中断时间为0.01ms,这样**可以设定占空比可从1-100变化。

即0.01ms*100=1ms******************************************************************************* /#include#defineucharunsignedchar/******************************************************************************th0和tl0是计数器0的高8位和低8位计数器,计算办法:tl0=(65536-c)%6;**th0=(65536-c)/256,其中c为所要计数的次数即为多长时间产生一次中断;tmod就是计数器**工作模式挑选,0x01则表示采用模式1,它存有16十一位计数器,最小计数脉冲为65536,最久时**间为1ms*65536=65.536ms******************************************************************************* /#definev_th00xff#definev_tl00xf6#definev_tmod0x01voidinit_sys(void);/*系统初始化函数*/voiddelay5ms(void);unsignedcharzkb1,zkb2;voidmain(void){init_sys();zkb1=40;/*占空比初始值设定*/zkb2=70;/*占空比初始值设定*/while(1){if(!p1_1)//如果按了+键,减少充电电流{delay5ms();if(!p1_1){zkb1++;zkb2=100-zkb1;}}if(!p1_2)//如果按了-键,增加充电电流{delay5ms();if(!p1_2){zkb1--;zkb2=100-zkb1;/*对占空比值限定范围*/if(zkb1>99)zkb1=1;if(zkb1<1)zkb1=99;}}/*******************************************************函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/voidinit_sys(void)/*系统初始化函数*/{/*定时器初始化*/tmod=\th0=v_th0;tl0=v_tl0;tr0=1;et0=1;ea=\}//延时voiddelay5ms(void){unsignedinttempcyc=1000;while(tempcyc--);}/*中断函数*/voidtimer0(void)interrupt1using2{staticucharclick=\/*中断次数计数器变量*/th0=v_th0;/*恢复定时器初始值*/tl0=v_tl0;++click;if(click>=100)click=\if(click<=zkb1)/*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/p1_3=0;elsep1_3=1;if(click<=zkb2)p1_4=0;elsep1_4=1;}<1.下面就是avr的程序,51产生pwm波麻烦,可以用avr。

51单片机 舵机控制程序

51单片机 舵机控制程序

51单片机舵机控制程序题目:基于51单片机的舵机控制程序设计与实现第一章:引言1.1 研究背景51单片机是一种广泛应用于嵌入式系统中的微控制器,具有成本低、功耗低、可靠性高等优点。

而舵机是一种能够控制角度的电机装置,广泛应用于机器人、航模和自动化设备等领域。

本章旨在探讨基于51单片机的舵机控制程序设计与实现的意义和必要性。

1.2 研究目的本研究的主要目的在于设计并实现一套稳定、高效的舵机控制程序,为使用51单片机的嵌入式系统提供角度控制功能。

通过本研究,可以提高舵机控制的精度和稳定性,拓展舵机的应用领域。

第二章:51单片机舵机控制程序的设计2.1 硬件设计根据舵机的控制特点,我们需要通过PWM信号控制舵机转动的角度。

在硬件设计上,我们需要使用51单片机的定时器功能产生PWM信号,并通过IO口输出给舵机。

具体的设计方案包括选择合适的定时器、设置定时器的工作模式和频率等。

2.2 软件设计在软件设计上,我们需要通过编写51单片机的控制程序实现舵机的控制。

具体的设计流程包括:(1)初始化:设置定时器的工作模式和频率,配置IO口的输出模式。

(2)角度控制:根据舵机的角度范围和控制精度,将目标角度转换为占空比,并通过PWM信号控制舵机转动到目标角度。

(3)稳定性优化:通过对定时器周期和占空比的调整,优化舵机的稳定性,减小舵机的误差。

第三章:51单片机舵机控制程序的实现3.1 硬件搭建在实现阶段,我们需要根据硬件设计方案选购相应的硬件元件,并将其搭建成一个完整的舵机控制系统。

具体的搭建过程包括:(1)选购舵机和51单片机等硬件元件,并连接相关的信号线。

(2)按照硬件设计方案,搭建并调试舵机控制系统。

3.2 软件编写在软件实现阶段,我们需要使用51单片机的编程语言(如C语言或汇编语言)编写舵机控制程序,并通过编译和烧录等步骤将程序下载到51单片机中。

具体的编写过程包括:(1)按照软件设计方案,编写舵机控制程序的相关函数和逻辑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*-----------------------------------------------名称:IIC协议 PCF8591ADDA转换内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量,用LED亮度渐变指示,晶体选用12MHz------------------------------------------------*/#include"reg52.h"#include <intrins.h> //包含NOP空指令函数_nop_();#define AddWr 0x90 //写数据地址#define AddRd 0x91 //读数据地址sbit Sda=P1^2; //定义总线连接端口sbit Scl=P1^1;sbit control_signal=P1^5;data unsigned int Display[8];//定义临时存放数码管数值unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表unsigned int ADtemp; //定义全局变量unsigned int high,low;static unsigned int count1;/*------------------------------------------------延时程序------------------------------------------------*/void mDelay(unsigned char j){unsigned int i;for(;j>0;j--){for(i=0;i<125;i++){;}}}/*------------------------------------------------初始化定时器0------------------------------------------------*/void Init_Timer0(void){TMOD |=0x01; //定时器设置 0.1ms in 11.0592M crystal TH0=(65536-78)/256;TL0=(65536-78)%256; //定时0.1mSET0=1;//定时器中断打开EA=1;//总中断TR0=1; //启动定时器0}/*------------------------------------------------启动IIC总线------------------------------------------------*/void Start(void)Sda=1;_nop_();Scl=1;_nop_();Sda=0;_nop_();Scl=0;}/*------------------------------------------------停止IIC总线------------------------------------------------*/ void Stop(void){Sda=0;_nop_();Scl=1;_nop_();Sda=1;_nop_();Scl=0;}/*------------------------------------------------应答IIC总线------------------------------------------------*/ void Ack(void){Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------非应答IIC总线------------------------------------------------*/ void NoAck(void){Sda=1;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------发送一个字节------------------------------------------------*/ void Send(unsigned char Data){unsigned char BitCounter=8;unsigned char temp;do{temp=Data;Scl=0;_nop_();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回------------------------------------------------*/ unsigned char Read(void){unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{Scl=0;_nop_();Scl=1;_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/*------------------------------------------------读取AD模数转换的值,有返回值------------------------------------------------*/unsigned int ReadADC(unsigned char Chl){unsigned int Data;Start(); //启始信号Send(AddWr);//0x90Ack();Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加 //Chl的值分别为0、1、2、3,分别代表1-4通道Ack();Start();Send(AddRd); //读入地址Ack();Data=Read(); //读数据Scl=0;NoAck();Stop();return Data; //返回值}/******************************************************************//* 主程序 *//******************************************************************/void main(){Init_Timer0();while(1){unsigned int angle;ADtemp=ReadADC(0); //ADtemp的取值范围是0-255,定时的时间范围是0.5-2.5ms high=65075-7.2*ADtemp; //( high=65035-7.8*ADtemp;12MHz)(65535-(460+7.2*ADtemp 11.0592MHz) low=47563+7.2*ADtemp; // ( low=46035+7.8*ADtemp; )( 65535-(17972-7.2*ADtemp 11.0592MHz )angle=ADtemp*0.7;Display[0]=Datatab[angle/100];//处理0通道电压显示Display[1]=Datatab[(angle%100)/10];Display[2]=Datatab[angle%10];while(1){P0=Display[count1];//用于动态扫描数码管P2=count1;mDelay(1);count1++;if(count1==3) //表示扫描8个数码管{count1=0;break;}}}}/******************************************************************//* 定时器中断函数,需要更改/******************************************************************/void tim(void) interrupt 1 using 1{static unsigned char count;if (!count){control_signal = 1; //给高电平TH0=high/256;TL0=high%256; //定时0.05mS,经过示波器的测量}else{control_signal=0 ;TH0=low/256;TL0=low%256; //定时0.05mS,经过示波器的测量}count=~count;}。

相关文档
最新文档