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灯渐变的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)