求助:请问怎么用51单片机控制直流电机T

试说明51系列单片机定时器的使用方法_百度知道
试说明51系列单片机定时器的使用方法
我有更好的答案
定时计数器定时计数器T0/T1控制。由TMOD为不可位寻址的特殊功能寄存器控制。各位定义如下:位 D7 D6 D5 D4 D3 D2 D1 D0位符号 GATE C/T* M1 M0 GATE C/T* M1 M0TMOD的低四位控制T0,高四位控制T1。M1、M0:工作方式选择位。通过M1、M0的值来选择工作方式。具体如下:M1
M0 工作方式 计数器功能
0 0 13位计数器0
1 1 16位计数器1
0 2 自动重载初始值的8位计数器1
1 3 T0位两个独立8位计数器,T1停止C/T*:工作模式选择位。为1时工作在计数模式;为0时在定时模式。GATE:门控位。为0时外部中断信号不参与控制定时计数器的启动和停止,为1时外部中断信号参与控制定时计数器的启动和停止。
定时计数器T0和T1工作在方式0时,13位计数器从0开始计数,需要计8192次才能溢出。在定时计数器启动之前首先要设置其工作模式和工作方式,因此,需要设置TMOD。然后将计数初值装入定时器寄存器TH0(TH1)和TL0(TL1)中,还要置位TR0(TR1)来启动定时计数器。工作在方式0时,在计数溢出后必须在中端入口地址处或终端服务程序中为计数器重新装入初值。例:
0030HMAIN:
,#**H赋计数初值的高8位
;赋计数初值的低5位
;定时计数器工作在0方式
;开放T0的中断
;开放总中断
;启动T0计数
;中断程序中再次赋初值
…………………………..
RETI在中断程序中再次为T0的计数存储器TH0,TL0赋初值。 方式1和方式0差不多,只是计数器为16位,还有在初始化时TMOD的值为#01H。
其16位计数器被分为两个8位计数器,TH0、TH1和TL0、TL1,其中TH0、TH1装计数初值,TL0、TL1作为计数寄存器使用。在初始化时必须为TH0、TH1和TL0、TL1装入相同的初值。当计数溢出后向CPU发出中断请求,另一方面将TH0、TH1中的初值重新装入TL0、TL1,并再次开始计数。在方式2下,计数的最大值为256。
在方式0和方式1下溢出后需要软件为它们重新装入计数初值,在方式2下溢出后硬件会自动装入新的计数初值。例:
0030HMAIN:
;赋T0的8位计数初值
;赋T0的8位计数初值
;赋T1的8位计数初值
;赋T1的8位计数初值
;T0、T1工作在方式2
;开放T0的中断
;开放T1的中断
开放总中断
;启动T0计数
;启动T1计数
;T0的中断程序………………….RETI
;中断返回TIMER1:
;T1的中断程序
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,RETI
;中断返回在方式2中,对计数器只赋了一次初值,在中端程序中没再次赋值,这是方式2和别的方式的最大区别。方式3在方式3中,TH0 和TL0是两个独立的8位计数器,T1不工作。TL0可以设为定时模式或计数模式,有TR0控制,并采用TF0作为溢出中断标志,TH0只能在定时模式,借用TR1来启动,借用TF1为溢出标志。
设初值,开控制,。。。开中断。
为您推荐:
其他类似问题
您可能关注的内容
51系列单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: >>
51单片机TMOD和TCON设置
51单片机 TMOD 和 TCON 设置 单片机TMOD 示意表格 各个位的名字,点击下面的1和 就可以给各个位置 或者置0,控制两个定时器/ 就可以给各个位置1或者置 下面的表格列出了 TMOD 各个位的名字,点击下面的 和0就可以给各个位置 或者置 ,控制两个定时器 计数器的工作方式。 计数器的工作方式。 GAT E 1/0 程序 由于 TMOD 是不能位寻址的,所以只能直接往里面送数。 MOV TMOD,#00H; 程序说明 GATE=0用 TR0和 TR1来控制 T1和 T0的启动,GATE=1则用外部中断来控制。 C/T 为0表示定时器模式。为1表示计数器模式,对 T0或 T1的外部负跳变脉冲计数。 M1M0用来选择 T0和 T1的工作方式。C/T 1/0M1M0GATE 1/0C/T 1/0M1 00/01/10/11M000/01/10/11M1 M0 0 0 1 1 0 1 0 1工作方式 工作方式0 工作方式1 工作方式2 工作方式3功能描述 13位计数器 16位计数器 自动再装入8位计数器 定时器0:分成两个8位计数器; 定时器1:停止计数TCON 示意表格 下面的表格列出了 TCON 各个位的名字,点击下面的1和0就可以给各个位置1或者置0。TF1 1/0TR1 1/0TF0 1/0TR0 1/0IE1 1/0 1/0IT1 1/0IE0 1/0IT0其中 IE0、IE1不用软件设置。TF0、TF1在定时器溢出的时候由硬件置1,响应中断的时候硬件清零,但是也 可以用软件清零。 程序 点击按钮就会将相应的语句设置为灰色背景。 SETB IT0; 外部中断0引脚负跳变有效 CLR IT0; 外部中断0低电平有效,将 IE0置1,否则将 IE0清零。 SETB IT1 CLR IT1 CLR TF0 CLR TF1 ; 外部中断1引脚负跳变有效 ; 外部中断1低电平有效,将 IE1置1,否则将 IE1清零。 ; TF0表示计时器0溢出,只有在查询方式的时候才需要用这句软件清零 ; TF1表示计时器1溢出,只有在查询方式的时候才需要用这句软件清零SETB TR1 ; 开启定时器1 CLR TR1 ; 关闭定时器1SETB TR0 ; 开启定时器0 CLR TR0 ; 关闭定时器0
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。用AT89C51单片机实现小汽车调速控制_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用AT89C51单片机实现小汽车调速控制
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢STC51单片机实例之35PCF8591T同时采集4路AD输入-电子产品世界论坛
STC51单片机实例之35PCF8591T同时采集4路AD输入
/********************************************************************
PCF8591TAD实验.c
该程序实现了用PCF8591T同时采集4路AD输入的功能。
通过P3.2,P3.3两个按键,来切换所显示的AD输入通道。
按S19(P3.2)则显示的精密可调电阻分压的值。
按S20(P3.3) 则显示的光敏电阻和热敏电阻的值。
大家可以调节精密可调电阻,或者挡住光敏电阻的光,或者手接触温敏电阻,
数码管上显示的AD采集值都会有相应的变化。
***********************************************************************************/
#include&reg52.h&
#include &I2C.H&
//PCF8591 地址
// 此表为 LED 的字模
unsigned char code
Disp_Tab[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff,
unsigned char TABLEW[8] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char AD_CHANNEL;
unsigned char LedOut[8];
unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(unsigned char i)//1ms延时
unsigned char x,j;
for(j=0;j&i;j++)
for(x=0;x&=148;x++);
/*******************************************************************
DAC 变换, 转化函数
*******************************************************************/
bit DACconversion(unsigned char sla,unsigned char c,
unsigned char Val)
Start_I2c();
//启动总线
SendByte(sla);
//发送器件地址
if(ack==0)return(0);
SendByte(c);
//发送控制字节
if(ack==0)return(0);
SendByte(Val);
//发送DAC的数值
if(ack==0)return(0);
Stop_I2c();
//结束总线
return(1);
/*******************************************************************
ADC发送字节[命令]数据函数
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
Start_I2c();
//启动总线
SendByte(sla);
//发送器件地址
if(ack==0)return(0);
SendByte(c);
//发送数据
if(ack==0)return(0);
Stop_I2c();
//结束总线
return(1);
/*******************************************************************
ADC读字节数据函数
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
Start_I2c();
//启动总线
SendByte(sla+1);
//发送器件地址
if(ack==0)return(0);
c=RcvByte();
//读取数据0
Ack_I2c(1);
//发送非就答位
Stop_I2c();
//结束总线
return(c);
//******************************************************************/
unsigned char i,temp=1;
{/********以下AD-DA处理*************/
switch(AD_CHANNEL)
case 0: ISendByte(ADDR,0x41);
D[0]=IRcvByte(ADDR)*2;
//ADC0 模数转换1
case 1: ISendByte(ADDR,0x42);
D[1]=IRcvByte(ADDR)*2;
case 2: ISendByte(ADDR,0x43);
D[2]=IRcvByte(ADDR)*2;
//ADC2 模数转换3
case 3: ISendByte(ADDR,0x40);
D[3]=IRcvByte(ADDR)*2;
case 4: DACconversion(ADDR,0x40, D[4]/4); //DAC
if(++AD_CHANNEL&4) AD_CHANNEL=0;
if(KEY1==0 || KEY2==0 )
Delay_1ms(20);
//20毫秒软件防抖
if(KEY1 == 0)
else if(KEY2 == 0)
if(temp ==1)
LedOut[0]=Disp_Tab[D[0]%];
LedOut[1]=Disp_Tab[D[0]%];
LedOut[2]=Disp_Tab[D[0]%100/10]&0x7f;
LedOut[3]=Disp_Tab[D[0]%10];
LedOut[4]=Disp_Tab[D[1]%];
LedOut[5]=Disp_Tab[D[1]%x7f;
LedOut[6]=Disp_Tab[D[1]%100/10];
LedOut[7]=Disp_Tab[D[1]%10];
if(temp ==2)
LedOut[0]=Disp_Tab[D[2]%];
LedOut[1]=Disp_Tab[D[2]%];
LedOut[2]=Disp_Tab[D[2]%100/10]&0x7f;
LedOut[3]=Disp_Tab[D[2]%10];
LedOut[4]=Disp_Tab[D[3]%];
LedOut[5]=Disp_Tab[D[3]%x7f;
LedOut[6]=Disp_Tab[D[3]%100/10];
LedOut[7]=Disp_Tab[D[3]%10];
for(i=0;i&8;i++)
P0 = LedOut[7-i];
Delay_1ms(2);
/*************************此部分为I2C总线的驱动程序*************************************/
#include&reg52.h&
#include &intrins.h&
#include &I2C.H&
/* 定义空指令 */
/*定义空指令*/
/*应答标志位*/
/*******************************************************************
起动总线函数
函数原型: void
Start_I2c();
启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
/*发送起始条件的数据信号*/
/*起始条件建立时间大于4.7us,延时*/
/*发送起始信号*/
/* 起始条件锁定时间大于4μs*/
/*钳住I2C总线,准备发送或接收数据 */
/*******************************************************************
结束总线函数
函数原型: void
Stop_I2c();
结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
/*发送结束条件的数据信号*/
/*发送结束条件的时钟信号*/
/*结束条件建立时间大于4μs*/
/*发送I2C总线结束信号*/
/*******************************************************************
字节数据发送函数
函数原型: void
SendByte(UCHAR c);
将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
SendByte(unsigned char
unsigned char
for(BitCnt=0;BitCnt&8;BitCnt++)
/*要传送的数据长度为8位*/
if((c&&BitCnt)&0x80)SDA=1;
/*判断发送位*/
/*置时钟线为高,通知被控器开始接收数据位*/
/*保证时钟高电平周期大于4μs*/
/*8位发送完后释放数据线,准备接收应答位*/
if(SDA==1)ack=0;
else ack=1;
/*判断是否接收到应答信号*/
/*******************************************************************
字节数据接收函数
函数原型: UCHAR
RcvByte();
用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数应答从机。
********************************************************************/
unsigned char
unsigned char
/*置数据线为输入方式*/
for(BitCnt=0;BitCnt&8;BitCnt++)
/*置时钟线为低,准备接收数据位*/
/*时钟低电平周期大于4.7μs*/
/*置时钟线为高使数据线上数据有效*/
retc=retc&&1;
if(SDA==1)retc=retc+1;
/*读数据位,接收的数据位放入retc中 */
return(retc);
/********************************************************************
应答子函数
void Ack_I2c(bit a);
主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
if(a==0)SDA=0;
/*在此发出应答或非应答信号 */
else SDA=1;
/*时钟低电平周期大于4μs*/
/*清时钟线,钳住I2C总线以便继续接收*/
//起动总线函数
extern void Start_I2c();
//结束总线函数
extern void Stop_I2c();
//应答子函数
extern void Ack_I2c(bit a);
//字节数据发送函数
extern void
SendByte(unsigned char
//有子地址发送多字节数据函数
extern bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) ;
//无子地址发送多字节数据函数
extern bit ISendStrExt(unsigned char sla,unsigned char *s,unsigned char no);
//无子地址读字节数据函数
extern unsigned char RcvByte();
extern void HC595SendData(unsigned int SendVal);
/*************************此部分为74HC595的驱动程序使用SPI总线连接*************************************/
#include&reg52.h&
#include &intrins.h&
/* 定义空指令 */
/*定义空指令*/
MOSIO =P1^5;
R_CLK =P1^6;
S_CLK =P1^7;
void HC595SendData(unsigned int SendVal);
/*********************************************************************************************************
** 函数名称: HC595SendData
** 功能描述: 向SPI总线发送数据
** 管脚描述:请参考相关的芯片资料(学习光盘中以配)
*********************************************************************************************************/
void HC595SendData(unsigned int SendVal)
for(i=0;i&16;i++)
if((SendVal&&i)&0x8000) MOSIO=1; // set dataline high
else MOSIO=0;
R_CLK=0; //set dataline low
R_CLK=1; //片选
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有豆丁微信公众号
君,已阅读到文档的结尾了呢~~
精品:单片机tmod 51 tmod tmod 0x01 tcon寄存器 tmod 0x10 tmod 0x11 tmod 0x20 tmod寄存器 tconfig tmod 0xf0
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
51单片机TMOD和TCON设置
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 单片机控制电机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信