前辈,教我写一个51单片机题吧。使用定时器实现0-255的加1显示。

作者&投稿:淳成 (若有异议请与网页底部的电邮联系)
请问,51单片机我同时把计数器1和定时器0打开,定时器1计数到255的时候,把TR1=TR0=0都关闭,~

//简单
//计数器1和定时器0都用中断,
TMOD=0x61;//定时器0方式1,计数器1方式2
TH0=0xFC; //1ms初值
TL0=0x18; //1ms初值
TH1=0x0;
TL1=0x0;
ET0=1;
TR1=1;
ET1=1;
EA=1;
//while(TL1==0);可以等计数器计到1才启动定时器0
TR0=1;
//计数1到255关闭计数器1和定时器0

ORG 00H
AJMP MAIN
ORG 30H
MAIN:
MOV TMOD,#60H ;TMOD的D6位=1,T1为计数器模式。D5位m1=1 、D4位m0=0,工作方式2
;8 位计数。TL1溢出时TH1内容自动装到TL1
SETB TR1 ;开定时器1
MAIN1:
MOVP1,TL1 ;脉冲数送P1口显示
AJMPMAIN1
END
图中按 了6次按键 ,表示6 个脉冲。

 

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//段码
//uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//变量
uchar Count,Number;
//延时(软件延时)
void DelayMS(uint ms)
{
 uchar t;
 while(ms--)
 for(t=0;t<60;t++);
}
//主程序
void main()
{
 P0=0xff;
 Count=0;
 Number=0;
 TMOD=0x01;
 //12MHZ晶振 C51单片机对其12分频
 //实际定时器“加1”频率为1MHZ 也就是1us
 //用定时器中断时间间隔 是从“开启定时器加1”到“溢出”的时间
 //对于工作在模式1的定时器0来说 也就是从“开启定时器加1”到“(TH0 TL0)=(0xff 0xff)+1”的时间
 //0xffff+1=65536
 //如果(TH0 TL0)初始值是(65536-50000) 那么初始值到溢出需要“加1”50000次
 //1次是1us 50000次就是50000us=50ms
 //如果我们对定时器的中断次数进行计数,每20次算作一个时间段,那么这样的一个时间段就是20*50ms = 1000ms = 1s
 //这就是利用定时器计时的原理
 //因为TH0和TL0分别是高字节和低字节,所以赋初值时也要将(65536-50000)分成高低字节分别赋值给TH0和TL0
 //高字节 是除以256后的到的商 低字节 是除以256后的到的余数
 //另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值
 //所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值
 TH0=(65536-50000)/256;//50ms 定时
 TL0=(65536-50000)%256;
 ET0=1;
 EA=1;
 TR0=1;//启动T0
 while(1)
 {
  //显示
  P0=0xff; 
  P1=0x80;  
  //判断对应位是不是1
  //是1 输出1的数码管段码
  //不是1 则是0 输出0的数码管段码  
  if(Number&0x01) P0=~0x06;
  else P0=~0x3f;
  DelayMS(10);  
  P0=0xff; 
  P1=0x40;   
  if(Number&0x02) P0=~0x06;
  else P0=~0x3f;
  DelayMS(10);
  P0=0xff; 
  P1=0x20;   
  if(Number&0x04) P0=~0x06;
  else P0=~0x3f;
  DelayMS(10);
  P0=0xff; 
  P1=0x10;   
  if(Number&0x08) P0=~0x06;
  else P0=~0x3f;
  DelayMS(10);
  P0=0xff; 
  P1=0x08;   
  if(Number&0x10) P0=~0x06;
  else P0=~0x3f;  
  DelayMS(10);
  P0=0xff; 
  P1=0x04;   
  if(Number&0x20) P0=~0x06;
  else P0=~0x3f;
  DelayMS(10);
  P0=0xff; 
  P1=0x02;   
  if(Number&0x40) P0=~0x06;
  else P0=~0x3f;
  DelayMS(10);
  P0=0xff; 
  P1=0x01;   
  if(Number&0x80) P0=~0x06;
  else P0=~0x3f;
  DelayMS(10);
 }
}
//T0 中断函数
void Int_T0() interrupt 1
{
 //另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值
 //所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值
 TH0=(65536-50000)/256;// 恢复初值
 TL0=(65536-50000)%256;
 //Count每中断一次加1 以20为周期 每当等于20时候说明1s到了
 if(++Count==20)
 {
  Count=0;
  Number++;
 }
}


//12MHZ晶振 C51单片机对其12分频
//实际定时器“加1”频率为1MHZ 也就是1us
//用定时器中断时间间隔 是从“开启定时器加1”到“溢出”的时间
//对于工作在模式1的定时器0来说 也就是从“开启定时器加1”到“(TH0 TL0)=(0xff 0xff)+1”的时间
//0xffff+1=65536
//如果(TH0 TL0)初始值是(65536-50000) 那么初始值到溢出需要“加1”50000次
//1次是1us 50000次就是50000us=50ms
//如果我们对定时器的中断次数进行计数,每20次算作一个时间段,那么这样的一个时间段就是20*50ms = 1000ms = 1s
//这就是利用定时器计时的原理
//因为TH0和TL0分别是高字节和低字节,所以赋初值时也要将(65536-50000)分成高低字节分别赋值给TH0和TL0
//高字节 是除以256后的到的商 低字节 是除以256后的到的余数
//另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值//所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值


