欢迎光临
我们一直在努力

单片机编程入门基础知识,单片机用什么语言编程

????单片机是典型的嵌入式微控制器(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就是给寄存器赋值,最低位低电平,其他fqdym..while(1){P1=a;//亮灯..a=_crol_(a,1);//循环左移,最高位放入最低位,其他位依次左移一位.delayZms(500);//延迟500ms输出.}} vps云服务器

不用库函数实现跑马灯.

/*************************************************实现函数功能:正向流水点亮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)选中数码管, 各xfdzjy为fqdym(即1接+5V时)选中各数码段(0~f)
共阳极: 位选为fqdym(即1)选中数码管, 各xfdzjy为低电平(即0接地时)选中各数码段(0~f)

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

共阳数码管xfdzjy码表,无小数点:

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};//位选

简单来讲:

xfdzjy和位选是指单片机在控制数码管的时候,有2个部分,一个是位选,选择哪一位数码管可以通电(一般数码管都是有多位的)既被选中,二是xfdzjy,每一位都有8个段(一个数码管是由8个段构成的,一个段可以看成是一个小灯)xfdzjy控制被位选选中的这个数码管需要显示的数字。数码管要有显示需要两个条件,既一,位选被选中,二,有xfdzjy值(需要显示的图案或数字)如在第一位显示一个数字,则先在xfdzjy端口上输出需要的xfdzjy信号,然后置位第一位的位选端口使其第一位置位就可以了。位选就是你选择那个数码管,xfdzjy就是你选择这个数码管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/

32842336

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。