单片机STC89C52

新闻资讯 老翟笔记小编 2024-03-08 16:50:37 42 0

老翟笔记今日分享的是:单片机STC89C52

    单片机是典型的嵌入式微控制器(Microcontroller Unit),由运算器,控制器,存储器,输入输出设备等构成,相当于一个微型的计算机     STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。本篇文章以STC89C52为例. 本博客分几部分,如下: 1.实验一:LED灯点亮实验. 2.实验二数码管静态显示实验. 下面给出该单片机的开发原理图. 实验一:LED灯点亮实验. 实验原理:     LED 发光二极管具有单项导通性,通过 5mA 左右的电流就能正常点亮发光二极管, 电流越大,LED 的亮度就越强,但是如果通过的电流过大, 就会烧毁 LED,电流一般 有控制在 3~20mA,电路图中的 1K 的上拉电阻的作用就是限制通过 LED的电流,可称为 “限流电阻” 。     电路中 LED 采用的是共阳的接法,正极接一个限流电阻再接到电源,负极接到单片 机的引脚,把单片机引脚的电平拉低就能点亮 LED。 代码如下: //点亮一个LED灯 #include <reg52.h> //此文件中定义了 52 的一些特殊功能寄存器 sbit LED1=P1^7;//声明端口 void main() { LED1 = 0; //置 P1_7 口为低电平 ,点亮 LED } 课外拓展: //左向右流,库函数_crol_实现..右向左就用_cror_ #include <reg52.h> #include <intrins.h> #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 <reg52.h> #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 <reg52.h> #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(); //调用函数} } 数码管静态显示实验 相应的寄存器 实验原理图. 介绍代码之前先了解一些概念: 共阴极: 位选为低电平(即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 <reg52.h> #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/

本文结束,感谢您的阅读和支持,希望以上内容能给你带来帮助。本文章来自网络,由老翟笔记小编团队整理发布。

  • 随机文章
  • 热门文章
  • 热评文章

评论区