桂林电子科技大学信息科技学院嵌入式实训.docx
《桂林电子科技大学信息科技学院嵌入式实训.docx》由会员分享,可在线阅读,更多相关《桂林电子科技大学信息科技学院嵌入式实训.docx(12页珍藏版)》请在冰豆网上搜索。
桂林电子科技大学信息科技学院嵌入式实训
桂林电子科技大学信息科技学院
《嵌入式微处理器结构与应用》实训报告
实训题目:
倒计时秒表
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;
}
}
}
}