用计算机来控制单片机,进而控制继电器等其他外设,感觉不错啊,怎么实现呢?一步步来吧。
单片机串行口通信,也就是单片机与计算机之间的通信,要实现,要明白一些基本的概念。
(1)实现之前,请确定串口正常,我之前做过串口操作,烧了不能控制,后来才发现,设备管理器里串口有叹号,驱动有问题,可能是开发实验板没有插好或是换了个USB口造成的(我用的是串口转USB的,笔记本用)
(2)串口初始化,这方面,最好有相关的书来的,明白消化定时器与中断, 这样操作起来就容易了。
一。设定串口的工作方式:设定SCON寄存器。
什么是SCON呢?
SCON寄存器是51单片机一个可寻址的专用寄存器,用于串行数据通信的控制,其字节地址为:98H,位地址为:98H~9FH。 内容为:
SM0 SM1:串行口工作方式选择位。
SM0SM1 工作方式 功能 波特率
00 方式0 8位同步移位寄存器 fosc/12
01 方式1 10位UART 可变
10 方式2 11位UART fosc/64(或是fosc/32)
11 方式3 11位UART 可变
-----------------------------------------------------------
SM2:多机通信控制位
REN:接收允许控制,1为允许串行口接收,0为禁止串行口接收。
TB8:发送的第9位数据位。
RB8:接收的第9位数据位。
TI:发送中断标志。发送完一帧数据后,硬件自动置1。TI位必须要由软件清零。
RI:接收中断标志。接收完一帧数据后,硬件自动置1。RI位必须要由软件清零。
例:用串口调试助手来调试串口,发送十六进制的数,来让相应的LED灯亮起来。
C程序如下:
#include
void main()
{
TMOD=0x20; //设置定时器:Timer1 Mode 2 8位reload
TH1=0xfd; //波特率for 9600 baud @ 11.0592MHz
TL1=0xfd;
SM0=0;
SM1=1;
REN=1; //控制RI,允许串行接收。SM0SM1及REN为SCON=0x50;
TR1=1; //启动定时器1
while(1)
{
if(RI==1) //如果RI为1,则接收到串口发过来的数据
{
RI=0;库 //软件清零。必须
P0=SBUF; //SBUF,为缓冲器,接收缓冲器只能读出不能写入,发送缓冲器只能写入不能读出。
/* 二者共用一个字节地址,两个相互独立。 */
}
}
}
以 上为串行控制LED灯,想显示哪几个灯,可通过串口调试软件发送即可。
例:数码管显示。这里只给出某一位显示,如果多位,再自己加入相关的程序段即可。
#include
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SM0=0;
SM1=1;
REN=1; //控制RI
TR1=1;
while(1)
{
if(RI==1)
{
RI=0;
P0=SBUF; //P0为数码管的值。
P2=0x06; //8位数码管,第7个,P2口为片选,
}
}
}
以上程序可在AT89s52单片机+Keil 上调试通过并运行。
相关工具:
串口调试助手,51串口通信计算器.exe,可在网上搜索下载。
关键字:51单片机 串口操作
引用地址:
51单片机之串口操作入门经验总结与C源程序
推荐阅读最新更新时间:2024-03-16 15:39
51单片机汇编:多路延时开关
要求:51单片机,8个按键、8个发光二极管。 ;一个键按下则对应灯亮,3秒后灭,每个键控制一个灯。 ;题目要求的电路,非常简单,用 P1 连接按键、P2 连接 LED 即可。 ;用定时器,定时 7.5 ms,中断 400 遍,即为 3 秒钟。 ;针对每个灯,都要有一个计时单元,用来控制亮灯 3 秒钟的时间。 ;用汇编语言编写程序如下: KEY EQU 30H K_L EQU 31H K_T EQU 32H ORG 0000H AJMP START ORG 000BH ;T0中断入口地址 JMP T0_INT START: MOV TH0, #40 ;定时
[单片机]
51单片机串口通讯结合点阵显示的实例
通过电脑使用虚拟串口软件发送特定命令,然后在点阵上进行显示,后期可配合蓝牙串口模块实现短距离控制显示效果,有哪位朋友想给女朋友做生日礼物的可以参考 单片机源程序如下: //单片机P1口和P2口接点阵的阴极,而PO口接点阵的阳极,实现行扫描显示汉子 #include tab.h //uchar temp ={0}; //定义数据接收缓冲区10个字节 uchar tt=7; void main() { T0init(); portinit(); uartinit(); while(1) //等待中断 { if(RI)
[单片机]
51单片机精确延时设计
在我们使用单片机的时候,很多情况下需要用到精确的延时。比如在跟DS18B20进行通讯的时候需要遵循严格的时序,这就需要我们严格把控程序执行的时间。 一般我们都是通过执行空语句的方式来使程序延时。这种方法是用循环嵌套的方式使程序执行空操作,达到延时的目的;除此之外还有使用中断的方式等。 我们可以通过debug来验证我们的函数延时是否准确。本次实验采用12M的晶振进行仿真模拟,应当对软件进行一些设置。在option中将晶振频率改为12M。用12M的晶振是因为这时候一条指令周期恰好是1us,方便我们计算。 首先我们构建一个延时函数void delay_10us( unsigned char tick ),即每次延时的最小单位
[单片机]
51单片机实验3:led流水灯
开发板led模块电路图如下: 循环左/右移函数头文件为 intrins.h #include reg52.h #include intrins.h #define uc unsigned char void delay(uc n) { uc i,j; for(i=1;i =n;i++) for(j=110;j =1;j--); } void main() { P2=0xFE; while(1) { delay(200); p2=_crol_(P2,1); delay(200); } }
[单片机]
基于51单片机利用中断实现100以内的按键计数
具体功能实现: 按下“计数”按键可以自增1,按下“清零”按键可以将两位数码管全部置0 使用器件: 两只数码管、总线、排阻、两个按键、AT89C51芯片 Proteus仿真原理图: 仿真: 知识介绍 : Proteus布线 为了让整个原理图看上去简洁明了,我们对元器件的导线进行标号,而不是直接和芯片相连。 数码管共阳、阳极断码 共阳极(1-9): 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 共阴极(1-9): 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f 中断系统 执行现程序的过程中,出现某些急需处理的异常情况或
[单片机]
51单片机教程(七):LCD1602液晶显示模块
一、原理简介 液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍的LCD1602 液晶显示模块(其内部控制器为HD44780 芯片),它可以显示两行,每行16 个字符,因此可相当于32 个LED数码管,而且比数码管显示的信息还多。采用单+5V 电源供电,外围电路配置简单,价格便宜,具有很高的性价比。 LCD1602 外观如图1(a) 所示。1602 字符型LCD 模块的管脚分布如图1(b) 所示, 其管脚各功能如表1 所示。 图1 (a) LCD1602外观图 (b) LCD1602管脚分布图 值得提出的是,各种液晶厂家均有提供几乎都是同样规格的160
[单片机]
基于51单片机的智能水表
一.硬件方案 本设计主要以51单片机作为主控处理器的智能水表,该水表能够记录总的用水量和单次用水量,当用水量超出设定值时系统发出声光报警提醒,水量报警值能够通过按键进行自行设置,并且存储于AT24C02中,并且可以测量水流速度。测量的结果采用LCD1602液晶显示平显示出来。 主要由51单片机+最小系统+LCD1602液晶显示模块+蜂鸣器模块+LED指示灯模块+继电器驱动模块+按键电路+AT24C02芯片模块+水泵驱动电路;如图: 二.设计功能 (1)采用LCD1602液晶显示屏实时显示瞬时水流速、总用水量、本次用水量、水流量限值; (2)可通过按键设置水流量限值,当本次用水量超过水流量限值时系统发出声光报警提醒; (3)
[单片机]
构造一个51单片机的实时操作系统的方法
目前,大多数的产品开发是在基于一些小容量的单片机上进行的。51系列单片机,是我目前使用最多的单片机系列之一,有非常广大的应用环境与前景,多年来的资源积累,使51系列单片机仍是许多开发者的首选。针对这种情况,近几年涌现出许多基于51内核的扩展芯片,功能越来越齐全,速度越来越快,也从一个侧面说明了51系列单片机在国内的生命力。 多年来我们一直想找一个合适的实时操作系统,作为自己的开发基础。根据开发需求,整合一些常用的嵌入式构件,以节约开发时间,尽最大可能地减少开发工作量;另外,要求这个实时操作系统能非常容易地嵌入到小容量的芯片中。毕竟,大系统是少数的,而小应用是多数而广泛的。显而易见,μC/OS—II是不太适合于以上要求的,而Keil
[单片机]