单片机交流
直播中

CDCNKA

8年用户 1228经验值
擅长:385288
私信 关注
[问答]

如何用单片机定时计数器产生高低电平脉宽不等的方波信号?

如何用单片机定时计数器产生高低电平脉宽不等的方波信号?

回帖(1)

李健

2021-10-14 11:29:55
题目具体要求:

  用单片机定时计数器产生高电平为50ms,低电平为100ms的方波信号。
实现方式:

  使用定时计数器0产生中断,单片机的晶振频率为12MHZ,方波信号在P2.0口输出。
C语言程序代码:

#include "reg51.h"                         //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


***it LSA=P2^2;
***it LSB=P2^3;
***it LSC=P2^4;//设置38译码器的输入端
u16 flag=9999,num=0;//设置数码管初值以及中断次数变量
void DelayMS(u8 i);
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void Timer0Init(void)                //中断初始化
{
        TMOD =0x01;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值 1ms
        TF0 = 0;                //清除TF0标志
        ET0 = 1;      //定时/计数器T0中断允许开启
        EA  = 1;       //开启总中断
        TR0 = 1;                //定时器0开始计时
}
void   DIGdisplay()
{
         u8 i;
         for (i=0;i<4;i++){
                 switch(i){
                     case(0): LSA = 0 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag%10]      ;DelayMS(1);  break;        //第一位数码管               
                        case(1): LSA = 1 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag/10%10]   ;DelayMS(1);break; //第二位数码管
                        case(2): LSA = 0 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/100%10]  ; DelayMS(1);break; //第三位数码管
                        case(3): LSA = 1 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/1000]    ; DelayMS(1);break; // 第四位数码管  这里延时是为了提高数码管亮度
                }                                                                                                                         
                P0 =0X00;//消隐
         }
}
void time() interrupt 1//中断函数
        {
                TL0 = 0x18;                //设置定时初值
           TH0 = 0xFC;                //设置定时初值  1ms
                num++;
                if(num==20)        /20ms则跳数字
                {
                    num=0;
                    flag--;
                }
  }
void main()
{         
        Timer0Init();
        P0 = 0x00;
        while(1)
        {       
                  DIGdisplay();
    }
}
void DelayMS(u8 i)
{
        //大约 1ms
        u8 j=100;
        while(i--)
        {
                while(j--);  
        }
}
仿真实验结果:


举报

更多回帖

发帖
×
20
完善资料,
赚取积分