当前位置:文档之家› 单片机35个实例

单片机35个实例

单片机35个实例
单片机35个实例

1.闪烁灯

1.实验任务

如图4.1.1所示:在端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为秒。

2.电路原理图

图4.1.1

3.系统板上硬件连线

把“单片机系统”区域中的端口用导线连接到“八路发光二极管指

示模块”区域中的L1端口上。

4.程序设计内容

(1).延时程序的设计方法

作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为秒,相对于微秒来说,相差太大,

所以我们在执行某一指令时,插入延时程序,来达到我们的要

求,但这样的延时程序是如何设计呢?下面具体介绍其原理:

如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒

机器周期微秒

MOV R6,#20 2个 2

D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498

DJNZ R6,D1 2个2×20=40 10002 因此,上面的延时程序时间为。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7

=248时,延时10ms,以此为基本的计时单位。如本实验要求

秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20

D1: MOV R6,#20

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET

(2).输出控制

如图1所示,当端口输出高电平,即=1时,根据发光二极管

的单向导电性可知,这时发光二极管L1熄灭;当端口输出低

电平,即=0时,发光二极管L1亮;我们可以使用SETB 指

令使端口输出高电平,使用CLR 指令使端口输出低电平。5.程序框图

如图4.1.2所示

图4.1.2

6.汇编源程序

ORG 0

START: CLR

LCALL DELAY

SETB

LCALL DELAY

LJMP START

DELAY: MOV R5,#20 ;延时子程序,延时秒

D1: MOV R6,#20

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET

END

7. C语言源程序

#include <>

sbit L1=P1^0;

void delay02s(void) 4.2.14.2.14.2.24.3.14.3.1 4.3.20F0F4.4.14.4.1

4.4.24.

5.14.5.20F0F0F0F7f7f7f7f4.

6.14.6.2实验任务

如图13所示,利用AT89S51单片机的P0端口的-连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。在数码管上循环显示0-9数字,时间间隔秒。

2. 电路原理图

图4.7.1

3. 系统板上硬件连线

把“单片机系统”区域中的AD0-AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;要求:AD0与a相连,AD1与b相连,AD2与c相连,……,AD7与h相连。

4. 程序设计内容

