实验三 单片机串行口编程
- 格式:doc
- 大小:35.00 KB
- 文档页数:8
使用Keil软件模拟调试单片机串行口单片机串行口是单片机中很常见的接口之一,常用于与外界通讯,如与PC机通讯,接收或发送数据等。
Keil软件可以帮助我们模拟及调试单片机串行口,下面是详细介绍。
一、Keil软件简介Keil是一款强大的单片机编程软件,具有模拟器和仿真器。
其可支持多种嵌入式系统和多种编译器。
同时Keil具有标准C 编译器,专门用于单片机编程,而且具有与某些模拟器和编译器的集成,可提供完整的嵌入式开发环境。
二、使用Keil软件模拟1. 连接软件与硬件在开始模拟之前,需要将单片机与电脑通过串口连接好。
打开“Options for Target”对话框,选择“Debug”选项卡,选择正确的COM 端口,设置存根速度,完成调试设置。
2. 添加串行口文件在Keil软件中打开设计文件,键入“#include <reg52.h>”来添加注册头文件,其中包含了需要使用串口的相关寄存器位。
利用如下代码,可以对串行口的各项参数进行设置,例如波特率、校验位等等。
void init(){SCON = 0X50; //使串口工作在方式1,即8位数据,可变波特率TMOD |= 0X20; //TMOD的高4位设为0010,使Timer1工作在方式2TH1 = 0XF3; //波特率设为2400bpsTL1 = 0XF3;TR1 = 1; //启动Timer1ES = 1; //开启串口中断EA = 1; //打开总中断}3. 编写数据收发代码在调用串口的过程中,我们往往需要使用到接收和发送两个函数。
在接收方面,我们需要设置好接收中断模式以及缓冲区的异步处理。
编写简单的数据接收收发代码如下:void send_data(unsigned char dat){SBUF = sdat; //将数据传输到SBUF当中while(!TI); //等待发送完成TI = 0; //完成发送}unsigned char receive_data(){while(!RI); //等待接收完成RI = 0; // 完成接收return SBUF; // 返回接收缓冲区}4. 最后进行模拟完成串行口配置和数据处理之后,就可以开始模拟调试了。
串⾏接⼝实验(Keil两⽚单⽚机...实验四(1)串⾏接⼝实验⼀、实验⽬的1.了解单⽚机串⾏⼝⼯作原理,学习串⾏⼝应⽤程序的编写⽅法;2.掌握在µVision环境中调试串⾏⼝应⽤程序的⽅法。
⼆、实验仪器和设备Keil软件;THKSCM-2综合实验装置;三、实验原理及实验内容⽰例及相关设置(1)建⽴⼀个⽂件夹:lx6。
(2)利⽤菜单File的New选项进⼊编辑界⾯,输⼊下⾯的源⽂件,以lx6.asm⽂件名存盘到lx6⽂件夹中。
ORG 0000HLJMP MAINORG 000BHMOV P2,ARL ARETIORG 0040HMAIN:MOV SP,#5FHMOV A,#0FEHMOV TMOD,#06HMOV TH0,#0FBHMOV TL0,#0FBHSETB EASETB ET0SETB TR0SJMP $END(3)在lx6⽂件夹下建⽴新⼯程,以⽂件名lx6存盘(⼯程的扩展名系统会⾃动添加)。
(4)在Project菜单的下拉选项中,单击Options for Target ‘Target1’,在弹出的窗⼝中要完成⼀下设置:○1单⽚机芯⽚选择AT89C51选择完器件,按“确定”后会弹出⼀个提⽰信息框,提⽰“Copy Startup Code to Project Folder and Add File to Project?”,选择“是”。
○2晶振频率设为11.0592MHz。
○3Output标签下的Create HEX File前⼩框中要打钩。
○4在Debug标签选择Use Simulator(软件模拟)。
(5)在Project菜单的下拉选项中,单击build Target 选项完成汇编,⽣成⽬标⽂件(.HEX)。
按F5运⾏程序。
(6)在Serial Window #1窗⼝输⼊字符(如1~9、A~Z等),观察P2窗⼝变化。
(7)修改程序,使之适合于中断服务程序的字节数⼤⼀些的情况。
一、实验目的1. 理解穿行口的工作原理和功能。
2. 掌握穿行口在单片机系统中的应用。
3. 学习如何通过编程控制穿行口实现数据传输。
4. 提高对单片机硬件资源和编程技术的应用能力。
二、实验原理穿行口(Serial Port)是单片机中用于串行通信的接口,它可以将单片机的并行数据转换为串行数据,或将串行数据转换为并行数据。
本实验主要涉及MCS-51单片机的串行口,其工作原理如下:1. 串行通信的基本概念:串行通信是指数据以一位一位的顺序传送,按照一定的顺序进行。
与并行通信相比,串行通信的传输速度较慢,但具有传输距离远、抗干扰能力强等优点。
2. MCS-51单片机的串行口:MCS-51单片机的串行口采用全双工通信方式,即同时可以进行发送和接收操作。
串行口的主要功能包括:- 数据发送:将并行数据转换为串行数据,通过串行口发送出去。
- 数据接收:接收串行数据,并将其转换为并行数据。
3. 串行口的工作模式:MCS-51单片机的串行口支持四种工作模式,分别是:- 模式0:同步移位寄存器方式。
- 模式1:8位UART(通用异步收发传输器)方式。
- 模式2:9位UART方式。
- 模式3:波特率可变UART方式。
三、实验器材1. 单片机实验板2. 连接线3. 示波器(可选)4. 编程器四、实验步骤1. 搭建实验电路:根据实验要求,将单片机实验板上的相关引脚与连接线连接好。
2. 编写程序:使用C语言编写程序,实现串行口的数据发送和接收功能。
3. 编译程序:使用编程器将程序烧录到单片机中。
4. 调试程序:通过示波器或其他测试工具观察串行口的数据传输情况,验证程序的正确性。
5. 实验结果分析:根据实验结果,分析程序的正确性和串行口的工作状态。
五、实验程序以下是一个简单的串行口发送和接收程序示例:```c#include <reg51.h>void main() {SCON = 0x50; // 设置串行口为模式1,8位UART方式TMOD |= 0x20; // 设置定时器1为方式2TH1 = 0xFD; // 设置波特率为9600TL1 = 0xFD; // 设置波特率为9600TR1 = 1; // 启动定时器1TI = 1; // 设置发送标志位while (1) {if (TI) { // 检查发送标志位TI = 0; // 清除发送标志位SBUF = 'A'; // 发送字符'A'}if (RI) { // 检查接收标志位RI = 0; // 清除接收标志位// 处理接收到的数据}}}```六、实验结果分析1. 在实验过程中,观察到串行口的数据发送和接收功能正常。
实验三P33口输入P1口输出实验系别专业:电子系12级电信2班学号:3121003210姓名:李书杰指导老师:刘志群老师4.1.1实验要求1.复习KeilC51调试硬件的操作方法。
2.复习单片机作为通用I/O口的注意事项。
3.复习单片机操作I/O口的程序设计方法。
4.1.2实验设备PC机一台,TD-NMC+教学实验系统4.1.3实验目的1.熟悉单片机仿真实验软件KeilC51调试硬件的方法。
2.了解P3、P1口作通用I/O口的使用方法。
3.掌握延时子程序的编写和使用方法。
4.了解单片机对简单I/O的扩展方法。
4.1.4实验内容实验1根据TD-NMC+实验平台的单元电路,构建一个硬件系统,并编写实验程序实现如下功能:将P1口的低4位定义为输出,高4位定义为输入,数字量从P1口的高4位输入,从P1口的低4位输出控制发光二极管的亮灭。
程序如下:KEY:MOVP1,#0F0H;令所有行为低电平KEY1:MOVR7,#0FFH;设置计数常数DJNZR7,KEY1;延时MOVA,P1;读取P1口的列值ANLA,#0F0H;判别有键值按下吗?CPLA;求反后,有高电平就有键按下JZEKEY;无键按下时退出LCALLDEL20m;延时20m去抖动SKEY:MOVA,#00;下面进行行扫描,1行1行扫MOVR0,A;R0作为行计数器,开始为0MOVR1,A;R1作为列计数器,开始为0MOVR3#0FEH;R3暂存行扫描字,低4位为行扫描字SKEY2:MOVA,R3 MOVP1,A;输出行扫描字,高4位全1NOPNOPNOPMOVA,P1;读列值MOVR1,A;暂存列值ANLA,#0F0H;取列值CPLA;高电平则有键闭合S123:JNZSKEY3;有键按下转SKEY3INCR0;行计数器加1SETBC;准备将行扫描左移1位,;形成下一行扫描字,C=1保证输出行扫描字中高4位全为1,;为列输入作准备,低4位中只有1位为0MOVA,R3;R3带进位C左移1位RLCAMOVR3,A;形成下一行扫描字→R3MOVA,R0CJNEA,#04H,SKEY1;最后一行扫(4次)完了吗?EKEY:RET;列号译码SKEY3:MOVA,R1JNBACC.4,SKEY5JNBACC.5,SKEY6JNBACC.6,SKEY7JNBACC.7,SKEY8AJMPEKEYSKEY5:MOVA,#00HMOVR2,A;存0列号AJMPDKEYSKEY6:MOVA,#01HMOVR2,A;存1列号AJMPDKEYSKEY7:MOVA,#02HMOVR2,A;存2列号AJMPDKEYSKEY8:MOVA,#03HMOVR2,A;存3列号AJMPDKEY;键位置译码DKEY:MOVA,R0;取行号ACALLDECODEAJMPEKEY;键值(键号)译码DECODE:MOVA,R0;取行号送AMOVB,#04H;每一行按键个数MULAB;行号某按键数ADDA,R2;行号某按键数+列号=键值RET实验2根据TD-NMC+实验平台的单元电路,构建一个硬件系统,并编写实验程序实现如下功能:将P3.3口作状态输入口(接一个逻辑开关,即拨码开关),P1口做输入口(接八只发光二极管D0~D7)。
实验3 循环程序与子程序高源•在P1.0引脚输出1HZ方波信号。
•ORG 0000H•LOOP: MOV R1,#100•WAIT: LCALL DELAY• DJNZ R1, WAIT• CPL P1.0• SJMP LOOP•补全以上程序的延时子程序。
•晶振频率选择6MHz。
•控制箱连接及程序实现效果:•P1.0口连接一个LED,实现LED以1秒频率闪烁。
•参考代码(看懂并理解代码):• ORG 0000H•LOOP: MOV R1,#100•WAIT: LCALL DELAY• DJNZ R1, WAIT• CPL P1.0• SJMP LOOP•(以下延时程序延时5ms,采用6M晶振,为什么?请同学们务必理解,可查阅课件)•DELAY: MOV R6, #•DEL1: MOV R7, #•DEL2: DJNZ R7, DEL2• DJNZ R6, DEL1• RETI•思考题• 1.写出子程序的设计要点?• 2.如何计算软件延时的时间?输出的方波信号可以利用LED灯进行展示,LED灯输出产生了频闪。
频闪的速率为1s一次思考题1,写出子程序的设计要点?采用6M晶振,机器周期为振荡周期的12倍,所以机器周期为2微秒延时5毫秒,相当于2500个机器周期DJNZ R7语句的机器周期为2而整个程序消耗的机器周期为2500根据程序的运行顺序,总机器周期约等于R6值,R7值的乘积,其余可忽略因此需要R6的赋值和R7的赋值相乘为2500DELAY: MOV R6, #10DEL1: MOV R7, #250DEL2: DJNZ R7, DEL2DJNZ R6, DEL1RETI设计时选择了嵌套循环,可以大大提高DELAY子程序调用所消耗的时间。
设计时必须保证DELAY作为整个子程序的名称,同时R6,R7的赋值乘积选择正确,之后循环。
2.如何计算软件延时的时间?延时时间=(250*2us+2us+1us)*10+4us=5034us≈5ms为DJNZ R7,DEL2机器周期转换为时间,加上上下语句消耗的时间,再乘以上层循环一次的时间。
CPLD与单片机串行通信一、实验目的1、了解单片机串口的构成及原理。
2、掌握单片机串口数据接收和发送原则。
3、掌握UART设计方法。
4、掌握用定时/ 计数器设置波特率的方法。
5、掌握EDA自顶向下的设计方法。
二、实验任务通过VHDL语言和C51语言的编程,设计完成CPLD和AT89S51(AT89S52)的串行通信,首先让单片机处于串行发送状态,单片机每一秒向CPLD发送八位数码管阳码从0--9,CPLD进行接受并送显示,让数码管一秒显示一个数字,当显示显示到9后,单片机停止发送,CPLD自动的转向发送状态向单片机发送LCD12232F所能识别的液晶码,每0.1秒发送一次,单片机接受并送显示,每0.1秒显示一个字符,每0.2秒显示一个汉字,使液晶的第一行显示“串口通信成功”。
三、实验原理1、简易通用异步收发机(UART)设计原理:(1)首先是是波特率的设置,由于单片机选择1模式可以设置的最大波特率是62.5kHz,所以CPLD的波特率也是设置此值,并采用此波特率的4倍250kHz进行采样并判断.采样的原则,进行4次的采样,如果中间两位是一致的,就认定此值为正确的可以接收;否则丢弃,重新采样。
再采样之前要对单片机发来的信号进行同步平滑处理,消除毛刺,使用于采样的信号更加的稳定。
采样可以采用16倍采样,这样采样更加的精确,在此为了节省硬件资源所以采用4倍采样。
(2)无论接收还是发送对是采用的循环结构,每发送完8位数据就重新回到发送其实点,重新赋初值进行下一轮的发送,直到发送完成。
接收时,也一样接收8位,回到起点重新接收下8位,依次循环接收。
(3)由于采用4倍速率的接受(发送)方式,因此在拨特率一致方面要特别注意,每一次状态转换也要一个时钟周期,一定要计算在内,这样才能使拨特率完全同步。
2、单片机串口设置原理:四、实验模块电路图及引脚分配1、CPLD模块电路图:2、单片机模块电路图:3、LCD12232F模块电路图:4、数码管模块电路图:5、引脚分配:五、实验步骤六、实验程序。
第 1 页 共 8 页
仲恺农业工程学院实验报告纸
信息科学与技术学院 (院、系) 电子信息工程 专业 班 单片机原理及接口技术 课
学号 姓名 实验日期 教师评定
实验三 单片机串行口编程
一、实验目的
1、掌握单片机串行口的工作方式;
2、掌握单片机串行口的编程方法。
二、实验内容
1、学习单片机串行口的工作方式、初始化以及应用等;
2、利用单片机串行口编写程序,利用串口助手工具通过PC机发送相应
信息,单片机串行口根据接收到的信息控制开发板上的LED灯按一定规律
工作。
要求:
“#”指令开始标志,“*”指令结束标志。
根据接收到的指令start—控制LED灯闪烁,闪烁频率1Hz;pause—控制
LED点亮;stop—控制LED熄灭。
测试串口正常工作的代码(通过串口接收一个字符,再发送回串口)
#include
main()
{
第 2 页 共 8 页
unsigned char a;
/*在12MHz下,设置4800波特率,方式1*/
TMOD=0x20; //设置定时器1的方式
TH1=0xf3; //设置定时器1的初值
TL1=0xf3;
SCON=0x50; //设置串行口方式1,并允许接收
PCON=0x80; //SMOD=1
TR1=1; //启动定时器1
while(1)
{
while(RI==0);
a=SBUF;
RI=0;
SBUF=a;
while(TI==0);
TI=0;
}
}
三、实验设备
1、STC单片机开发板;
2、PC机以及串口线。
第 3 页 共 8 页
四、实验分析及关键代码
#include
#define uchar unsigned char
#define buffer_size 8 //缓冲区大小
sbit LEDB=P2^4;
unsigned char counter;
unsigned char string_compare(uchar *string,uchar number);
unsigned char a;
unsigned char comrxdbuf[buffer_size];//串口接收缓冲区
unsigned char index; //标记字符串的下标变量
bit cmdbegin,cmdok; //命令起始和结束标志
main()
{
/*在12MHz下,设置4800波特率,方式1*/
TMOD=0x20; //设置定时器1的方式 T1工作方式2
TH1=0xf3; //设置定时器1的初值
TL1=0xf3;
SCON=0x50; //设置串行口方式1,并允许接收
PCON=0x80;
TR1=1; //启动定时器1
ES=1;
第 4 页 共 8 页
EA=1;
while(1)
{
if(cmdok)
{
cmdok=0;
if(string_compare("start",5)!=0)
{ TMOD=0x21; //T0为方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//初值
EA=1; //允许中断
ET0=1;
TR0=1;
//启动定时
}
else if(string_compare("stop",4)!=0)
{ TR0=0;
LEDB=1;} //处理停止命令
else if(string_compare("pause",5)!=0)
{ TR0=0;
LEDB=0; } //处理暂停命令
第 5 页 共 8 页
}
}
}
void serial() interrupt 4 using 1
{ unsigned char a;
if(RI)
{
RI=0;
a=SBUF;
if(a=='#'){cmdbegin=1;index=0;}
else if(a=='*'){cmdbegin=0;cmdok=1;}
else if(cmdbegin==1)
{
comrxdbuf[index]=a;
index++;
if(index>=buffer_size)index=0;
}}}
unsigned char string_compare(uchar *string,uchar number) //串口字符串比较
{
unsigned char b,c;
第 6 页 共 8 页
for (b=0;b
c=comrxdbuf[b];
if(c!=(*string))return(0);
string++;
}
return(1);
}
timer0() interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//重置初值
counter++;
if(counter==10)
{
counter =0;
LEDB=!LEDB;
}
}
第 7 页 共 8 页
代码分析:
1. 声明使用的库2.声明uchar代替库中unsigned char方便代码书写3.声明
缓冲区大小4.定义LEDB灯的引脚P2.4方便后面代码书写5.声明counter 6.
声明string_compare(uchar *string,uchar number)函数,否则编译时系统会提
示“没有这项功能” 7.下面几个都是声明
主函数说明:8.串行口波特率初始化(单片机与通用微机进行通信时,要
求使用的波特率、传送的位数等相同。)9.进入while循环,分三个命令
start闪烁、stop熄灭、pause长亮。10.start闪烁实现:在波特率定时器T1
上同时定义定时器T0为中断定时,定时器初始化,在主函数之后定义中断
函数和中断操作。11.stop熄灭:定时器T0关闭,关闭LEDB灯。12.pause
长亮:定时器T0关闭,点亮LEDB灯。
第 8 页 共 8 页
五、实验总结
1.没有声明string_compare(uchar *string,uchar number)函数。
2.设计“start”时,老师提示使用定时器,但是TMOD设置不对,灯没亮,
经过老师提示后设置TMOD=0X21(定时器0方式1、定时器1方式2),
如果设置TMOD=0X01串行口就会被重设,无法工作。
3.设计“pause”和“stop”时,先暂停定时器0,再控制LEDB,否则会一
直闪烁。
■ 注意:
1、 实验报告只交电子版本,命名方式:班级-ex4-学号-姓名.doc,如“电
子131-ex4-201320214103-林雪.doc”,实验报告在实验后3天内提
交给学习委员统一交给任课老师。
2、 本文档红色部分全部删除,替换成具体的实验要求和你们的实验分
析及结果。