我有个流水的亮暗程序不明白求指教。

[复制链接]
2420|7
 楼主| gp418693119 发表于 2012-7-10 20:43 | 显示全部楼层 |阅读模式
AI, AN, ADDR, AD, DDR
#define Ton 40
oid Inittime()
      {
          TMOD = 0x02; //定时器0,工作方式2,自动重装
          TH0 = 256-Ton;
          TL0 = 256-Ton;
          ET0 = 1;
         EA = 1;
         TR0 = 1;
     }
//定时器0中断
     void time0() interrupt 1 using 0
      {
           Maikuan++;
      }
void main()
       {
      
             uchar i = 0,j = 0; //初始化i,j
    ENLED=0;ADDR0=0;ADDR1=1;ADDR2=1;ADDR3=1;
             Inittime();
         while (1)
           {
               //第1,3,5,7个灯半亮,其余的全亮。              
            for(i=254; i>0; i--)      
            {
                while ( Maikuan!=20)
                {
                        LED = 0x00;
                }
                while ( Maikuan!=200)
                {
                        LED = 0x55;
                }
   
               Maikuan = 0;
            }
程序我没全写上去,我就是不明白定时器初值为什么这样设定,还有i为什么从254开始--,还有 半亮和全亮,maikuan不是应该为100和200吗?我刚开始学单片机,很多不懂,虚心求教。
NE5532 发表于 2012-7-10 20:46 | 显示全部楼层
先不要学人家翻花样,老老实实用最简单的方法来写,把原理弄懂了再翻。这种写法不过是多了几个表达式而已,效果跟最简单的写法一样!
ayb_ice 发表于 2012-7-10 20:55 | 显示全部楼层
这个主循环写的并不可靠
 楼主| gp418693119 发表于 2012-7-10 20:59 | 显示全部楼层
2# NE5532 恩 好的、
wukunshan 发表于 2012-7-10 21:50 | 显示全部楼层
1.定时器初值这样设定的目的是为了方便更改定时时间,只要在宏定义里更改Ton值就可以了。
2.for循环里i的值可以从任意值开始。
3.在这个程序里,先是8个等全亮(LED=0x00),定时器中断20次后,2、4、6、8亮1、3、5、7个灭(LED=0x55),定时器中断200-20=180次后又从头开始。可见2、4、6、8亮的时间比1、3、5、7亮的时间长,所以看起来2、4、6、8亮度比1、3、5、7高。
4.在这个程序里,maikuan值作为计数变量,用来计数定时中断的次数,从而控制LED赋值的时间,这是一种笨拙的方法。相比之下,楼主的思路要高明得多。
 楼主| gp418693119 发表于 2012-7-10 22:00 | 显示全部楼层
5# wukunshan
谢谢这位仁兄的详细解释,明白了 。
joyme 发表于 2012-7-10 23:28 | 显示全部楼层
这个for循环没什么用
fjzzclc 发表于 2012-7-13 16:26 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

84

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部