找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2237|回复: 2
收起左侧

求助用定时器只取一段方波出现 怎么用

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:221336 发表于 2017-8-29 18:26 | 显示全部楼层 |阅读模式
QQ图片20170829180917.jpg


如上图   用定时器只取一段方波出现 怎么用
使用按键  出现一段方波   也可以不用定时器
有个问题 {case 1:这个for循环执行不了()}
#include<reg52.h>  

/*****************************************************************/         
unsigned char a,s,x,y,z;
int flag;
sbit ANJIAN=P2^0;  //按键

sbit  P00=P0^0;
sbit  P01=P0^1;

/*------------------------------------------------
                定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
//TH0=0x00;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
//TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}

/*------------------------------------------------
             定时器中断子程序
50hz,每秒50个脉冲,就是100次跳变。1/100 =10ms 这是频率
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{

TH0=(65536-50)/256;         //重新赋值 12M晶振计算,指令周期1uS,
TL0=(65536-50)%256;        //0.1mS方波半个周期0.05mS,

if(ANJIAN==0)        //按键按下
        {
                a++;         //按键累加
                while(!ANJIAN);
         }
       
        switch(a)
                {
                
                case 1:       
                        P01=0;   //正转
                        if(flag++==10)  //        计数10次
                                {
                                 P00=!P00;        //          取反
                                 flag=0;    //  清除i
                                }
                                 break;
//case 1:
//这个for循环执行不了
//         P01=0;   //正转       
//         for(i=0;i<5;i++)
//                                 {
//                                 P00=0;
//                      delay(50);           
//                 P00=1;
//                                 delay(50);
//                                }
//                                 break;//         

                                                                                
                case 2:a=0;break;
                 
                default:break;       
                }

}       

       
               


/*------------------------------------------------
                 主函数
------------------------------------------------*/
main()
{

while(1)
        {
        Init_Timer0();
        }       
}

//
///*------------------------------------------------
//            延时函数 11.0592MHZ z=1时精确延时1ms
//------------------------------------------------*/
//
//void  delay(z)
//{
//        for(x=z;x>0;x--)
//        for(y=848;y>0;y--);
//}







回复

使用道具 举报

ID:123289 发表于 2017-8-31 20:17 | 显示全部楼层
1、设置一个寄存器R_count。
2、按1,就让R_count=10,按2,就让R_count=20。
3、做一个实现题图的子程序SUB_plus。
4、如果R_count<>0,就调用SUB_plus子程序R_count次,完成后将R_count清0;如果R_count=0就不调。
回复

使用道具 举报

ID:229930 发表于 2017-8-29 20:45 | 显示全部楼层
定时器在中断的时候电压反转就行了,定时器做最好。要精确的话,直接用汇编编写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表