请问在单片机C语言中TMOD=0x00是什么意思那个0x00又是怎么回事谢谢

请问在单片机C语言中TMOD=0x00是什么意思那个0x00又是怎么回事谢谢,第1张

TMOD=0x00:T1和T0都工作于方式0。

具体的是否打开T1和T0,或打开其中某一个,要看后面的设置。

这种方式适用于以前13位计数的单片机,现在没人用了,

除非是只看书的教授。

//假设晶振12MHZ,P17控制蜂鸣器

#include "reg51h"

sbit FMQ=P1^7;

void main(void)

{

TMOD |= 0X10; //定时器1工作于方式1,16位定时器

TH1 = 0XFE; //定时器1定时时间=500uS

TL1 = 0X0C;

ET1 = 1; //使能定时器1中断

EA =1; //开总中断

while(1)

{

}

}

void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器

{

TH1 = 0XFE; //定时器1定时时间=500us

TL1 = 0X0C;

FMQ=!FMQ;

}

#include<reg51h>

//设CPU是时钟12MHz的8051系列

data unsigned char ms;

sbit K1=P0^0;

void SetupTimer0()

{

    TMOD &= 0XF0; //仅保留T1信息

    TMOD |= 0X02; //设置T0: 定时功能,方式2,自动重载8位定时器/计数器

    TH0 = 256-250;//定时每025ms中断一次

    TL0 = 256-250;

    TR0 = 1;      //开启定时器

    ET0 = 1;      //定时器0中断打开

}

void Timer0_ISR() interrupt 1 //中断服务程序

{

    static data unsigned char us250;

    if (++us250>=4) {++ms; us250=0;}

}

void main()

{

    data unsigned char p1,p2;

    ms=0;

    SetupTimer0();

    EA = 1;               //全局中断打开

    K1 = 1;

    while(1)

    {

        if (K1) {P1=p1=0XFF; P2=p2=0x00; ms=0; continue;}

        if (ms<150) continue;

        ms=0;

        p1<<=1;        P1=p1;

        p2<<=1; p2|=1; P2=p2;

    }

}

#include<reg51h>        //51单片机头文件

#include<stdioh>        //标准输入输出头文件

unsigned char speed = 5;//定义一个字符变量,并赋值为5

                        //(想知道5代表什么可以查ASCII码,也可以当数字用)

unsigned char rec_buf[5];//定义一个可以存5个字符的数组

unsigned char rec_idx = 0;//定义一个字符变量,并赋值为0;

char putchar (char c)    //实现一个名为putchar的方法,传入一个字符,返回一个字符

{                        //{}括起来的是方法体,代表这里面的内容属于这个方法的

  ES=0;                  //ES应该是一个寄存器吧,这里是把里面清0,单片机我懂不多

  SBUF = c;              //把传入的字符写到SBUF寄存器,

  while(TI==0);          //当TI寄存器里值非0时继续,这里是一个条件等待

  TI=0;                  //把TI 寄存器清0重置

  ES=1;                  //向ES寄存器写入1

  return 0;              //返回0,结束本方法

}

void delay100ms(unsigned char n)//定义一个无返回值的方法,并需要传入一个字符

{                                //char字符型是可以当成数字来用的

  unsigned char i,j;            //定义两个字符变量

  TMOD = 0x20;                  //把寄存器置为 0010 0000 状态

  for (j = 0;j < n;++j)         //作n(n是方法传入的字符)次循环

  {                             //{}里面的东内容都进行n次循环

    for(i = 0;i < 20;i++)     //作20次循环,因为他在n次循环内,实际上是n乘以20次

    {                         //外层进行1次,这里就这进行20次

      THO=0x63;               //把TH0寄存器置为 0110 0011状态

      TL0=0x18;               //把TLO寄存器置为 0001 0100状态

      TRO=1;                  //把TRO寄存器置为 0000 0001状态

      while(!TF0);            //当TFO寄存器不为0时继续

      TF0=0;                  //把TFO重置为0

    }                            

  }

}

void init_com()   //一个无返回值,也不需要传入值的方法

