学下基础,再看看吧 |
lwh999995 发表于 2019-6-6 22:39 我上小学时老师就是这样批改作业的!认真仔细!有评语! |
TMOD=0x01 |
还有总开关EA=1;定时器开关ET0=1; |
大坏蛋997 发表于 2019-6-6 16:39 楼主TF0用得没错。 |
相互借鉴,条条大路通罗马 |
D定时器哪里的问题,在看下定时器的用法吧 |
定时器TFO多看看,这个地方弄错了 |
看到2次亮的间隔应该100毫秒转为频率100/1000=。1;1/。1=10赫兹,因此是可以看到的,你在实际板上看到一直亮是因为之前错误造成的,按我的代码你再试看是否看到闪烁了? |
仿真能看到闪烁,上的图是比较慢了点,电脑越用越慢,在另一台电脑上闪烁就快点,也是能看到的,所谓人眼暂留特性值在60赫兹以上人眼就无法分辨,60赫兹以下就会感觉闪烁,可以计算50/1000=0.05,1/0.05=20赫兹,是人眼可以看到的。 |
TMOD=0x01 //16位定时器 |
xianfajushi 发表于 2019-6-6 10:21 仿真能看得见变化吗??我实际运行的时候,50ms间隔太短了,肉眼看不出来变化,小灯就一直亮着的 |
aking991 发表于 2019-6-6 08:47 是的,大家热情的回答,我才知道,是间隔时间太短了,肉眼根本看不出来变化 |
谢谢你的回答,现在我还是一个菜鸟,你那个仿真界面,看的我有点懵逼【笑哭】,向层主学习 |
47okey 发表于 2019-6-5 23:05 谢谢你的代码,参照修改了一下,效果实现了,可能我才学,表述的大家有的可能没太明白【笑哭】 |
看LED灯闪烁一次就是100毫秒即50亮+50灭 ![]() |
定时计数器我搞了半天也没搞明白 |
定时器原理你要看下,模式1,需要中断服务程序的,你中断服务程序都没有,在主程序中赋初值了 |
50ms间隔时间人眼观察不出灯的变化,用示波器才能观测到,建议先把延长200ms以上先看其是否有变化就知道了 |
各显神通。 |
TMOD |= 0x10;0x10 是:选择定时器1(不是定时器0)的16位定时器模式,TH0和TL0都是定时器0的寄存器。TR0=1是启动定时器0(T0)。如果要用定时器1,那么TH0,TL0改为TH1,TL1,TR0改为TR0,TF0改为TF1。 如果要用定时器0,那么就要把TMOD|=0x01;。 一个建议,如果再整个程序中没用到另一个定时器,那么建议直接TMOD=0x01;这样避免某些原因把定时器/计数器的工作方式改成其它的工作方式。比如变成计数器模式。 |
首先看主函数,调用定时器函数,赋初值50ms,随后判断是否定时结束,若是,则点亮灯(因为输出高电平,灯就可以亮,1表示高电平,0表示低电平,进行取反操作即可实现灯的亮灭) |
1.TMOD=0x01 //16位定时器 2.闪烁时间太短,改成TMOD=0x01后,10次LED求反一次 3.楼主用的是查询方法,而不是中断方法,所以所说的看不到中断函数很正常。 。。。 while(1) { loop:if(TF0==1) { //led=~led; TH0=0x3c; TL0=0xb0; TF0=0; i++; if(i==10) { i=0; led=!led; } } else 。。。 |
运行看上图 |
看一下运行输出波形就知道![]() |
建议臃肿,你这样写程序不是很规范 |
漏了将ET0和EA置1吧,有很多软件都可以直接生成配置中断的函数.填入参数即可自动生成,根本没必要自己去记. |
谢谢各位大佬的回答,感谢,感谢 |
大哥,中断的处理函数都没有 |
1.没看到你的定时器中断函数 2.小灯闪烁50ms人眼分辨不出来(看起来就是一直亮),先实现200ms闪烁 3.搞清楚定时器的原理,就是你设置一个值,单片机会从0加到你设的那个值,然后清零,重新开始计数(简单,数据手册有) |
xuyaqi 发表于 2019-6-5 08:51 好的,谢谢大佬,我再看看,改改 |
m182892 发表于 2019-6-5 08:34 是的,感觉学学汇编,学一些基础东西,更方便理解吧【笑哭】 |
yzwzfyz 发表于 2019-6-5 08:08 好的,我再仔细学学,谢谢大佬指点 |
你如果以前是用汇编编程,现在改为C编程,首先需要自己改变思维模式,比较难啊。 |
问题3用取反运算符 led=!led; |
另外一个6楼说的对是01不是10 |
计算机系统都是顺序执行的,自上而下逐句执行指令. TF0=1为溢出即计满标记,置0重新开始计数,那么整个程序顺序读起来设计意图就很明确了. |
首先直接看到的GOTO语句形成的循环此举实属头上安头!因为已经写在了无限循环中,假如写在无限循环外,那用GOTO构成循环是需要的. |