打印

新人求助 51单片机

[复制链接]
2206|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
javachen|  楼主 | 2019-11-19 09:40 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
想做个东西之前是做硬件的 一步步的学   上电延时3s后 I/0输出高电平  3s后高电平变为500us周期 50%占空的方波
[code]#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit led=P2^0;         //定义P20口是led


/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能                   : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Init()
{     //T1设置
        TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

        TH0=0XFF;        //给定时器赋初值,定时250US
        TL0=0X06;
        ET0=1;//打开定时器0中断允许
        TR0=1;//打开定时器       
        EA=1;//打开总中断
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        Timer0Init();  //定时器初始化
        while(1);               
}

/*******************************************************************************
* 函 数 名         : void Timer0() interrupt 1
* 函数功能                   : 定时器0中断函数
* 输    入         : 无                                                                                          
* 输    出         : 无
*******************************************************************************/
void Timer0() interrupt 1
{
        static u16 i;
        TH0=0XFF;        //给定时器赋初值,定时250Us
        TL0=0X06;
        i++;
        if(i<=12000)
        {
                led=0;       
        }       
       
        if(i>12000&&i<24000)
        {   
                led=1;       
        }
        if(i>=24000)
        {  
                ??????/不会;     
        }   
                       
}
上面是延时的

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED=P2^0;    //定义LED端口

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

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=0x00;                  //重新赋值
TL0=0x06;

LED=~LED;        //
定时的   
分开来,都能实现 ,就是合不起来  有没有人交一下  ,之前程序都是找人做的 ,

使用特权

评论回复

相关帖子

沙发
javachen|  楼主 | 2019-11-19 09:41 | 显示全部楼层
大神么  新手求助

使用特权

评论回复
板凳
javachen|  楼主 | 2019-11-19 15:58 | 显示全部楼层
384432662 发表于 2019-11-19 15:34
void Timer0() interrupt 1
{
        static u16 i;

好像可以了大神膜拜

使用特权

评论回复
地板
javachen|  楼主 | 2019-11-19 16:02 | 显示全部楼层
javachen 发表于 2019-11-19 15:58
好像可以了大神膜拜
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0;    //定义LED端口
bit flag;

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer01(void)
{
TMOD |= 0x11;          //             
TH0=0xff;              //
TL0=0x06;           
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
TH1=0xff;
TL0=0x06;
ET1=1;           //定时器中断打开
TR1=1;
EA=1;
PT1=1;
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
Init_Timer01();
while(1);
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
TH1=0xff;                  //重新赋值
TL1=0x06;
flag=~flag;        //指示灯反相,可以看到闪烁
       

}
void Timer0() interrupt 1
{
        static u16 i;
        TH0=0XFF;        //给定时器赋初值,定时250Us
        TL0=0X06;
        i++;
        if(i<=12000)
        {     
                led=0;
                           
        }       
       
        if(i>12000&&i<24000)
        {   
                led=1;       
        }
        if(i>=24000&&i<=48000)
        {                   
                led=flag;
                          
        }   
       
       
}




为嘛我这样写不对  ,老是循环 i到65535 之后就重复 你这个不会啊

使用特权

评论回复
5
javachen|  楼主 | 2019-11-19 16:17 | 显示全部楼层
384432662 发表于 2019-11-19 16:15
不是大神。。。 我也在学    我那个i>=24000后就不会执行i++这个语句了 ...

好吧  你学的深一点  我还在初学  

使用特权

评论回复
6
javachen|  楼主 | 2019-11-19 16:41 | 显示全部楼层
384432662 发表于 2019-11-19 16:15
不是大神。。。 我也在学    我那个i>=24000后就不会执行i++这个语句了 ...

我想问下   如果要是在15s的时候 检测P2.1口有没有高电平输入 有的话脉冲保持 没有检测到脉冲停止 程序怎么改

使用特权

评论回复
7
javachen|  楼主 | 2019-11-20 16:05 | 显示全部楼层
假如时间不够 在15S之后还有延时的话  是不是需要用两个定时器  将脉冲产生的和延时分下来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

19

帖子

0

粉丝