懒猫爱飞

牛年单片机学习日记--PWM波练习

0
阅读(1345)

Mon Feb 16 2009                  小雨

   今天在图书馆借了几本关于单片机和Protel等专业方面的书,又在图书馆埋头苦读了一天,现在虽然有点累,不过还是很有收获的,很多东西突然又记起来了,呵呵,原来俺这宝刀还未老呀!
   虽然学习得一步一步的来,但是更要讲技巧,不然只能是事倍功半,呵呵,今天先复习一下理论知识,每天进步一点点,俺相信俺能行……
  今天看了看定时器,好的就练习一下定时器,顺便再把独立键盘也写上了,主要设计的思路是用定时器2定时设置频率在P2.0口输出PWM波调节占空比就可以控制LED有亮度,可是由于proteus仿真不出亮度,结果我把LED的正负极反过来接,就只能在仿真界面上看在闪烁了,呵呵……不过这也不错,毕竟能看到结果了……
 
 
   这次用的是AT89S52单片机,下面是俺的小程序:
#include <reg52.h>     
#define uchar unsigned char
#define uint  unsigned int
 
sbit LED10 = P2^0;          //要控制的LED 灯
sbit K1= P3^2;              //按键K1
 
uchar scale;     //用于保存占空比的输出0 的时间份额,总共10 份
 
void initial();
/*************************************************/
/*      主程序                                      */
/*************************************************/
void main(void)       
{
        uint n;
  initial();               
        while(1)  
        {       ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
 
   if(!K1)      //如果读到K1 为0
                {
                  for(n=0;n<1000;n++); //等待按键稳定
                  while(!K1);     //等待按键松开
                  for(n=0;n<1000;n++);    //等待按键稳定松开
 
          //for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度
                 scale++;
                 if(scale==10)scale=0;
     }     
        }
}
/***********************************************/
/*        初始化子程序               */
/***********************************************/
void initial()
{
    RCAP2H =0xF3; //赋T2 的预置值,溢出1 次是1/1200 秒钟
    RCAP2L =0x98;     
    TR2=1;          //启动定时器
    ET2=1;          //打开定时器2 中断
    EA="1"; 
}
/*************************************************/
/*             1/1200 秒定时器2 中断                    */
/*************************************************/
timer2() interrupt 5    
{
        static uchar tt; //tt 用来保存当前时间在一秒中的比例位置
        TF2=0;
 
        tt++;
        if(tt==10) //每1/120 秒整开始输出低电平
        {
                tt="0";
                if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
                LED10=0;    
        }
                
        if(scale==tt)    //按照当前占空比切换输出高电平
        LED10=1;
                        
}
 
K1键用来控制亮度,每按一次增加一个亮度级别。
   单片机其实挺好玩的,虽然俺写的都是些小程序,不过慢慢来,俺会玩出新花样的……好了,明天再接着练习了,今天还得把实习报告写一写呢。