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单片机的话就这么多的基础知识了,多练习才会有进步

posted @ 2020-02-26 21:10  Loving-Q  阅读(1059)  评论(0编辑  收藏  举报