//当数码管显示时判断对应位是不是1
//是1 输出1的数码管段码
//不是1 则是0 输出0的数


//在程序中利用Count记录中断的次数
//Count每中断一次加1 以20为周期 每当等于20时候说明1s到了

 



先用定时器做一个1S的,然后定义一个变量 int a; a=a+1;

51单片机I/O口扩展芯片8255问题,请各位师傅赐教。感激不尽!!!(有...
答:图没看到。但应该可以工作的,12864液晶在通过8255送数过去后自己显示,不用我们再管。时钟也是接近一秒才读一次,也来得及响应。键盘如果采用查询式的话,0.1S查询一次也可以。所以这样接的话是完全可以的。

51单片机中断
答:那么“定时器0”就会首先进入中断。执行了“定时器0”中断的各个环节,返回主程序之后,如果“外中断1”的中 断申请还存在,就会进入“外中断1”的。执行完了高级的中断程序,如果还有其它中断申请标志,系统还是按照自然优先级进行查找、响应中断。(IP)= 06H = 0000 0110,其中的两个1,就是设置“...

请问各位前辈,如何做51单片机与cd4067连接,实现:1、32通道选一。2...
答:用两片CS4067就可以实现了,A0~A3接CS4067的ABCD16选1信号,A4接EN控制信号(相当于片选)。

大家好我是一名单片机菜鸟,遇到一个小问题,自己弄了一下午,毫无头绪...
答:楼主的程序,经过编译,没有错误,没有警告。如下:include <reg51.h> include <stdio.h> sbit dle = P3^0;sbit doe = P3^1;sbit wle = P3^6;sbit woe = P3^7;void main(){ dle = 1;doe = 0;wle = 1;woe = 0;while(1) { P0 = 0x00;P2 = 0xff;} } ...

求助:51单片机扩展地址求法?急急急
答:数据总线 数据总线由P0口构成,双向。需要注意的是P0口兼作地址总线的低八位,所以需要将这低八位地址先锁存起来。控制总线 单片机方面,根据不同的扩展情况使用PSEN,ALE,RD,WR等作为控制总线。RAM的OE和WE分别接单片机的RD和WR。ROM只能读不能写,OE接PSEN。地址锁存器的使能信号接单片机的ALE。地...

前辈你好,我用单片机编了一个数码管显示产量的程序,但用protuce仿真不...
答:因为PROTEUS不成熟,仿真总是不能代替实物,大约有95%情况下可以。硬件数码管动态描瞄显示时是根据人眼的视觉停留时间长于描瞄周期,数码管点亮后要等待一段时间才会灭,仅管很短,但足够动态描瞄,而PROTEUS中的数码管则不是,它没有廷时。

我是单片机初学者想自制个c51单片机程序下载器,哪位能帮忙提供一下电路...
答:自制?你是为了学习过程么?不是的话还是不要自制了,换AT89S系列的芯片,用下载线吧,方便,便宜。如果你还是要自制的话,你在百度搜easy 51 pro 2.0,牛人聂忠强的作品,有全部的资料,包括上位机的源代码都是开源的,===在这里先对聂前辈表示深深的敬意。如果下不到的话留个U箱,发给你。

单片机定时器计数器问题
答:假设T=1111 1111 1100 1101 那么TH1=1111 1111 TL1=1100 1101 T=1111 1111 0 1101 (TL的高三位110无效去掉)定时计数器按系统时钟(C8051F)或系统时钟的12分频(8051)计数的时候是数数再跟你写的T值比较,如果一样了,看是不是要中断或其它操作,不是T值进位,你理解有问题。这种工作方式很少...

51单片机蓝牙模块
答:51单片机上的蓝牙模块编程方法如下:常用的方法有:1.通过通过电脑上的蓝牙设备给单片机上的蓝牙设备,给单片机指令起到控制作用。2.通过串口232或485或直接串口通讯链接到单片机的串口通讯引脚给单片机指令从而达到控制单片机。3.通过电脑上的wifi给单片机上的wifi指令不过这样麻烦。第一种方法最好把,不过...

对51单片机外部中断的触发方式不太明白
答:总之,中断无非是有三个关卡,一是中断标志(有没有中断),二是中断允许(允不允许中断),三是优先级比较(优先选择哪个中断)。这里强调一点,中断标志只能通过高低电平来表现,即只能将不同的触发方式通过高低电平来被CPU识别。本来是想写通俗点好让你理解为什么单片机中要设置中断标志位,看来你是理解...