单片机STC89C52

    单片机是典型的嵌入式微控制器(Microcontroller Unit),由运算器,控制器,存储器,输入输出设备等构成,相当于一个微型的计算机
    STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。本篇文章以STC89C52为例.

本博客分几部分,如下:
1.实验一:LED灯点亮实验.
2.实验二数码管静态显示实验.


下面给出该单片机的开发原理图.

单片机STC89C52_第1张图片
单片机STC89C52_第2张图片

单片机STC89C52_第3张图片


实验一:LED灯点亮实验.

实验原理:

    LED 发光二极管具有单项导通性,通过 5mA 左右的电流就能正常点亮发光二极管, 电流越大,LED 的亮度就越强,但是如果通过的电流过大, 就会烧毁 LED,电流一般 有控制在 3~20mA,电路图中的 1K 的上拉电阻的作用就是限制通过 LED的电流,可称为 “限流电阻” 。

    电路中 LED 采用的是共阳的接法,正极接一个限流电阻再接到电源,负极接到单片 机的引脚,把单片机引脚的电平拉低就能点亮 LED。

单片机STC89C52_第4张图片

代码如下:

//点亮一个LED灯
#include     //此文件中定义了 52 的一些特殊功能寄存器 
sbit LED1=P1^7;//声明端口 
void main() {    
	LED1  = 0; //置 P1_7 口为低电平 ,点亮 LED 
} 

课外拓展:

//左向右流,库函数_crol_实现..右向左就用_cror_
#include 
#include 
#define uint unsigned int;
void delayZms(uint Z){
	int i,j;
	for(i=1;i<Z;i++){
		for (j=1;j<113;j++);
	}
}
void main(){
	uint a;
	a=0xfe;//P1端口对应8个管脚,0xfe就是给寄存器赋值,最低位低电平,其他高电平..
	while(1){
		P1=a;	//亮灯..
		a=_crol_(a,1);	//循环左移,最高位放入最低位,其他位依次左移一位.
		delayZms(500);	//延迟500ms输出.
	}
}

不用库函数实现跑马灯.


/*************************************************
实现函数功能:正向流水点亮LED
**************************************************/
#include 
#define uint unsigned int;
void forward(void)
{
	P1=0xfe;         //第一个灯亮
    delayZms(200);
    P1=0xfd;         //第二个灯亮
    delayZms(200);
    P1=0xfb;          //第三个灯亮
    delayZms(200);
    P1=0xf7;          //第四个灯亮
    delayZms(200);
    P1=0xef;          //第五个灯亮
    delayZms(200);
    P1=0xdf;          //第六个灯亮
    delayZms(200);
    P1=0xbf;          //第七个灯亮
    delayZms(200);
    P1=0x7f;          //第八个灯亮
    delayZms(200); 
    P1=0xff;
    P1=0xfe;         //第一个灯亮
    delayZms(200);
}
void delayZms(uint Z){
	int i,j;
	for(i=1;i<Z;i++){
		for (j=1;j<113;j++);
	}
}
void main(){
	while(1){
		forward();
	}
}

对于以上的改进,循环点亮LED灯.

#include 
#define uchar unsigned char;
#define uint unsigned int;
uchar code ledTable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};	//不同灯端口对应的十六进制
void forward(){
	int i;
	for (i=0;i<8;i++){
		P1=ledTable[i];	//依次点亮灯
		delayZms(100);	//延迟100ms输出
	}
}
void delayZms(uint Z){
	int i,j;
	for(i=1;i<Z;i++){
		for (j=1;j<113;j++);	//延迟函数
	}
}
void main(){
	while(1){
		forward();	//调用函数
	}
}

数码管静态显示实验

相应的寄存器
单片机STC89C52_第5张图片

实验原理图.
单片机STC89C52_第6张图片

介绍代码之前先了解一些概念:
共阴极: 位选为低电平(即0)选中数码管, 各段选为高电平(即1接+5V时)选中各数码段(0~f)
共阳极: 位选为高电平(即1)选中数码管, 各段选为低电平(即0接地时)选中各数码段(0~f)

共阴数码管段选表,无小数点:
unsigned char code distab[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

共阳数码管段选码表,无小数点:

unsigned char code distab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

共阳数码管位选表-8个:
unsigned char code distab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选

简单来讲:

  • 段选和位选是指单片机在控制数码管的时候,有2个部分,一个是位选,选择哪一位数码管可以通电(一般数码管都是有多位的)既被选中,二是段选,每一位都有8个段(一个数码管是由8个段构成的,一个段可以看成是一个小灯)段选控制被位选选中的这个数码管需要显示的数字。数码管要有显示需要两个条件,既一,位选被选中,二,有段选值(需要显示的图案或数字)
  • 如在第一位显示一个数字,则先在段选端口上输出需要的段选信号,然后置位第一位的位选端口使其第一位置位就可以了。
  • 位选就是你选择那个数码管,段选就是你选择这个数码管a,b,c,d,e,f,g,h这 八段中的哪一段
#include  
#define uchar unsigned char  
sbit wela1 = P1^0;  //第一位
sbit wela2 = P1^1; //第二位 
sbit wela3 = P1^2; //第三位 
 
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//不带小数点的共阴数码管段值 
void delayms(uchar x) {  
	uchar i;   
	while(x--)  {   
		for(i=0;i<113;i++);  
	} 
} /****************************显示函数***************************/ 
void display() {       
	P0=table[0]; //传递数据    
	P1=0x01; //打开位选    
	delayms(5); //延时    
	wela1 = 0;   //关闭位选 
 
   	P1=0x02; //打开位选    
   	P0=table[1];    
   	delayms(5);    
   	wela2 = 0; 
 
   	P1=0x04; //打开位选    
   	P0=table[2];    
   	delayms(5);    
   	wela3 = 0; 
} 
void main(void) {     
	unsigned int  a;      
	while(1) {
		for(a=100;a>0;a--) //设置不断显示    
	  		display();  
	  	}
}  
//运行结果,在数码管上显示012

    


未完待续.本文会持续更新到学完该单片机.

鉴于网上代码良莠不齐,因此有必要总结一下,为了更好的学习…
由于本人刚入门,如有一些文章上的不足之处,还请各位大牛指点指点。
我的Github,虽然目前没什么东西.https://github.com/Githubforusc2018/

你可能感兴趣的:(个人)