桂林电子科技大学信息科技学院嵌入式实训.docx

上传人:b****8 文档编号:12724940 上传时间:2023-06-07 格式:DOCX 页数:14 大小:17.96KB
下载 相关 举报
桂林电子科技大学信息科技学院嵌入式实训.docx_第1页
第1页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第2页
第2页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第3页
第3页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第4页
第4页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第5页
第5页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第6页
第6页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第7页
第7页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第8页
第8页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第9页
第9页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第10页
第10页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第11页
第11页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第12页
第12页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第13页
第13页 / 共14页
桂林电子科技大学信息科技学院嵌入式实训.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

桂林电子科技大学信息科技学院嵌入式实训.docx

《桂林电子科技大学信息科技学院嵌入式实训.docx》由会员分享,可在线阅读,更多相关《桂林电子科技大学信息科技学院嵌入式实训.docx(14页珍藏版)》请在冰点文库上搜索。

桂林电子科技大学信息科技学院嵌入式实训.docx

桂林电子科技大学信息科技学院嵌入式实训

桂林电子科技大学信息科技学院

《嵌入式微处理器结构与应用》实训报告

 

实训题目:

倒计时秒表

1系统设计

1.1设计要求

1.1.1设计任务

使用AT89S52单片机与ARM9实验箱之间进行串口通信,实现秒表倒计时的功能。

单片机接收串口发来的命令进行输出系显示,当按键按下后将按键信息通过串口发送给ARM实验箱上的2410芯片;ARM9试验箱模块要求实现相应的计算和控制功能。

即单片机只承担信息输入、输出功能,ARM承担主控任务。

并通过按键控制加减预置值和暂停计时,复位计时等。

要求在下学期硬件能够继续使用。

1.1.2性能指标要求

(一)功能要求

(1)实现99秒倒计时,并通过数码管显示;

(2)四个按键:

一个“运行/暂停”按键,一个“加计时”按键,一个“减计时”按键,一个“复位”按键;

(3)四个指示灯:

倒计时为0时,指示灯闪烁。

(二)接口要求

使用串口连接51单片机与arm9实验箱。

单片机模块功能:

接收串口发来的命令进行输出显示,当按键按下后将按键信息通过串口发送出去。

实验箱模块功能:

实现相应的计算和控制功能。

扩展多位数码管,实现多位显示(动态扫描)

加入了蜂鸣器,可作声音报警使用。

1.2设计思路及设计框图

1.2.1设计思路

(1)串行通信基本通信方式:

通信双方要正确的进行数据传输,需要解决何时开始传输、何时结束传输,以及数据传输速率等问题,这就是数据传输中的同步问题。

通常,实现数据同步有两种方式:

异步通信和同步通信。

1.异步通信:

数据一帧一帧地传送。

发送端和接收端可以由各自的时钟控制数据的发送和接收,两个时钟源彼此独立,互不同步。

数据的一帧:

由一个字符代码组成。

 

 

RS-232C接口采用双极性信号、公共地线和负逻辑;不能和TTL电平直接相连,使用时必须进行电平转换,否则将使TTL电路烧坏,实际应用时必须注意!

在实际应用时,必须通过专用电平转换芯片进行电平转换。

电平转换芯片MC1488、MC1489、MAX232MC1488可实现TTL→RS-232的电平转换;MC1489可实现RS-232→TTL的电平转换。

MAX232芯片可完成TTL到EIA双向电平的转换。

通过使用一对max232(自己做的板子上一个,实验箱上一个)完成电平转换,将单片机的SBUF和s2410芯片的串行通信寄存器完成数据传送从而达到远距离通信的目的。

1.2.2总体设计框图

 

 

2各个模块程序的设计

3调试过程

4功能测试

4.3误差分析

5实训心得体会

附录

附录1:

程序清单

1、嵌入式

AREAmb,CODE,READONLY

ENTRY

EXTERNMain

BMain

B.

END

#defineGPHCON(*(volatileunsigned*)0x56000070)

#defineULCON0(*(volatileunsigned*)0x50000000)

#defineUCON0(*(volatileunsigned*)0x50000004)

#defineUBRDIV0(*(volatileunsigned*)0x50000028)

#definerUTXH0(*(volatileunsigned*)0x50000020)//发送缓冲寄存器

#definerUTRSTAT0(*(volatileunsigned*)0x50000010)

#definerURXH0(*(volatileunsigned*)0x50000024)//接收缓冲寄存器

#defineucharunsignedchar

ucharrevBuf;//接收到的数据

intm=99,ms=99;

intM=20;

/*****************************************

发送

*****************************************/

voidsend(ucharm,ucharms,ucharled,ucharspeak)

{

while(!

(rUTRSTAT0&0x02));

rUTXH0=0xBB;

while(!

(rUTRSTAT0&0x02));

rUTXH0=ms+led*128;

while(!

(rUTRSTAT0&0x02));

rUTXH0=m+speak*128;

}

/******************************************

秒表复位:

复位后LED灯点亮,蜂鸣器不响

数码管置为M.ms

******************************************/