{

  TMOD=0x20;        //TMOD寄存器设为  0010 0000状态

  TH1=0xfd;         //TH1寄存器设为   1111 1101状态

  TL1=0xfd;         //TL1寄存器设为   1111 1101状态

  SM0=0;            //SM0寄存器设为   0000 0000状态

  SM1=1;            //SM1寄存器设为   0000 0001状态

  REN=1;            //REN寄存器设为   0000 0001状态

  EA=1;             //EA寄存器设为    0000 0001状态

  TR1=1;            //TR1寄存器设为   0000 0001状态

  ES=1;             //ES寄存器设为    0000 0001状态

void main()

{

  unsigned char lsd_dat, i, j;//定义四个字符变量

  char buf[15];         //定义一个可以存放15个字符的字符数组

  i = 0;               //给变量i赋值为数字0

  init_com();          //执行上面定义过的init_com()方法;

  while(1)             //一个死循环,不断的执行后面{}里的代码 

  {                    

    delay100ms(speed); //执行前面定义过的void delay100ms(unsigned char n)方法

                       //首次执行时,speed是开始时定义的5

    lsd_dat = 0x01 << i;//变量lsd_dat赋值为1,也就是二进制的0000 0001

    P1 = lsd_dat;       //把P1寄存器置为 lsd_dat的值的二进制状态

    buf[0] = 'D';       //把buf字符数组的首个值赋值为字符D,ascii码为68

                        //等同于十进制数字68,二进制 0100 1000

    for (j = 0; j < 8;++j)//进行8次循环,每次循环j的值加1

        buf[j + 1] = '0' + ((lsd_dat & (0x01 << j))  1 : 0);//这段有点麻烦

                //给buf数组的第j+1个存储单元赋值,这个值是不确定的

                //如果(lsd_dat & (0x01 << j))的运算结果不是0

                //那么他就等于‘O'+1,否则就等于‘0’+0;

                //这里,我不知道‘0’是字母o的大写,还是数字0,应该是数字0

                //下面说(lsd_dat & (0x01 << j))的运算

                //lsd_dat就是上面定义的变量,他第一次执行时的值是0000 0001

                //他会不会变取决与以后的代码有没有改变他

                //(0x01 << j)这个作用是,把0000 0001 向左移动j个位,右边补0

                //比如说j的值是2,就是左移两位,那么(0x01 << j)的值就是0000 0100

                //j是每次循环都在变,所以这个值也在变

                //现在我们就当j的值运行到等于2的时候来看(lsd_dat & (0x01 << j))

                //可以看成(0x01&0x04)这是一个与运算,结果看下面

                //  0x01      0000 0001      

                //  0x04      0000 0100

                //     &      0000 0000 结果就是0

                //j=2的话,((lsd_dat & (0x01 << j))  1 : 0)=0;

                //'0' 是数字的话,值是十进制48,  

                //'0' + ((lsd_dat & (0x01 << j))  1 : 0)=48,还是字符‘0’

                //也就是说((lsd_dat & (0x01 << j))  1 : 0)的值,不是0,就是1

                //那么,'0' + ((lsd_dat & (0x01 << j))  1 : 0)他的值

                //不是48,就是49,也就是字符面的'0'或者‘1’,

    buf[9] = '\r';//buf字符数组的第10个存储空间赋值为换行符 ‘\r’

    buf[10] = '\n';//buf字符数组的第11个存储空间赋值为换行符 ‘\n’

    buf[11] = 0;   //buf字符数组的第10个存储空间赋值为0

    printf(buf);   //输出字符数组

    ++i;          //i的值自增1

    if (i >=8)    //如果i大于或者等于8

        i=0;        //把i重置为0

  }

}

void es () interrupt 4 //定义一个给51单片机发送数据的方法

{

  unsigned char dat;    //定义一个字符变量

  if(RI)                //如果RI寄存器非空,执行后面{}里面的内容

  {

    RI = 0;                 //把RI寄存器清空            

    dat = SBUF;             //把SBUF寄存器的值赋给dat变量

      SBUF = dat;           //再把SBUF寄存器设置成dat变量表示的内容

      while(TI == 0);       //等待到TI寄存器非空的时候继续下面的代码

      TI = 0;               //把TI寄存器重置清空 (时间有限,简单说了)

    if (dat == 'L'          //如果dat变量的值等与字符‘L’,执行后面{}内的代码

    {

      rec_idx = 0;      //把rec_idx变量赋值为0(此处不是字符‘0’,而是内码); 

      rec_buf[rec_idx++] = dat;//给数组rec_buf[0]赋值为dat变量的值,

                               //并且rec_idx的值自增1

    }

    else if (rec_idx > 0)//如果上面那个条件不成立,并且rec_idx大于0,

                          //则执行后面{}里的内容

    {

      rec_buf[rec_idx++] = dat;//给数组rec_buf的第rec_idx个赋值为dat变量的值,

                               //并且rec_idx的值自增1

      if (dat > '0' && dat <= '9')//如果dat大于‘0’(48)并且小于等于‘9’(57)

                                  //则执行下条代码,否则跳过下行代码

          speed = 10 - (dat - '0');//给变量speed赋值为10-(dat-48)

      rec_idx = 0;                 //给变量rec_idx赋值为0

    }

  }

}

看在这么精细,字又多的份上,分给我吧,虽然,我也是半瓶水,应该这些是没错的。现在时间都0:58了

下面程序你试下,延时函数自己加一下,几毫秒到几十毫秒#include&quot;reg51.h&quot;unsigned char i,j,m,xa[4];unsigned char table1[]={0x01,0x02,0x04,0x08};unsigned char table2[]={0x3fev0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};main(){TMOD=0x01;TF0=1;TR0=1;IE=0x82; EX0=1;m=0;while(1) { for(j=0;j&lt;4;j++) {P0=table1[j];x=a[j];P1=table2[x]; delay(); &#47;&#47;这里加个几毫秒的延时,函数体自己写下 }} }timer1() interrupt 1{TH0=0x3C; TL0=0xB0; i++; if(i==20) {i=0;m++;a[3]=m&#47;1000;a[2]=m&#47;100%10;a[1]=m&#47;10%10;a[0]=m%10;}}

TH1,TL1、TR1、TMOD是单片机的特殊寄存器 ,是用来控制计数/中断器的TMOD(工作方式控制寄存器);TH1/TL1是定时器/计数器1;

TR1=1是启动定时器1。

以上就是关于请问在单片机C语言中TMOD=0x00是什么意思那个0x00又是怎么回事谢谢全部的内容,包括:请问在单片机C语言中TMOD=0x00是什么意思那个0x00又是怎么回事谢谢、51单片机蜂鸣器发出1KHz的信号的c语言程序、如何用C语言编写一个LED灯渐变的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9520996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存