1. 51单片机代码(定时器/计数器实验)求详细注释,非常谢谢
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0100
MAIN:
MOV TMOD,#01H ;定时器0设为模式1
MOV TH0,#0D8H ;赋初值(65536-10000)
MOV TL0,#0F0H
MOV A,#00H ;A=0
MOV P1,A ;P1=A
MOV R0,#20 ;R2=20
SETB EA ;开中断
SETB ET0 ;开定时器0中断
SETB TR0 ;启动定时器0
LOOP: NOP ;空操作
LJMP LOOP ;转LOOP
T0_INT:
MOV TH0,#0D8H ;重赋初值
MOV TL0,#0F0H
DJNZ R0,OUT ;R0减1不为0转OUT
MOV R0,#20H ;R0重赋初值
CPL A ;A取反
MOV P1,A ;P1=A
OUT: RETI
END
;该程序结果在P1上产生周期为400毫秒的脉冲输出,控制LED灯的话,以400毫秒周期闪烁
2. 51单片机定时计数器
TMOD = 0X01; //设置t0为16位(01)计时模式,以TR0来启动计时器
//计算初值
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1; //开总中断
ET0 = 1;//开定时器0中断
TR0 = 1; //启动T0
while (1);
定时器中断服务函数;
void timer0_service(void) interrupt 1 (T1 时这里应为3)
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256; //打算继续定时下去时,进入中断服务函数后,重新设定一下初值。
times++; //这可以产生更大的定时
if (times == 20) {
times = 0;
led = !led;
}
}
3. C51单片机程序
TH0=0xf6;
TL0=0xff;
上两行是定时器/计数器T0的初值,因为T0是16位的,所以用TH0表示高八位,TL0表示低八位
TH1=0xfd;
TL1=0xfd;
T1初值
TMOD=0x21;
定时器/计数器模式控制寄存器如图
GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1
GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。
C/T=0时为定时功能,C/T=1时为计数功能
M0、M1——方式选择功能
M1M0工作方式计数器模式TMOD(设置定时器模式)
00方式013位计数器TMOD=0x00
01方式116位计数器TMOD=0x01
10方式2自动重装8位计数器TMOD=0x02
11方式3T0分为2个8位独立计数器,T1为无中断重装8位计数器TMOD=0x03
PCON=0x00;
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器
WDCON=0x00;清狗
SCON=0x50;
SCON1=0x40;
串口控制寄存器
4. 求一个51单片机用T0做计数器的C语言代码。
//timer0设定为计数器模式1
TMOD &= 0xf0; //清除原来的设定
TMOD |= 0x05; //T0为计数器模式1
TH0 = 0;
TL0 = 0; //从0开始计数
TR0 = 1; //使能T/C0
// IE |= 0x82; //Timer0中断使能,不需要就注释掉该行
另外执行不了有可能是你的实验板没有连接T0引脚
5. 用51单片机测频率,T0定时,T1计数,具体程序应该怎么写呀,跪求完整点的
数码管还是液晶屏显示?晶振频率多少?
用定时器时,先设置工作方式再装入初值开启中断再开启定时器/计数器
void init()//初始化设置
{
TMOD=0x51;//定时器1作为计数器,定时器0作为定时器用
TH1=0;//计数器清0
TL1=0;
EA=1;//开总中断
ET0=1;//允许定时器0中断
TH0=(65535-50000)/256;// 晶振12M时 定时50ms需装入的初值
TL0==(65535-50000)%256;
TR0=1;//启动计数器
TR1=1;//启动定时器
}
定时器中断程序
void timer0()interrupt 1//注意:定时器0的中断序号为1
{
TH0=(65535-50000)/256;
TL0==(65535-50000)%256;
TR1=0;//暂停计数
bb=TH1;//读出计数器数据
cc=TL1;
TL1=0;//计数器清0
TH1=0;
TR1=1;//重新启动
}
频率f=(bb*256+cc)*20
然后分离出个十百千万,送液晶屏或数码管去显示
主程序先初始化,然后就是不停地显示
6. MCS_51鍗旷墖链虹殑瀹氭椂鍣═O锅沧㈣℃暟镄勮鍙ユ槸浠涔
TR0=0锛涘仠姝㈣℃暟
TR0=1锛涘紑濮嬭℃暟
7. 51单片机定时/计数器的问题 (代码)
TH0 = THC0; // 向TH0寄存器写入THC0常数,也就是0xEE
TL0 = TLC0; // 向TL0寄存器写入TLC0常数,也就是0x00
// 以上完成定时器0在16位模式下的初值加载,也就是0xEE00
TR0 = 1; // 开启定时器0的运行。此语句之后Timer0计数器才开始累加
ET0 = 1; // 开启定时器0的中断。此语句之后,Timer0计数器溢出才会产生中断标志
EA = 1; // 开启总中断开关。此语句之后,中断标志置位才会触发PC跳转到对应的中断向量
好好学习天天向上
8. 求个 51单片机 计数器 程序 注解
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int
sbit sw1=P3^4;
sbit sw2=P3^5;
sbit sw3=P3^6;
sbit e0=P2^0;
sbit e1=P2^1;
sbit e2=P2^2;
sbit e3=P2^3;
u8 ds[4]={0,0,0,0};
u16 num=0;
u8 code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x00};//共阴数码管
u8 ajsm() //SW3按键检测和处理
{
static u16 ms;
if(sw3==0)
{
if(++ms==2)
{
return 1;
}
}
else
{
ms=0;
}
return 0;
}
void xs() //显示
{
static u8 a;
a++;
if(a>3)a=0; //a最大为3,大于3则为0
e0=1;
e1=1;
e2=1;
e3=1;//以上4条语句关闭显示(没有位选)
P0=table[ds[a]];//段选码送P0
switch(a)
{
case 0: //a=0,显示第一位(位选e0=0其余为1)
{
e0=0;
e1=1;
e2=1;
e3=1;
}break;
case 1: //a=1,显示第二位(位选e1=0其余为1)
{
e0=1;
e1=0;
e2=1;
e3=1;
}break;
case 2: //a=2,显示第三位(位选e2=0其余为1)
{
e0=1;
e1=1;
e2=0;
e3=1;
}break;
case 3: //a=3,显示第四位(位选e3=0其余为1)
{
e0=1;
e1=1;
e2=1;
e3=0;
}break;
}
}
void main()
{
TMOD=0x66;//定时器0和1均设置为自动重装载计数器模式
TH0=0xff;//定时器0来一个脉冲中断一次
TL0=0xff;
TH1=0xff;//定时器1来一个脉冲中断一次
TL1=0xff;
TR1=1;//启动计数器1
TR0=1;//启动计数器0
ET0=1;//允许定时器0中断
ET1=1;//允许定时器1中断
EA=1;//开总中断
while(1)
{
ds[0]=num/1000%10;
ds[1]=num/100%10;
ds[2]=num/10%10;
ds[3]=num%10; //以上四句将num转换为数码管显示的值
xs(); //调用显示
if(ajsm()) //检测按键
{
num=0; //清零
}
}
}
void time0()interrupt 1 //SW1按键处理
{
if(num<9999)num++;
}
void time1()interrupt 3 //SW2按键处理
{
if(num>0)num--;
}