voidreset()

{

m=M;

ms=0;

send(m,ms,1,1);

}

/******************************************

延时

延时0.01s

0.01/1/202.8MHz

******************************************/

voiddelay()

{

inti=0;

for(i=0;i<0x00002000;i++);

}

/******************************************

ms每10ms自减一次

******************************************/

voidrun_stop()

{

inti;

while

(1)

{

if(rUTRSTAT0&0X1)

{

revBuf=rURXH0;

if(revBuf==0x01)

{

break;

}

}

if(ms==-1&&m==0)

{

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

{

if(i%2==0)

send(0,0,0,1);

else

send(0,0,1,1);

}

break;

}

if(ms==-1)

{ms=99;

m--;

}

send(m,ms,0,1);

delay();

ms--;

}

}

/******************************************

******************************************/

voidadd()

{

if(M<99)

M++;

m=M;

send(M,0,0,0);

}

/******************************************

******************************************/

voidsub()//

{

if(M>0)//

M--;

m=M;

send(M,0,0,0);//

}

/******************************************

******************************************/

voidMain()

{

GPHCON=0xa<<2*2;

ULCON0=0x3;

UCON0=0x5;

UBRDIV0=329;

while

(1)

{

if(rUTRSTAT0&0X1)//接收是否完毕

{

revBuf=rURXH0;//

switch(revBuf)//

{

case0x01:

run_stop();break;//

case0x02:

add();break;//

case0x03:

sub();break;//

case0x04:

reset();break;//

default:

break;

}

}

}

}

2、单片机

#include

#defineucharunsignedchar

#defineuintunsignedint

unsignedcharcnt;//区分数码管显示位

unsignedcharKEY=0;//按键锁定

unsignedcharspeak=0;//蜂鸣器不响

unsignedcharled=0;//指示灯不亮

intmg=99,ms=99;//数码管整数位(0~99)小数位(0~99)初始化显示数字

unsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0-9断码表

voiduart_isr()interrupt4//中断方式4,串行口I/O中断

{

/*******************************************

接收模块

0xBB表示接下来要接收两个数码管数据

单片机串行口数据缓冲器SBUF

*******************************************/

if(RI)//接收中断标志位RI

{RI=0;

if(SBUF==0xBB)

{

while(!

RI);

RI=0;

ms=SBUF;

ms=SBUF&0x7f;

led=SBUF/128;

while(!

RI);

RI=0;

mg=SBUF;

mg=SBUF&0x7f;

speak=!

(SBUF/128);

}

}

}

voidCom_Init(void)//计数器初始化

{

TMOD=0x20;//T1计时器

PCON=0x00;//波特率不倍增,在方式1、2、3中0表示不倍增,1表示倍增

SCON=0x50;//串行口控制器配置

TH1=0xFD;//T1高8位

TL1=0xFD;//T1地8位

TR1=1;

ES=1;

}

voidTimer_Init(void)//配置定时器

{

TMOD|=0x01;

TH0=0xFC;

TL0=0x18;

TR0=1;

EA=1;ET0=1;

}

voidShow_Init()//按键、蜂鸣器初始状态

{

P2_0=1;

P2_1=1;

P2_2=1;

P2_3=1;

P1_3=0;

}

voiddelay(void)//延时

{

unsignedchara,b;

for(b=249;b>0;b--)

for(a=17;a>0;a--);

}

voidtimer()interrupt1using0//中断方式1

{

TH0=0xFC;

TL0=0x18;

switch(cnt%2)//数码管动态扫描

{

case0:

P2_4=0;P2_5=1;P2_6=1;P2_7=1;P0=tab[mg/10];break;

case1:

P2_4=1;P2_5=0;P2_6=1;P2_7=1;P0=tab[mg%10];break;

}

P1_3=speak;//定义蜂鸣器接口

P1_1=led;//定义led指示灯接口

cnt++;

}

voidsend(unsignedcharc)

{

SBUF=c;//发送中断标志位TI

while(!

TI);

TI=0;

}

voidmain()

{

Com_Init();

Timer_Init();

Show_Init();

while

(1)

{

/********************************************

发送模块

暂停/启动:

启动停止按键

加:

整数位上限加一

减:

整数位上限减一

复位:

清除当前数字恢复

********************************************/

if(!

KEY){

if(!

P2_0)//暂停/启动

{

delay();

if(!

P2_0)

{

send(0x01);

KEY=1;

}

}

if(!

P2_1)//加计数按键

{

delay();

if(!

P2_1)

{

send(0x02);

KEY=1;

}

}

if(!

P2_2)////减计数按键

{

delay();

if(!

P2_2)

{

send(0x03);

KEY=1;

}

}

if(!

P2_3)//复位按键

{

delay();

if(!

P2_3)

{

send(0x04);

KEY=1;

}

}}

if(P2_0&&P2_1&&P2_2&&P2_3)//锁定按键使其只能按一次发一次

{

delay();

if(P2_0&&P2_1&&P2_2&&P2_3)

{

KEY=0;

}

}

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2