51单片机入门学习例程
- 格式:docx
- 大小:49.10 KB
- 文档页数:46
51单片机新手入门实例详解1.硬件和软件准备●实验系统:EL89C单片机学习开发系统一套●电脑:具有标准串口的台式机或笔记本电脑,如果没有串口也可购买一条USB转串口线代替●工具软件:Keil uVision2(用于编写和编译源程序、仿真调试);光盘上非安装烧写软件,路径\单片机EL89C\EL89C光盘\STC52单片机下载程序\stc-isp-v4.79-not-setup\STC_ISP_V483.exe(EL89C的编程控制烧写软件)2.源程序编写和编译EL89C的8个发光二极管负极通过限流电阻接入单片机的P1.0~P1.7端口,下面的范例程序可以使这8个发光二极管轮流点亮,形成流水灯效果。
我们使用的开发工具是Keil C51,是目前世界上最优秀、最强大的51单片机应用平台之一,它集编辑、编译、仿真调试于一体,支持汇编、C语言以及混合编程。
同时具备功能强大的软件仿真和硬件仿真功能。
下面以一个简单的流水灯程序为例子来介绍Keil C51的使用方法:2.1首先在硬盘上建立一个文件夹,命名为ledtest(当然可以是其他名字),为方便程序的编写和调试,我们将调试过程中产生的文件都将放在这个目录中。
2.2启动Keil软件,点击菜单project,选择new project,然后选择你要保存的路径,输入工程文件的名字,我们现在保存到刚才建立的ledtest目录中,工程文件命名为ledtest,然后点击保存。
2.3这时会弹出下面的对话框Select Device for Target,要求你为刚才的项目选择一个CPU。
我们选择Atmel的AT89C52,如图所示,选择AT89C52之后,右边一栏是对这个单片机的基本的说明,然后点击确定。
2.4弹出如下对话框,是否添加标准的启动代码到你的项目,我们这里不理会它,点击否!2.5新建一个源程序文件,点击菜单File New,在text1框输入一个简单的程序,如下:完整程序代码如下:ORG 0000HLJMP MAINORG 0030HMAIN:MOV P1, #0FEH ;初始点亮LED1MOV R7, #0FEH ;保存P0MAIN_LP:LCALL DELAY ;延时MOV A, R7 ;RL A ;循环移位MOV R7, A ;保存了R7MOV P1, A ;点亮下一个LEDJMP MAIN_LP ;不停循环DELAY: ;延时子程序MOV R0, #0FFHMOV R1, #0FFHDLY_LP:NOPNOPDJNZ R0, DLY_LPMOV R0, #0FFHDJNZ R1, DLY_LPRETEND2.6选择菜单File Save,选择你要保存的路径,在文件名里输入文件名,注意一定要输入扩展名,我们这里是要存储一个汇编源程序文件,所以输入.asm扩展名,保存为ledtest.asm文件。
C51单片机基础学习教程C51单片机是一种常用的8位单片机,广泛应用于工业控制、家用电器和电子产品等领域。
若想学习C51单片机,首先需要掌握C语言的基础知识。
以下是一个C51单片机基础学习教程,介绍了C语言的相关内容,并给出了一个简单的例子。
一、C语言基础1.数据类型:C语言中主要有整型、字符型、浮点型等数据类型。
可以使用关键字来定义变量并赋值。
示例:int num = 10;char ch = 'A';float f = 3.14;2.运算符:C语言中有算术运算符、逻辑运算符、关系运算符等。
可以用于对变量进行运算和比较。
示例:int a = 10, b = 5;int sum = a + b;int result = (a > b) ? a : b;3.控制语句:C语言中有顺序结构、分支结构和循环结构。
可以用于控制程序的执行流程。
示例:if (num > 0)printf("The number is positive.");} else if (num < 0)printf("The number is negative.");} elseprintf("The number is zero.");4.函数:C语言中可以使用函数将代码模块化,并且可以通过参数和返回值传递数据。
示例:int add(int a, int b)return a + b;二、C51单片机入门2. 创建新项目:在Keil软件中创建一个新的项目,并选择C51单片机作为目标芯片。
3. 编写程序:在新建的项目中打开main.c文件,编写C语言程序。
可以使用C语言的代码编写方式。
示例:#include <reg51.h>//定义LED端口sbit LED = P1^0;void mai//设置LED口为输出LED=0;while (1)//LED闪烁LED=~LED;//延时for (int j = 0; j < 100; j++)}}}5. 调试程序:在Keil软件中打开调试窗口,可以对程序进行单步调试,查看程序的执行流程和变量的值。
目录例2.2.1 编写程序,点亮第一个发光二极管(part2_1.c P27 )...................................... - 4 -例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42) ........................................................................................................................................... - 5 -例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48) ........ - 5 -例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
(part2_5.c P49) - 6 -例2.8.3利用C51自带库_crol_(),以间隔500ms,实现流水灯程序(part2_6.c P53)..... - 6 -例3.2.1编写程序使第一个数码管显示8(part2.1_.1c P59)............................................. - 7 -例3.2.2让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为0.5ms,循环下去。
(part2.1_2.c P61) ................................................................................................................. - 8 -例3.3.1第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时间为0.5s,在关闭它……一直到最后一个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。
C8051F单片机入门学习流程一. 准备硬件及软件1.C8051F任意一款开发板(以C8051F330ST为例)。
2.EC3仿真器。
3.Keil C51开发软件到下载二. 开发者具备基本知识1.对MCS51架构单片机有基本了解。
2.有基本C语言及汇编语言编程经验。
3.对单片机开发过程有基本了解。
三. 学习过程如下1.安装Keil C51软件。
(1)找到Keil uv3 (版本 V8.02)软件目录,并点击C51v802.exe安装(2)点击Next(3)选I agree…, 点击Next(4)默认目录(千万不要选择其它目录),点击Next(5)填写用户名等,点击Next(6)开始安装,等待….(7)安装完成,点击Finish(8)打开Keil C软件,选择File/License Management…(9)显示如下:(10)打开Keil_lic_v2.exe,并按如下设置,点击Generate(11)拷贝LIC0内的序列号:(12)粘贴序列号到Keil C软件的New License ID Code下,(13)点击Add LIC,添加序列号成功。
如果添加失败,请重启电脑并进入安全模式,重新安装序列号。
Keil C 软件安装完毕2.安装C8051F单片机针对Keil C51驱动程序。
(1)找到Keil C51驱动程序软件目录,并点击SiC8051F_uv3_v2.31.exe安装(如果前面安装的是Keil uv2, V7.02或V7.50,请点击SiC8051F_uv2_v2.31.exe安装驱动)(2)点击Next(3)点击Next(4)点击Next(5)选择I accept…, 点击Next(6)点击Next(7)点击Next(不要更改目录)(8)开始安装(9)点击Finish安装完成!3. EC3仿真器、开发板连接及开发软件Keil C软件配置(1)将EC3仿真器与开发板连接好,按1.2.3.4步连接(2) 将EC3仿真器与电脑连接好, 仿真器指示灯亮(3) 上述连接确认无误,将开发板电源线(USB接口)与电脑连接好,再连接到开发板上(4)打开Keil Vision3软件,新建一工程ML-Test(或者将学习板光盘上的测试程序拷贝到电脑硬盘上,用Keil Vision3打开,注意将文件属性更改为可读写):(5)选择C8051F330作为CPU:(6)选择配置如下图:(7)显示如下图:(8)选择Debug项,配置如下图:(9)选择Settings项,配置如下图:(10)点击确定,完成设置;(11)编译并下载程序即可调试了;4. 用Keil C51打开软件例程,编译下载程序并运行。
实验题1、由按键S1产生外部中断1,S1按一次L0、L2、L4、L6亮,再按一次L1、L3、L5、L7亮。
2、由按键S1产生外部中断1控制T0启停,T0产生100ms定时,使4个数码管循环显示0中的一段,每段显示时间为1S。
3、T1工作于方式2,产生250uS精确定时,产生0~9秒计时,并显示在数码管上。
4、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的任何字符,都立刻转发给PC。
5、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的‘0’~‘9’,回送0~9,当收到‘a’~‘z’时回送‘A’~‘Z’。
6、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的‘1’,回送字符串“Start”,并启动T0产生1S的方波控制L0~L7闪烁,当收到‘2’时回送字符串“Stop”,并停止控制L0~L7。
7、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的‘Start’,回送字符串“Ok1”,并启动T0产生1S的方波控制L0~L7闪烁,当收到‘Stop’时回送字符串“Ok2”,并停止控制L0~L7。
8、当S1工作于独立按键方式时(需考虑按键抖动,软件滤波),按第1次,L0~L3以0.5秒为周期闪烁,串口以9600bps波特率发送字符‘1’一次,按第2次,L4~L7以1秒为周期闪烁,串口以9600bps波特率发送字符‘2’一次,按第3次,L0~L7以2秒为周期闪烁,串口以9600bps波特率发送字符‘3’一次。
再按一次回到第一次的模式,如此循环。
本人自己写的示例程序,验证可用,仅供参考学习用:附部分原理图:1、#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit P33=P3^3;sbit P35=P3^5;bit flag=1;void delay_115(int x) //延时函数{int i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void main(){EA=1; //中断总允许位IT1=0; //设置外部中断1的触发方式为电平触发EX1=1; //开外部中断P35=0;P1=0xaa; //初始化P1,方法二中必须写这句while(1);}void t1_115() interrupt 2{/* delay_115(20); //按键消抖while(!P33); //当松开按钮时程序才往下执行,否则一直停留在此处delay_115(20); //按键消抖*///方法一:/* if(P1==0x55)P1=0xaa;elseP1=0x55; *///方法二:(若使用方法二则给P1初始化为0xaa或0x55)// P1=~P1; //取反if(P33==0){delay_115(15);if(P33==0){if(flag){P1=~P1;flag=0;}}else{// key=0;flag=1;}}else{// key=0;flag=1;}}2、#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit P33=P3^3;sbit P35=P3^5;uchar count_115=0;void delay_115(int x) //延时函数int i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void main(){uchar temp_115=0xfe;EA=1; //中断总允许位TMOD=0x01; //设置T0的工作方式为方式1IT1=0; //设置外部中断1的触发方式为电平触发EX1=1; //开外部中断ET0=1; //开定时器T0TR0=1; //定时器T0启动TH0=0x3C; //设置初值TL0=0xB0;P35=0;P0=0x10; //打开4位数码管while(1){if(count_115==20) //该变量每50ms加1,当count_115等于20时,即时间间隔为1s{count_115=0; //将计数变量重置为0,以便开始下1s的定时P1=temp_115;temp_115=temp_115<<1; //左移一位temp_115=temp_115+0x01; //最低位补1}if(temp_115==0xbf) //由于只需要点亮最外圈的六个管子,故此处重置temp_115为0xfetemp_115=0xfe;}}void t0_115() interrupt 1{TH0=0x3C; //装入初值此处为50ms执行一次中断TL0=0xB0;count_115++; //每执行一次中断,该变量加1void t1_115() interrupt 2{delay_115(20); //按键消抖while(!P33); //当松开按钮时程序才往下执行,否则一直停留在此处delay_115(20); //按键消抖TR0=~TR0; //暂停或启动定时器T0}3、此题过于简单,略。
Start-51系列单片机学习板开发程序实例入门篇一、基础知识1)学习51系列单片机基本知识。
找一本单片机教材放在手边,边实战边学习2)了解STC单片机的基本特点3)了解Start-51单片机学习板的电路原理(阅读随板光盘说明书)4)学习STC单片机ISP软件及下载的方法(下载地址:)5)学习Keil C51软件的基本使用6)学习C51的基础知识二、入门实验1)Hello Word:把P23口置低,点亮一个LED灯2)基本I/O口实验:使用延时方法,控制一个LED灯闪烁(P23)3)定时器基本:使用定时器,控制一个LED灯以1S钟为周期闪烁4)定时器应用:控制4个LED以流水灯形式闪动5)外部中断:按下ENT键(P32),点亮一LED,再按下ENT键,对应LED灭6)I/O键盘检测:分别按下一键,对应的LED被点亮,再按下键,则灭7)蜂鸣器基本驱动:使用延时方法,控制蜂鸣器发声8)蜂鸣器驱动应用1:使用高低两种频率值,产生警笛声9)蜂鸣器驱动应用2:播放音乐——10)数码管显示应用1:在第一个数码管上任意显示0~9之间的数值11)数码管显示应用2:在4个数码管上“同时”显示不同数值,如1,2,3,412)综合实验1——计数器:在数码管上显示按ENT键(P32)次数,(先十六进制显示,再改十进制)13)综合实验2——秒表:在数码管上显示秒数14)综合实验3——分秒表:前两位显示分钟,后两位显示秒钟,中间小数点0.5S闪烁15)综合实验4——方波信号发生器:10~200Hz,步长10Hz,P23输出,数码管显示频率值,UP:频率加,DN:频率减。
16)综合实验5——简易跑表:前两位数码管显示秒数,后两位显示百分秒;按一下M键开始计时,再按一下停止;DN键清零17)综合实验6 ——可多段计数的跑表:按一下M键开始计时,每再按一下记下当前计数值,最多记四段;按一下UP键停止,再按一下UP键,第一个指示灯亮,并显示第一段计数值;继续按UP键,下一个指示灯亮,并显示下一段计数值;DN键清零。
这是我11月份学习51的那片机的一些练习.南来分享一下//11.1/******************************** ********点亮一个发光二极管********************************** ******/#include<reg51.h>sbit LED1=P0^0;void main(){LED1=0;}/******************************** ********点亮一个发光二极管,用while结束语句 ********************************** ******/#include<reg51.h>sbit LED1=P0^0;void main(){P0=85;while(1);}/******************************** ********利用for语句,让LED以间隔1秒的时间闪动 ********************************** ******/#include<reg51.h> #define uint unsigned int //宏定义,将难记的“unsigned int”sbit LED1=P0^0;//重新起名便于记忆的“uint”uint i,j;void main(){while(1){LED1=0;for(i=1000;i>0;i--)for(j=55;j>0;j--);LED1=1;for(i=1000;i>0;i--)for(j=55;j>0;j--);}}/******************************** *********不带参数函数的写法及调用**利用调用函数,让LED以间隔1秒的时间闪动 ********************************** *******/#include<reg51.h>#define uint unsigned int //宏定义sbit LED1=P0^0;void delay();void main(){while(1){LED1=0;delay();LED1=1;delay();}}void delay(){uint i,j; //在主函数外面定义的变量叫做全局变量。
i,j在某个子函数里面,叫做局部变量.局部变量用时随时分配,不用时自动销毁。
下次再调用时,编译器重新为其分配内存for(i=1000;i>0;i--)for(j=55;j>0;j--);}/******************************** **********带参数函数的写法及调用**利用调用函数,让LED以不同间隔的时间闪动 ********************************** ********/#include<reg51.h>#define uint unsined intvoid delay(unsigned int xms);sbit LED2=P0^1;sbit LED0=P0^0;sbit LED1=P0^2;sbit LED3=P0^2;sbit LED4=P0^3;sbit LED5=P0^4;sbit LED6=P0^5;sbit LED7=P0^6;sbitLED8=P0^7;void main(){while(1){LED0=0;LED1=0;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;LED8=0;LED2=0;delay(500);LED2=1;delay(400);}}void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}/******************************** ********* 左移********************************** *******/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar a;void main(){a=0xaa;while(1){uint i,j;P0=a;for(i=1000;i>0;i--)for(j=110;j>0;j--);a=a<<1; //左移,实验板上是右移(最高位在右边)}}/******************************** ****************利用51自带的库函数_crol_,以间隔1秒实现流水灯 ********************************** **************/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint);uchar aa;void main(){aa=0x55;while(1){P1=aa;delay(500);aa=_cror_(aa,1);}}void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}/******************************** ********* 右移********************************** *******/#include<reg51.h> #include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint);uchar aa;void main(){aa=0x55;while(1){P0=aa;delay(500);aa=_crol_(aa,1);//未实现右移}}void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}//11.2* 静态数码管显示******************************** *******//*【方法一:按次序依次点亮数字】*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint);void main(){while(1){P0=~0x3f;delay(1000);P0=~0x30;delay(1000);P0=~0x5b;delay(1000);P0=~0x4f;delay(1000);P0=~0x66;delay(1000);P0=~0x6d;delay(1000);P0=~0x7d;delay(1000);P0=~0x07;delay(1000);P0=~0x7f;delay(1000);P0=~0x6f;delay(1000);P0=~0x77;delay(1000);P0=~0x7c;delay(1000);P0=~0x39;delay(1000);P0=~0x5e;delay(1000);P0=~0x79;delay(1000);P0=~0x71;delay(1000);}}void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);} */ /*【方法二:利用数组调用、for循环实现数字显示】*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint);uchar code table[]={~0x3f,~0x30,~ 0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x77,~0x7c,~0x39,~0x5e,~0x79,~0x71};uchar num;void main(){while(1){for(num=0;num<16;num++){P0=table[num];delay(1000);}}}void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}/****************************** **********动态数码管显示:间隔1秒左移显示0-7个数 **1、通过138译码器实现位选**2、通过数组赋值实现段选******************************** ********/#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define DIS P0sbit LSA=P1^0;sbit LSB=P1^1;sbit LSC=P1^2;uchar code table[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07};void delay(uint xms);void main(void){uchar i;uchar j;for(i=0;i<8;i++){switch(i){case(0):LSA=0;LSB=0;LSC=0; break;case(1):LSA=1;LSB=0;LSC=0; break;case(2):LSA=0;LSB=1;LSC=0; break;case(3):LSA=1;LSB=1;LSC=0; break;case(4):LSA=0;LSB=0;LSC=1; break;case(5):LSA=1;LSB=0;LSC=1; break;case(6):LSA=0;LSB=1;LSC=1; break;case(7):LSA=1;LSB=1;LSC=1; break;}DIS=table[i];delay(1000);j=10;while(j--);DIS=0x00;//消隐}}void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}/****************************** *********利用定时器0工作方式1实现1秒一次闪动 ******************************** *******/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;uchar num;void main()//【定时器初始化】{TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1; //开定时器0中断TR0=1;while(1); //程序停止在这里等待中断发生}//【中断服务程序】void T0_time()interrupt 1{TH0=(65536-50000)/256; //重装初值TL0=(65536-50000)%256;num++; //num每加1次判断1次是否到20次if(num==20) //如果到了20次,说明1秒时间到{num=0; //然后把num 清0重新再计20次LED1=~LED1; //让发光管取反}} //11.4 键盘检测原理及应用实现(1)/************************************************************* *******【4.1.1】用数码管的前两位显示一个十进制数,00~59,开始显示00。