单片机编程 设单片机的晶振频率为12MHZ,请编出利用定时/计数器T0,使之工作在方式1,产生50ms定时,

作者&投稿:鄘冠 (若有异议请与网页底部的电邮联系)
单片机编程 设单片机的晶振频率为12MHZ,请编出利用定时/计数器T0,使之工作在方式1,产生50~

问题没说清楚

采用12Mhz晶振的51单片机,软件如下(调试通过)

#include

#define PERIODH (65536l-50000l)/0X100 //设50ms中断1次TH1初值
#define PERIODL (65536l-50000l)%0X100 //设50ms中断1次TL1初值
//如果需要极精确的延时,应根据实际编译后的产生的汇编指令,扣除掉中断响应中重装所占用的时间

unsigned int count;//延时时间变量

void timer1() interrupt 3 using 1
{//定时器每0.05秒一次中断

TH1 = PERIODH;
TL1 = PERIODL;

if(count)
{//计数未到0,则保持定时器运行,计数器-1
count--;
}
else
{//计数到0,关定时器
TR1 =0; //stop timer 1
}

}

//以秒为基本定时单位的子程序
void Delay1S(unsigned char x)
{
TH1 =PERIODH;
TL1 =PERIODL;
TR1 = 1;//此时定时开始

count = 20*x;//因50ms中断1次,故乘20
while(count);
}

main()
{
TMOD = 0X10;//方式1
EA = 1;//总中断允许
ET1 = 1;//定时器1中断允许

while(1)
{
Delay1S(1);//延时1秒
Delay1S(2);//延时2秒
Delay1S(3);//延时3秒
Delay1S(4);//延时4秒

}
}

Delay1S函数是调用时才开始计时,根据需要的定时长度到时停止计时。如果定时精度要求不高,可以不用在中段服务程序中关闭定时器,每次调用误差也就在50ms。
可以用KEIL仿真看一下实际时间

#include"reg52.h"
#define uchar unsigned char
sbit Wave=P1^0;
void Timer0() interrupt 1
{
static uchar t50ms;
TL0=0xb0;
TH0=0x3c;
t50ms=++t50ms%20;
if(!t50ms) Wave=~Wave;
}
void TimerInit()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
EA=1;
ET0=1;
}
void main()
{
TimerInit();
while(1);
}
直接打的,没进行编译,希望不会错。

我来个汇编的:
ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt

START:
MOV SP,#60H
LCALL InitTimer0
MOV R7,#0
SJMP $

InitTimer0:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
RET

Timer0Interrupt:
MOV TH0,#3CH
MOV TL0,#0B0H
INC R7
CJNE R7,#20,RT
MOVR7,#0
CPL P1.0
RT: RETI

END


建宁县17358313238: 假设单片机的晶体震荡器的频率是11.0592MHz,利用定时器1采用方式1定时20ms,写出初值 -
巢容枢绮: 给你一个参考程序,该例题在《单片机原理与应用-基于汇编、C51及混合编程》一书的第181-183页有汇编及C51的详细解析. 【例7-3】设STC12C5A60S2单片机的系统时钟频率为12MHz,编程实现从P1.1引脚输出周期为1s的方波. 分析:...

建宁县17358313238: 关于单片机的编程1.已知单片机系统晶振频率为11.0592MHz,初始时开关K1在低位,当K1打为高位时,令P1.0输出高电平为4秒,低电平为1秒的方波,通... -
巢容枢绮:[答案] 这是一个很基础的程序,你把我的博客上那四个基础程序看懂了前两个,就可以自己写了.

建宁县17358313238: 设单片机晶振频率为12MHz,请编写一个程序段,使用定时器1以方式1产生周期为100ms的等效方波 -
巢容枢绮: 主程序里这样设置 TMOD=0x10;//定时器1作为定时器用 TH1=(65536-50000)/256; TL1==(65536-50000)%256; EA=1;//开总中断 ET1=1;//允许定时器1中断 TR1=1;//启动定时器1中断程序如下: void timer1()interrupt 3//注意:定时器1的中断序号为3 { TH1=(65536-50000)/256; TL1==(65536-50000)%256; P1.7=~P1.7;}

建宁县17358313238: 已知单片机的晶振频率为12MHz,要求用T1工作方式1完成60ms定时,同时让T0 -
巢容枢绮: void Timer1Init(void) //60毫秒@12.000MHz { AUXR &= 0xBF; //定时器时钟12T模式 TMOD &= 0x0F; //设置定时器模式 TMOD |= 0x10; //设置定时器模式 TL1 = 0xA0; //设置定时初值 TH1 = 0x15; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 }

建宁县17358313238: 设单片机晶振频率12mhz,使用定时器1以工作方式1产生周期为100ms的等宽方 -
巢容枢绮: 假设用P1.1输出,程序如下: #include<reg52.h> //主程序 void main() {TMOD=0x10;// 定时器1工作方式一ET1=1;EA=1;TH1=(65536-50000)/256;TL1=(65536-50000)%256;TR1=1;while(1); } //中断子程序 void Timer1() interrupt 3 {TH1=(65536-50000)/256;TL1=(65536-50000)%256; P1^1=~P1^1; }

建宁县17358313238: 单片机的晶振频率怎么确定? -
巢容枢绮: 根据使用需要确定,举例:如果要产生标准的串口波特率,应使用11.0592MHz,如果要让51单片机产生整数的时钟频率可使用12MHz或者24MHz单片机. 另外根据单片机本身的参数,不要选择过高的频率,否则会工作不稳定.举例:Atmega8...

建宁县17358313238: 设51单片机晶振频率为12MHZ,延时1m的子程序 -
巢容枢绮: 猜想你问的是1ms. 下面为你写出1ms的程序: 用的是11.0592M的,你如果真的需要是12M的,那自己直接修改成12M就可以了.调用的时候直接把uinsigned int ms改成1就是1ms.void ConfigTimer0(unsigned int ms) {unsigned long tmp;tmp =...

建宁县17358313238: 单片机晶振频率6MHz,使用定时器1以方式0和1,产生周期为1ms的等宽正方波脉冲,并由P1.0输出 -
巢容枢绮: 给你一个模板吧,,,这里选择定时器1的方式1 采用汇编 中断方式编写T(周)=12/6 =2us, N=65536-(1/2 ms)/(2us)=65286 ORG 0000HLJMP START;ORG 001bHLJMP TT1 START: mov TMOD ,#10Hmov DPTR ,#65286mov TH1,DPHmov TL1,DPLSETB TR1SJMP $TT1:mov TH1,DPHmov TL1,DPLCPL P1.0RETI给你参考一下,,有啥不懂得,,可以随时连线

建宁县17358313238: 设单片机晶振频率为12MHz,使用定时器1以方式1产生周期为200us的等宽正方波……,用c51语言实现 -
巢容枢绮: 同定时器的自动重载方式,产生100us的中断周期,对p1.0口取反,单片机小精灵能帮到你

建宁县17358313238: 设89S51单片机的晶振频率为fosc=6MHZ. -
巢容枢绮: 主程序中:TMOD=0x10;ET1=1;EA=1; TH1=(65536-1000)/256;TL1=(65536-1000)%256; TR1=1; while(1);中断程序 void Time1 ( ) interrupt 3 { T H1=… TL1=… P1·0=~P1·0;}

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网