.
桂林电子科技大学信息科技学院
《嵌入式微处理器结构与应用》实训报告
实训题目:倒计时秒表
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、嵌入式
AREA mb,CODE,READONLY ENTRY
EXTERN Main B Main B . END
#define GPHCON (*(volatile unsigned *)0x56000070) #define ULCON0 (*(volatile unsigned *)0x50000000) #define UCON0 (*(volatile unsigned *)0x50000004) #define UBRDIV0 (*(volatile unsigned *)0x50000028)
#define rUTXH0 (*(volatile unsigned *)0x50000020)//发送缓冲寄存器 #define rUTRSTAT0 (*(volatile unsigned *)0x50000010)
#define rURXH0 (*(volatile unsigned *)0x50000024)//接收缓冲寄存器
#define uchar unsigned char
uchar revBuf;//接收到的数据
页脚
.
int m = 99,ms = 99; int M =20;
/***************************************** 发送
*****************************************/
void send(uchar m,uchar ms,uchar led,uchar speak) {
while(!(rUTRSTAT0 & 0x02)); rUTXH0=0xBB;
while(!(rUTRSTAT0 & 0x02)); rUTXH0=ms+led*128; while(!(rUTRSTAT0 & 0x02)); rUTXH0=m+speak*128; }
/****************************************** 秒表复位:复位后LED灯点亮,蜂鸣器不响 数码管置为M.ms
******************************************/ void reset() { m = M; ms = 0; send(m,ms,1,1); }
/****************************************** 延时 延时0.01s 0.01/1/202.8MHz
******************************************/ void delay() {
int i = 0;
for(i=0;i<0x00002000;i++);
页脚
.
}
/****************************************** ms 每10ms自减一次
******************************************/ void run_stop() { int i; while(1) {
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(rUTRSTAT0 & 0X1) { }
revBuf = rURXH0; if(revBuf == 0x01) { }
break;
}
if(ms == -1)
页脚