zoukankan      html  css  js  c++  java
  • 51单片机基础知识-STC89C52

    写一写学习51之后总结得基本知识吧,单片机多练习多体会才能有进步,要不啥也得不到;

    //先写一下我定义的引脚和用到的函数,虽然没啥用
    #include <REGX52.H>
    #include<intrins.h>
        //定义LED灯
        sbit led1=P1^0;
    	sbit led2=P1^1;
    	sbit led3=P1^2;
    	sbit led4=P1^3;
        sbit led5=P1^4;
    	sbit led6=P1^5;
    	sbit led7=P1^6;
    	sbit led8=P1^7;
    
    
    //	 //定义数码管
    sbit W1 = P1^0;
    sbit W2 = P1^1;
    sbit W3 = P1^2;
    sbit W4 = P1^3;
    
    	//定义蜂鸣器
    sbit FM=P0^7;
    
    
        //定义按键
    sbit K1=P3^3;
    sbit K2=P3^4;
    sbit K3=P3^5;
    sbit K4=P3^6;
    
    //定义软件延时函数
     void delay(unsigned int x)
     {
     int a;
     int b;
     for(a=x;a>0;a--)
     for(b=110;b>0;b--);
     }
    

     下面的话就是几个比较简单的程序,基本没有什么难度,记得把注释符号去掉

    //	   简单的点灯
    //	int main(void)
    //	 {
    //     P1=0xfe;
    //	 while(1)
    //	 {
    //	 P1=_cror_(P1,1);
    //	 delay(100);
    //   	 }
    //    return 0;
    //	}
     
    
    
    
    //  数码管静态显示521
    //void main()
    //{
    //unsigned int a;
    //W4=W1=W2=W3=0; //打开所有数码管
    //while(1)
    //{
    //P0=0x92;
    //delay(500);
    //P0=0xa4;
    //delay(500);
    //P0=0xf9;
    //delay(500);
    //}
    //}    
    

      

    //数码管静态显示   1-9
    //unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    //
    //int main()
    //{
    //int a;
    //
    //W4=W1=W2=W3=0; //打开所有数码管
    //  while(1)
    //  {
    //	  P0=table[a];
    //	  delay(600);
    //	  if(a<9)
    //	  {
    //	  a++;
    //	  }
    //	  else
    //	  {
    //	  a=0;
    //	 }
    //  }
    //return 0;
    //}
    
    
    
    
       //数码管动态显示5201314
    // unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    //
    //int main()
    //{
    //
    ////W4=W1=W2=W3=0; //打开所有数码管
    //  while(1)
    //  {
    //	  P0=table[5]; 
    //	  W1=0;
    //	  delay(80);
    //	  W1=1;
    //
    //	  P0=table[2];
    //	  W2=0;
    //	  delay(80);
    //	  W2=1;
    //
    //	  P0=table[0];
    //	  W3=0;
    //	  delay(80);
    //	  W3=1;
    //
    //	  P0=table[1];
    //	  W4=0;
    //	  delay(800);
    //	  W4=1;
    //
    //	   P0=table[0];
    //	  W3=0;
    //	  delay(80);
    //	  W3=1;
    //
    //	  P0=table[2];
    //	  W2=0;
    //	  delay(80);
    //	  W2=1;
    //  }
    //return 0;
    //}
    
    
    //蜂鸣器
    //int main()
    //{
    //
    //while(1)
    //{
    //
    //   FM=0;
    //   delay(3000);
    //   FM=~FM;
    //   delay(3000);
    //}
    //return 0;
    //}
    
    
    //基本按键的使用
    //	 int main()
    //	 {
    //	 while(1)
    //	 {
    //if(K1==0)
    //{
    //delay(10);
    //if(K1==0)
    //{
    //led1=0;
    //}
    //}
    //
    // if(K2==0)
    //{
    //delay(10);
    //if(K2==0)
    //{
    //led2=0;
    //}
    //}
    //
    //if(K3==0)
    //{
    //delay(10);
    //if(K3==0)
    //{
    //led3=0;
    //}
    //}
    //
    //if(K4==0)
    //{
    //delay(10);
    //if(K4==0)
    //{
    //led4=0;
    //}
    //}
    //  else
    //  {
    //  P1=0xff;
    //  }
    //   }
    //   	}
    

     中断 定时器 通信得话就比较重要了,得自习看看了

       //  简单的中断
    /*我用的这个单片机得K1按键可以触发中断*/
    //	 int main()
    //	 {
    //
    //	 EA=1; //  全局中断打开
    //	 EX1=1;		 //外部中断1 打开
    //	 IT1=0;		//低电平触发
    //	 P1=0xB7;
    
    //	 while(1)
    //	 {
    //	 P1=_crol_(P1,1);
    //	 delay(400);
    //	 }
    //	 return 0;
    //	 }
    //
    //	 void zhonduan() interrupt 1	//中断函数
    //	 {
    //	 P1=0;
    //	 }
    

      然后写定时器。定时器的话应该有这么几个元素,用来初始化

    【EA=1;打开总中断;

    ET0=1;定时器0的中断打开;

    TR0=1;定时器0的开关打开;

    TMOD;工作反射光hi

    TH0;高八位;

    TL0;低八位;】

    //	  定时器的基本应用 1微妙的使用 实现led灯的简短闪烁
    //void Timer_0Init(void)		//1微秒@11.0592MHz
    //{
    //	TMOD &= 0xF0;		//设置定时器模式
    //	TMOD |= 0x01;		//设置定时器模式
    //	TL0 = 0xF5;		//设置定时初值
    //	TH0 = 0xFF;		//设置定时初值
    //	TF0 = 0;		//清除TF0标志
    //	TR0 = 1;		//定时器0开始计时
    //	EA=1;          // 打开总中断
    //	ET0=1;       //定时器0中断打开
    //}
    //
    //void timer() interrupt 1
    //{
    // 	TL0 = 0xF5;		//设置定时初值
    //	TH0 = 0xFF;		//设置定时初值
    //led4=~led4;
    //}
    //int main()
    //{
    //led4=0;
    //Timer_0Init();
    //while(1);
    //return 0;
    //}
    

      

     //    LED以1000ms的时间闪烁 定时器的使用
    
    // int i=0;
    //void Timer0Init(void)		//1毫秒
    //{
    //	EA=1;
    //	ET0=1;
    //	TR0 = 1;		//定时器0开始计时
    //	TMOD = 0x01;	//设置定时器模式
    //	TL0 = 0xCD;		//设置定时初值
    //	TH0 = 0xD4;		//设置定时初值
    //
    //}
    //
    //
    //	 void time()interrupt 1
    //	{
    //
    //  TL0 = 0xCD;		//设置定时初值
    //	TH0 = 0xD4;		//设置定时初值
    //	i++;
    //	}
    //
    //
    //	int main()
    //	{
    //	P1=0xfe;
    //	Timer0Init();
    //	while(1)
    //	{
    //	 if(i==10)
    //	 {
    //	 P1=_crol_(P1,1);
    //	 i=0;
    //	}
    //	}
    //	}
    

      然后就是串口通讯,这也是比较重要的,同样他也是包含很多元素的

    【SCON 或 SMO SM1

    TMOD

    TH0

    TL0

    TR0

    EA=1;

    ES=1;

    REN=1】

    // 串口通信  接收发送数据 
    //  void USART()
    //  {
    //  SCON=0x50;
    // // SM0=0 ;SM1=1;
    //  // 串口的工作方式 上面的都是写法
    //  REN=1;  //启动串口接收数据
    //  TMOD=0x20;
    //  PCON=0x00;
    //  TH1=0xfd;
    //  TL1=0xfd;
    //  ES=1;
    //  EA=1;
    //  TR1=1;
    //  }
    //
    // void  main()
    // {
    //USART();
    //while(1);
    //}
    //
    //void uuu() interrupt 4
    //{
    //unsigned char date;
    //
    //date = SBUF; //取出接受的数据
    //  RI = 0;		 //清处接受中断标志位
    // SBUF = date;
    // while(!TI);
    // TI=0;	 //清除发送中断位
    // }
    

      然后下面就是PWM

    先写个软件延时,体会内涵

    //最简单的PWM写法	 软件延时
    //sbit LED=P1^4;    //LED
    //
    //void delay(unsigned int i)
    //{
    //	while(i--);
    //	}
    //
    //void main()
    //{
    //	while(1)
    //	{
    //		int i;
    //		for(i=10;i<=1000;i=i+5)
    //		{
    //		LED=0;		    //低电平点亮
    //		delay(i); 
    //		LED=1;         //高点平灭
    //		delay(1000);
    //		}			
    //		for(i=1000;i>=10;i=i-20)
    //		{
    //		LED=0;		    //低电平点亮
    //		delay(i); 
    //		LED=1;         //高点平灭
    //		delay(1000);
    //		}	
    //	}		
    //}
    

      然后写一个以特定亮度运行的LED灯

    //unsigned int time=0;
    //unsigned int PWM=20;
    // void Timer0Init(void)		//   100微秒@11.0592MHz
    //{
    //	TMOD = 0xF0;		//设置定时器模式
    //	TL0 = 0xAE;		//设置定时初值
    //	TH0 = 0xFB;		//设置定时初值
    //	TF0 = 0;		//清除TF0标志
    //	TR0 = 1;		//定时器0开始计时
    //	ET0=1;
    //	EA=1;
    //
    //}
    //
    // void timer()interrupt 1
    //	 {
    //   	TL0 = 0xAE;	
    //	TH0 = 0xFB;	
    //	time++;
    //	}
    //
    //
    //int main()
    //{
    //  Timer0Init();
    //  while(1)
    //  {
    //  if(time>100)
    //  {
    //  time=0;
    //  }
    //  if(time<PWM)
    //  {
    //  led5=0;
    //  }							   
    //  if(time>=PWM)
    //  {
    //  led5=1;
    //  }
    //  }  
    //  return 0;
    //  }
    

      最后是必须会的呼吸灯

    120毫秒更新占空比  2000微秒的周期 50%-95%的循环,每次增加5%亮度

    unsigned int   N=0;
    unsigned int T=0;
    unsigned  int PWM_V=10;
    bit BZW=0;
    
    
    void Timer0Init(void)		//100微秒@11.0592MHz
    {
    //	AUXR &= 0x7F;		//定时器时钟12T模式
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x02;		//设置定时器模式
    	TL0 = 0xA4;		//设置定时初值
    	TH0 = 0xA4;		//设置定时重载值
    //	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	EA=1;
    	ET0=1;
    }
    
    int main()
    {
    Timer0Init();
    while(1);
    return 0;
    LED=1;
    }
    
    void uuuu() interrupt 1
    {
    T++;
    N++;
    if(N==PWM_V)
    {
    LED=0;
    }
    if(N==20)
    {
    N=0;
    LED=1;
    }
    if((T==12000)&&(BZW==00))
    {
    PWM_V++;
    T=0;
    if(PWM_V==19)
    {
    BZW=1;
    }
    }
    if((T==12000)&&(BZW==1))
    {
    PWM_V--;
    T=0;
    if(PWM_V==10)
    {
    BZW=0;
    }
    }
    }
    

      然后是串口通信控制LED,为以后的2.4G 蓝牙做基础

    unsigned char ui;
    
    void UartInit(void)		//9600bps@11.0592MHz
    {
    	PCON &= 0x7F;		//波特率不倍速
    	SCON = 0x50;		//8位数据,可变波特率
    //	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
    //	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//清除定时器1模式位
    	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
    	TL1 = 0xFD;		//设定定时初值
    	TH1 = 0xFD;		//设定定时器重装值
    //	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    
    	EA=1;
    	ES=1;
    	REN=1;
    }
    
    int main()
    {
    UartInit();
    while(1)
    {
    if(ui=='1')
    {
    led5=0;
    }
    
    if(ui=='2')
    {
    led5=1;
    }
    }
    
    return 0;
    }	
    
    void uuu()interrupt 4
    {
    unsigned char date;
    date = SBUF;
    ui = SBUF;
    RI=0;
    SBUF=date;
    while(!TI);
    TI=0;
    }
    

      51单片机的话就这么多的基础知识了,多练习才会有进步

  • 相关阅读:
    在 Solaris 下有内核参数对应 TIME_WAIT 状态保持时间
    Properties获取属性
    jQuery Validate 动态添加验证
    解决struts2 action中double型在页面默认带有小数点的方法
    jsp、java下载附件
    方法参数数量不确定时应该怎么做?
    eclipse的java转web项目
    iBatis批量操作
    ORA19706和_external_scn_rejection_threshold_hours的前世今生
    Oracle官方书籍阅读顺序
  • 原文地址:https://www.cnblogs.com/Loving-Q/p/12369078.html
Copyright © 2011-2022 走看看