(1. LED数码显示原理

七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2

(2.由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着

数字0-9的顺序,把每个数字的笔段代码按顺序排好!

建立的表格如下所示:TABLE DB 3FH,06H,5BH,4FH,

66H,6DH,7DH,07H,7FH,6FH

5.程序框图

图4.7.2

6.汇编源程序

ORG 0

START: MOV R1,#00H

NEXT: MOV A,R1

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

INC R1

CJNE R1,#10,NEXT

LJMP START

DELAY: MOV R5,#20

D2: MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

DJNZ R5,D2

RET

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

7. C语言源程序

#include <>

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char dispcount;

void delay02s(void)

{

unsigned char i,j,k;

for(i=20;i>0;i--)

for(j=20;j>0;j--)

for(k=248;k>0;k--);

}

void main(void)

{

while(1)

{

for(dispcount=0;dispcount<10;dispcount++)

{

P0=table[dispcount];

delay02s(); }

}

}

8.按键识别方法之一

1.实验任务

每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的到显示出其的二进制计数值。

2.电路原理图

图4.8.1

3.系统板上硬件连线

(1.把“单片机系统”区域中的RD端口连接到“独立式键盘”区域中的SP1端口上;

(2.把“单片机系统”区域中的-端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,连接到L1,连接到L2,连接到L3,连接到L4上。

4.程序设计方法

(1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某

个命令只执行一次,而在按键按下的过程中,不要有干扰进

来,因为,在按下的过程中,一旦有干扰过来,可能造成误

触发过程,这并不是我们所想要的。因此在按键按下的时候,图4.8.2

要把我们手上的干扰信号以及按键的机械接触等干扰信号

给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干

扰信号,但实际上,会增加硬件成本及硬件电路的体积,这

是我们不希望,总得有个办法解决这个问题,因此我们可以

采用软件滤波的方法去除这些干扰信号,一般情况下,一个

按键按下的时候,总是在按下的时刻存在着一定的干扰信

号,按下之后就基本上进入了稳定的状态。具体的一个按键

从按下到释放的全过程的信号图如上图所示:

从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。

由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

(1.对于按键识别的指令,我们依然选择如下指令JB BIT,REL 指令是用来检测BIT是否为高电平,若BIT=1,则程序转向

REL处执行程序,否则就继续向下执行程序。或者是JNB

BIT,REL指令是用来检测BIT是否为低电平,若BIT=0,

则程序转向REL处执行程序,否则就继续向下执行程序。

(2.但对程序设计过程中按键识别过程的框图如右图所示:图4.8.3

5.程序框图

图4.8.4

6.汇编源程序

ORG 0

START: MOV R1,#00H ;初始化R7为0,表示从0开始计数

MOV A,R1 ;

CPL A ;取反指令

MOV P1,A ;送出P1端口由发光二极管显示REL: JNB ,REL ;判断SP1是否按下

LCALL DELAY10MS ;若按下,则延时10ms左右JNB ,REL ;再判断SP1是否真得按下

INC R7 ;若真得按下,则进行按键处理,使MOV A,R7 ;计数内容加1,并送出P1端口由CPL A ;发光二极管显示

MOV P1,A ;

JNB ,$ ;等待SP1释放

SJMP REL ;继续对K1按键扫描

DELAY10MS: MOV R6,#20 ;延时10ms子程序L1: MOV R7,#248

DJNZ R7,$

DJNZ R6,L1

RET

END

7. C语言源程序

#include <>

unsigned char count;

void delay10ms(void) {

unsigned char i,j; for(i=20;i>0;i--)

for(j=248;j>0;j--); }

void main(void)

{

while(1)

{

if(P3_7==0)

{

delay10ms();

if(P3_7==0)

{

count++;

if(count==16)

{

count=0;

}

P1=~count; while(P3_7==0); }

}

}

}

9.一键多功能按键识别技术

1.实验任务

如图4.9.1所示,开关SP1接在RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。2.电路原理图

图4.9.1

3.系统板上硬件连线

(1.把“单片机系统”区域中的RD端口连接到“独立式键盘”区域中的SP1端口上;

(2.把“单片机系统”区域中的-端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口

上;要求,连接到L1,连接到L2,连接到L3,连接到

L4上。

4.程序设计方法

(1.设计思想由来

在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。

(2.设计方法

从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程序设计的框图。

5.程序框图

图4.9.2

6.汇编源程序ID EQU 30H SP1 BIT P3.7 L1 BIT P1.0

L2 BIT P1.1

L3 BIT P1.2

L4 BIT

ORG 0

MOV ID,#00H START: JB K1,REL LCALL DELAY10MS

JB K1,REL

INC ID

MOV A,ID

CJNE A,#04,REL

MOV ID,#00H

REL: JNB K1,$

MOV A,ID

CJNE A,#00H,IS0

CPL L1

LCALL DELAY

SJMP START

IS0: CJNE A,#01H,IS1 CPL L2

LCALL DELAY

SJMP START

IS1: CJNE A,#02H,IS2

单片机35个实例1(汇编)

1.闪烁灯 1.实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.电路原理图 图4.1.1 3.系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容 (1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此, 我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太 大,所以我们在执行某一指令时,插入延时程序,来达到我们 的要求,但这样的延时程序是如何设计呢?下面具体介绍其原 理: 如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒 机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248 =498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002

因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7 =248时,延时10ms,以此为基本的计时单位。如本实验要求 0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如 下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2).输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据 发光二极管的单向导电性可知,这时发光二极管L1熄灭;当 P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我 们可以使用SETB P1.0指令使P1.0端口输出高电平,使用 CLR P1.0指令使P1.0端口输出低电平。 5.程序框图

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.doczj.com/doc/137123300.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

7个基于STM32单片机的精彩设计实例

7个基于STM32单片机的精彩设计实例,附原理图、代码等相关资料 STM32单片机现已火遍大江南北,各种教程资料也是遍布各大网站论坛,可谓一抓一大把,但大部分都差不多。今天总结了几篇电路城上关于STM32的制作,不能说每篇都是经典,但都是在其他地方找不到的,很有学习参考意义的设计实例。尤其对于新手,是一个学习stm32单片机的“活生生”的范例。 1、STM32与FPGA强强联合,实现完整版信号发生器 话说之前看过作者的另外一个作品,是STM32和FPGA实现的示波器,当然感觉不做。现在作者又推出了信号发生器。重点是TFT触屏来控制波形,相当于一个终端,STM32用来通信,起到了FPGA和TFT之间的纽带作用。最后波形输出作者使用了巴特沃斯滤波器,让输出的波形更加干净。虽然以高端的信号发生器无法比拟,但是用于平时信号输出使用时足够了。 2.采用STM32单片机基于uCOS II系统控制VS1053B语音芯片制作的MP3播放器 一看到uCOS II,就觉得是个高级货,绝对不是一般的小打小闹。该制作耗时半年能完成制作,不得不佩服作者的坚持。这个使用了VC1053B音频模块,TFT液晶显示,还是用了NRF24L01无线模块(暂时没明白这个无线如何使用的),最后作者还很细心的提供了理论指导,方便大家制作。 3.使用OV7670让STM32转身变成照相机(附原理图、代码源文件) 经常使用STM32的同学有没有做过照相机呢?虽说在智能手机遍布的时代,正经相机也要束之高阁了。但是能使用STM32做个相机,拿出去拍个照也是非常拉风的。这个相机使用了ST32F103C8T6(ST32F103C8T6数据手册),摄像头用的是OV7670,带SD卡和触摸屏2.4寸,整体尺寸和卡片机差不多。 4.基于STM32的手机WIFI 控制四轴飞行器设计 我们平时看到的四轴飞行器多是遥控手柄控制的,给你推荐的这个是手机通过wifi就可以控制了,重点在作者还提供了安卓版本的app,直接安装就可以控制飞行器了,当然前提是要根据作者提供的原理图、pcb、代码做出个飞行器了。对APP感兴趣的朋友不妨写写ios 版本的。 5、使用STM32F103RC实现数字万用表设计,具备常用功能 作为电子工程师,最经常用到的就是万用表,可以很少人知道万用表里面的结构、测电压的过程。现在就有人用STM32F103(STM32F103数据手册)做了个数字万用表,只有三个常用功能:测电压(0-50v),测电阻(1k-390k),短路档,使用了LCD5110显示数据,大家不妨动动手开发其他功能。 6、基于RFID技术、以STM32为终端的智能小区管理系统 话说现在高档小区越来越多,对小区的智能化管理也在日渐智能化。这个设计就使用了当下很火的wifi智能控制。系统由多个智能服务终端和系统服务器所组成。智能服务终端就是一个基于STM32的完备系统,涵盖了室内环境监测、高温火警GSM报警、A卡管理助手、天气助手、用户电子账单、万年历、小区意见反馈等功能。

单片机C语言编程实例

单片机C语言编程实例 前言 INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着 单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的 多种芯片,从而扩充和扩展了其品种和应用领域。 C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。将C语言向单片机上的移植,始于20世纪80年代的中后期。经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的。. C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广.最多的计算语言之一。C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言.与汇编语言相比,C51在功能上.结构上以及可读性.可移植性.可维护性等方面都有非常明显的优势。目前 最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51。第 一章单片机C语言入门 1.1建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码, 这样单片机才能执行编写好的程序。KEIL uVISION2是众多单片机应用开发软 件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑, 编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面 和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真 方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周 立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个

基于protuse的单片机模拟的实例

本人对单片机的一些了解,在这里和大家分享。 (1)基于AT89C52的同步串口通信 ①单片机1程序 (程序在Kile C51上运行通过。) /******************************************************************** * 文件名:液晶1602显示.c * 描述: 该程序实现了对液晶1602的控制。 * 创建人:东流,2009年4月10日 * 版本号:2.0 ***********************************************************************/ #include #define uchar unsigned char #define uint unsigned int //这三个引脚参考资料 sbit E=P3^5; //1602使能引脚 sbit RW=P3^6; //1602读写引脚 sbit RS=P3^7; //1602数据/命令选择引脚 sbit aaa=P1^0; sbit bbb=P1^1; sbit aa=P3^0; sbit bb=P3^1; /******************************************************************** * 名称: delay() * 功能: 延时,延时时间大概为140US。 * 输入: 无 * 输出: 无

***********************************************************************/ void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++) ; } /******************************************************************** * 名称: enable(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void enable(uchar del) { P2 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); } /******************************************************************** * 名称: write(uchar del) * 功能: 1602写数据函数 * 输入: 需要写入1602的数据 * 输出: 无 ***********************************************************************/ void write(uchar del) { P2 = del; RS = 1; RW = 0; E = 0; delay(); E = 1; delay();

个单片机C语言实例()

11.00-59 秒计时器<利用软件延时) 1.实验任务 如下图所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0 口驱动显示秒时间的十位,而P2 口驱动显示秒时间的个位。2.电路原理图 图 4.11.1 3.系统板上硬件连线 <1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7 端口用8 芯排线连接到“四路静态数码显示模块”区域中的任一个a-h 端口上;要求:P0.0/AD0 对应着a, P0.1/AD1对应着b,……,P0.7/AD7对应着h。 <2.把“单片机系统”区域中的P2.0/A8-P2.7/A15 端口用8 芯排线连接到“四路静态数码显示模块”区域中的任一个a-h 端口上;要求:P2.0/A8 对应着a, P2.1/A9对应着b,……,P2.7/A15对应着h。 4.程序设计内容 tyw 藏书<1.在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加 1 ,当秒计数达到60 时,就自动返回到0,重新秒计数。<2.对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10 整除和对10 求余。 <3.在数码上显示,仍通过查表的方式完成。<4.一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1 秒时间为1 .002 秒。 DELY1S: MOV R5,#100 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET 5.程序框图 tyw 藏书 图 4.11.2 6.汇编源程序 Second EQU 30H ORG 0 START: MOV Second,#00H NEXT: MOV A,Second MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOVC A,@A+DPTR MOV P2,A

单片机汇编程序实例

单片机程序入门小例子(汇编语言) 声明:以下3个例子都是正确的,都已经验证过。希望能给刚刚学习单片机的人一点参考。 编写人:大连民族学院自动化专业 例1:流水灯(加按键) ORG 0000H KEY1:MOV A,#0FEH CLR C LOOP1:MOV P2,A RLC A ACALL DELAY JNB P3.7,KEY2 LJMP LOOP1 KEY2:MOV A,#0FEH LOOP2:MOV P2,A RL A ACALL DELAY JNB P3.6,KEY1 LJMP LOOP2

DELAY:MOV R7,#20 D1:MOV R6,#200 D2:MOV R5,#123 NOP DJNZ R5,$ DJNZ R6,D2 DJNZ R7,D1 RET END 例2:数码管动态显示 ORG 0000H AJMP MAIN ORG 0003H AJMP PINT0 ORG 0100H MAIN:MOV SP,#40H CLR IT0 SETB EX0 SETB EA HERE:MOV 30H,#00H MOV 31H,#01H

MOV 32H,#02H MOV 33H,#03H LOOP:MOV R0,#30H MOV R1,#4 MOV R3,#0FEH MOV DPTR,#TAB LOOP1:MOV A,@R0 MOVC A,@A+DPTR MOV P0,A MOV P1,R3 LCALL DELAY INC R0 MOV A,R3 RL A MOV R3,A DJNZ R1,LOOP1 SJMP LOOP TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DELAY:MOV R6,#6 LD:ACALL DELAY1 DJNZ R6,LD DELAY1:MOV R7,#124

单片机

单片机实验 学号:0905074134 姓名:贾亚云 学号:0905074156 姓名:刘昊江 学号:0905074141 姓名:徐海湾 学号:0905074119 姓名:赵皓

实验一:4×4矩阵键盘应用实例 一、实验目的: 学会用单片机做4×4矩阵键盘实验; 学习软件的使用方法及了解其步骤。 二、实验结果图:

三、实验程序: #include #define uint unsigned int #define uchar unsigned char uchar code KEY_TABLE[]={ 0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77};//键盘表 uchar code TABLE[]={0x3F,0x06,0x5B,0x4F, 0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7c, 0x39,0x5e,0x79,0x71};//共阴极数码管编码表void delayl()//长延时,作点亮数码管用 {uint n=50000;while(n--);} void delays()//短延时,作消振用 {uint n=10000;while(n--);} main() { uchar temp,key,num,i; P2=0; while(1) { P3=0xf0;//置行为0,列为1,读列值。 if(P3!=0xf0)//判断有,无键盘按下 {delays();//消振

《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例

第01 篇基础程序设计01 闪烁的LED /* 名称:闪烁的LED 说明:LED按设定的时间间隔闪烁 */ #include #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { while(1) { LED=~LED; DelayMS(150); } } 02 从左到右的流水灯 /* 名称:从左到右的流水灯 说明:接在P0口的8个LED 从左到右循环依次点亮,产生走 马灯效果 */ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) {

while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0的值向左循环移动 DelayMS(150); } } 03 8只LED左右来回点亮 /* 名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) { for(i=0;i<7;i++) { P2=_crol_(P2,1); //P2的值向左循环移动

单片机应用实例报告

单片机应用实例报告 零.序 这个学期一开始便接触了《单片微型计算机原理与接口技术》,听说是《微型计算机控制技术实用教程》的基础,对于工科的我来说学以致用无非是一切的一切,虽然还是个该领域的菜鸟,但是单片机之于自动化的意义不言而喻,对于这篇论文,以下开始展开,不足之处谅解。 一.概述 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。 关于80C51:该系列单片机是采用高性能的静态80C51 设计由先进CMOS 工艺制造并带有非易失性Flash 程序存储器全部支持12 时钟和 6 时钟操作P89C51X2 和P89C52X2/54X2/58X2 分别包含128 字节和256 字节RAM 32 条I/O 口线 3 个16 位定时/计数器 6 输入4 优先级嵌套中断结构 1 个串行I/O 口可用于多机通信 I/O 扩展或全双工UART以及片内振荡器和时钟电路。此外,由于器件采用了静态设计,可提供很宽的操作频率范围,频率可降至0 。可实现两个由软件选择的节电模式,空闲模式和掉电模式,空闲模式冻结CPU但RAM 定时器,串口和中断系统仍然工作掉电模式保存RAM的内容但是冻结振荡器导致所有其它的片内功能停止工作。由于设计是静态的时钟可停止而不会丢失用户数据运行可从时钟停止处恢复的。 二.应用领域 目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。 单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: 1.在智能仪器仪表上的应用 单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、

51单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/137123300.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED=P1^0;// 用sbit 关键字定义LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用bit位对单个端口赋值 LED=1; //将P1.0口赋值1,对外输出高电平 LED=0; //将P1.0口赋值0,对外输出低电平 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 2-IO输出-点亮1个LED灯方法2 /*-----------------------------------------------

名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/137123300.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/137123300.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的多个LED灯

51单片机实验案例2018.3

实验一:实验环境的初识、使用及调试方法实验 一、实验目的 了解单片机的基础知识 了解51单片机的组成和工作方法 认识Proteus软件、Keil软件 掌握项目工程的建立、编辑、编译和下载的过程方法 熟练单片机开发调试工具和方法 二、实验工具 安装有Proteus和Keil软件的微机、51系列单片机实验板三、实验内容 单片机最小系统的构成图1-1: 图1-1

Keil集成开发环境图1-2: 图1-2

实验二:51单片机外接8个LED案例实验 一、实验目的 了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路 掌握C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项 二、实验工具 安装有Proteus和Keil软件的微机、51系列单片机实验板 三、实验内容 依次显示8盏灯,然后逆序依次显示。 1)设计分析 将P1口的初始值设为11111110(1不亮,0亮),左移7次后变成01111111时;再带位右移7次变成11111110,如此循环,即可实现效果。 2)程序图与程序设计 根据前面分析绘制图2-1所示的流程图,再根据图2-1编写程序。 图2-1

C语言程序: #include #define LED P1 void delay(int); main() { unsigned char i; LED=0xfe; While(1) { for(i=0;i<7;i++) { delay(100); LED=(LED<<1)|0x01; } for(i=0;i<7;i++) { delay(100); LED=(LED>>1)|0x80; } } } void delay(int x) { inti,j; for(i=0;i

单片机实例下载大全

单片机资料下载,省去找资料的麻烦 ,只供学习参考用,下载24内删掉,祝大家学习进步 单片机点阵学习资料 https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1703&extra=page%3D1 手把手教你学单片机--教程视频 https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1688&extra=page%3D1 力天把手教你学单片机视频教程 https://www.doczj.com/doc/137123300.html,/forum.php?mod=forumdisplay&fid=110&page=1 谱中单片机开发板例程 https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1683&extra=page%3D1 初学单片机的30多个小实验,硬件简单,对初学者有帮助 https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1962&extra=page%3D1 用单片机制作的MP3 https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1701&extra=page%3D1 51单片机应用开发大全所含100个范例代码及电路图 https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1820 学林电子最新图文教程【含28个单片机实例流程图】 https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1959&extra=page%3D1 谱中单片机程序烧录工具STC https://www.doczj.com/doc/137123300.html,/forum.php?mod=viewthread&tid=1682&extra=page%3D1 吉林大学《单片机技术》32讲

单片机实验报告含仿真设计

单片机原理及应用课程 实验报告 专业: 班级: : 学号:

实验一、keilC51及proteus软件的使用 一、实验目的: 1、掌握keil和proteus软件的基本操作 2、通过具体实例掌握keil和proteus软件的使用。 二、实验原理: keil使用步骤,proteus使用步骤 三、程序: 四、实验结果分析: 五、总结:学会了使用keil和proteus软件,掌握了利用keil和proteus 软件进行仿真的步骤。

实验二、并行输入/输出接口实验 一、实验目的: 1、进一步熟悉keil仿真软件、proteus仿真软件的使用。 2、了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。 3、掌握C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项。 二、实验原理: MCS 51单片机的串行口在实际使用中通常用于三种情况:利用方式 0 扩展并行 i/0 接口:利用方式 1 实现点对点的双机通信;利用方式 2 或方式 3 实现多机通信。利用方式 0 扩展并行 i/0 接口 MCS 5 1 单片机的串行口在方式 0 时,若外接一个串入并出的移位寄存器,就可以扩展并行输出口;若外接一个并入串出的移位寄存器,就可以扩展并行输入口。 三、程序: #include sbit P1_0=P1^0; void main() { unsigned char i; unsigned int j; SCON=0x00; i=0x01; for(;;) {

P1_0=0; SBUF=I; while(!TI) {i} P1_0=1;TI=0; for(j=0;j<=254;j++){;} i=i*2; if(i==0x00) i=0x01; } } 四、实验结果分析: 五、总结:进一步熟悉了keil仿真软件、proteus仿真软件的使用。了解并熟悉单片机I/O口和LED灯的电路结构,学会了构建简单的流水灯电路。掌握了C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项。

单片机程序实例程序实例

单片机程序实例程序实例 以简单的52单片机LCD例程为例,将下面的程序模块化。将延时函数独立成一个模块,为了使程序简化,将所有的和LCD相关的函数(包括LCD初始化函数、写命令函数、写数据函数、显示函数等)独立成一个模块。 #include #include #define uchar unsigned char #define uint unsigned int sbit rs = P2^5; sbit rw = P2^6; sbit e = P2^7; uint i; /*********************************************/ void delay1ms(uint z) { //延迟子程序0.5MS uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*********************************************/ void write_com(uchar com) { rs=0; rw=0; e=0; P0=com; delay1ms(1); e=1; delay1ms(1); e=0; delay1ms(1); } void write_date(uchar date) { rs=1; rw=0; e=0; P0=date; delay1ms(1); e=1; delay1ms(1); e=0; delay1ms(1); } void init() { delay1ms(1); write_com(0x30); delay1ms(1);

单片机实验三示例

实验报告: 实训题目:单片机原理与应用实训 院系:计算机系 专业:科学与技术_% 班级: B100505 学号: B 姓名:张涛 指导教师:董锦凤

' Switches & Relays BUT BUTTON 图实验1的电路原理图 【设计程序】 #include<> sbit P3_7=P3^7; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char count; 。 void delay(unsigned int time){ unsigned int j=0; for(;time>0;time--) for(j=0;j<125;j++); } void main(void) { count=0; P0=table[count/10]; P2=table[count%10]; while(1){ if(P3_7==0){ )

delay(10); if(P3_7==0){ count++; if(count==100) count=0; P0=table[count/10]; P2=table[count%10]; while(P3_7==0); } } } @ } 【运行结果】

姓名张涛 系部计算机系班级B100505学号^ B 课程名称单片机原理及应用实验日期 实验名称LED指示灯循环控制成绩 % 【实验目的】 熟悉uVision3编译软件,掌握C51编程与调试方法。 【实验原理】 图为LED指示灯循环控制电路原理图。图中LED指示灯外接于P0口。由于P0口作为I/O口使用时是漏极开路的,需要外接上拉电阻,因而图中还加有8只100Ω的电阻。图中的时钟电路和复位电路与实验1相同。 程序启动后,8只发光二极管做循环点亮控制,其中灯亮顺序为→→→……→……,无限循环,两次LED亮的时间间隔约。

个单片机实例(包括框图和程序)

13.动态数码显示技术 1.实验任务 如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。 2.电路原理图 图4.13.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上;

(2.把“单片机系统”区域中的P2.0/A8-P2.7/A15用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3.把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域中的SP1端口上; 4.程序设计内容 (1.动态扫描方法 动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 (2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。 (3.对于显示的字形码数据我们采用查表方法来完成。 5.程序框图 图4.13.2

6.汇编源程序 ORG 00H START: JB P1.7,DIR1 MOV DPTR,#TABLE1 SJMP DIR DIR1: MOV DPTR,#TABLE2 DIR: MOV R0,#00H MOV R1,#01H NEXT: MOV A,R0 MOVC A,@A+DPTR MOV P0,A MOV A,R1 MOV P2,A LCALL DAY INC R0 RL A MOV R1,A CJNE R1,#0DFH,NEXT SJMP START DAY: MOV R6,#4 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE1: DB 06H,5BH,4FH,66H,6DH TABLE2: DB 78H,79H,38H,38H,3FH END 7. C语言源程序 #include unsigned char code table1[]={0x06,0x5b,0x4f,0x66,0x6d}; unsigned char code table2[]={0x78,0x79,0x38,0x38,0x3f}; unsigned char i; unsigned char a,b; unsigned char temp; void main(void) { while(1) { temp=0xfe; for(i=0;i<5;i++) { if(P1_7==1)

51单片机入门实例

13.动态数码显示技术 14 4× 4 矩阵式键盘识别技术 15.定时计数器T0 作定时应用技术(一) 13.动态数码显示技术 1.实验任务 如图4.13.1 所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7 接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。 2.电路原理图

图4.13.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7 用8 芯排线连接到“动态数码显示”区域中的a-h 端口上; (2.把“单片机系统”区域中的P2.0/A8-P2.7/A15 用8 芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3.把“单片机系统”区域中的P1.7 端口用导线连接到“独立式键盘”区域中的SP1端口上; 4.程序设计内容 (1.动态扫描方法

动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 (2.在进行数码显示的时候,要对显示单元开辟8 个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。 (3.对于显示的字形码数据我们采用查表方法来完成。 5.程序框图 图4.13.2 6.汇编源程序 ORG 00H START: JB P1.7,DIR1 MOV DPTR,#TABLE1 SJMP DIR DIR1: MOV DPTR,#TABLE2 DIR: MOV R0,#00H MOV R1,#01H NEXT: MOV A,R0 MOVC A,@A+DPTR

相关主题
文本预览
相关文档 最新文档