DSP课程设计精.docx

上传人:b****6 文档编号:4435895 上传时间:2022-12-01 格式:DOCX 页数:15 大小:28.99KB
下载 相关 举报
DSP课程设计精.docx_第1页
第1页 / 共15页
DSP课程设计精.docx_第2页
第2页 / 共15页
DSP课程设计精.docx_第3页
第3页 / 共15页
DSP课程设计精.docx_第4页
第4页 / 共15页
DSP课程设计精.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

DSP课程设计精.docx

《DSP课程设计精.docx》由会员分享,可在线阅读,更多相关《DSP课程设计精.docx(15页珍藏版)》请在冰豆网上搜索。

DSP课程设计精.docx

DSP课程设计精

基于TMS320LF2407按键计数器设计

一.说明

在控制电路中,通常需要以按键来控制程序执行流程或是输入数据。

在图4.1中,4个按键K1~K4分别对应TMS320LF2407芯片的引脚IOPF3~IOPF4作为I/O端口的输入,8只发光二极管LED1~ILED8通过SW-DIP8拨码开关和74HC273锁存器芯片分别对应TMS320LF2407芯片的引脚IOPF0~IOPF7作为I/O端口的输出。

本设计仅使用一条I/O引脚,借助软件查询方法点亮8只发光二极管。

本设计中的K1键对应的TMS320LF2407输入I/O引脚为IOPF3,当按下K1键,则将所对应的端口F数据和方向控制寄存器(PFDATDIR)的第3位为(IOPF3引脚)0,同时点亮发光二极管。

二.内容

1.设计并调试用于TMS320LF2407芯片的计数程序,要求由按键K1作输入并对其进行计数,计数的结果由LED7~LED0发光二极管以二进制方式显示。

 

2.对程序稍作改动,用K4按键完成上述功能。

三.硬件电路

图4.1TMS320LF2407与键盘、LED接口电路

四.参考程序清单

通过编程,设计一个按键计数器,要求刚接通电源时,8只发光二极管都不亮,表示计数器的初始值为0,即二进制数的00000000B;当按下K1键时,计数器的值加1,发光二极管LED0点亮,表示二进制数的00000001B,然后松开按键;再次按下K1键时,计数器的值又加1,发光二极管LED1点亮,表示二进制数的00000010B,然后再松开按键;依次类推。

直到按动了255次按键时,发光二极管LED7~LED0会全部点亮,其后的一次K1键按下时将使计数器回0,就这样循环往复。

C语言程序

(1)所需的复位和中断向量定义文件“vectors.asm”同于前。

在这以后的所有例程中,如果没有特别说明,vectors.asm都是相同的。

(2主程序

源程序代码:

#include"register.h"

intm=0x0001;

initial(

{

asm("setcSXM";

asm("clrcOVM";

asm("clrcCNF";

*SCSR1=0x81FE;

*WDCR=0x0E8;

*IMR=0x0000;

*IFR=0x0FFFF;

*MCRA=*MCRA&0x0FF;

*PFDATDIR=*PFDATDIR|0x0400;

*PBDATDIR=*PBDATDIR|0x0FF00;

*PFDATDIR=*PFDATDIR|0x0404;

*PFDATDIR=*PFDATDIR&0xFFFB;

}

voidinlinedisable(

{

asm("setcINTM";

}

intkeyscan(

{

intk,j;

k=*PFDATDIR&0x0008;

if(k==0x0008

k=0;

else

k=1;

if(k==1

{

for(j=30000;j>0;j--

j=j;

k=*PFDATDIR&0x0008;

if(k==0x0008

k=0;

else

k=1;

}

return(k;

}

intkeyserve(

{

intk;

k=*PFDATDIR&0x0008;

if(k==0x0000

*PBDATDIR=(*PBDATDIR&0xFF00+m++;

else

*PBDATDIR=*PBDATDIR;

*PFDATDIR=*PFDATDIR|0x0404;

*PFDATDIR=*PFDATDIR&0xFFFB;

}

main(

{

disable(;

initial(;

while(1

{

inti;

i=0;

i=keyscan(;

if(i==1

keyserve(;

}

}

voidinterruptnothing(

{

return;

}

汇编程序

;键盘与发光二极管配合使用程序

st0_temp.usect".b20",1;60

st1_temp.usect".b20",1;61

context.usect".b20",7;62-68

STACK.usect".stack",40

IOSFT_REG.usect".data0",1;显示数据移位寄存器

IO_COUNT.usect".data0",1;延时计数寄存器

IO_DATA.usect ".data0",1;I/O临时数据缓冲区

LEDXS.usect".data0",1;LED显示的数据

LEDFLAG.usect".data0",1;LED显示标志寄存器

K1FLAG.usect".data0",1;K1标志寄存器

KEYDATA.usect".data0",1;读得键盘值存放寄存器

DP_USER.set5

.include"F2407REGS.H";引用头部文件

.def_c_int0

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;

(1)建立中断向量表

.sect".vectors";定义主向量段

RSVECTB_c_int0;PM0ResetVector1

INT1BPHANTOM;PM2Intlevel14

INT2BGISR2;PM4Intlevel25

INT3BPHANTOM;PM6Intlevel36

INT4BPHANTOM;PM8Intlevel47

INT5BPHANTOM;PMAIntlevel58

INT6BPHANTOM;PMCIntlevel69

RESERVEDBPHANTOM;PME(AnalysisInt10

SW_INT8BPHANTOM;PM10UserS/Wint—

SW_INT9BPHANTOM;PM12UserS/Wint-

SW_INT10BPHANTOM;PM14UserS/Wint-

SW_INT11BPHANTOM;PM16UserS/Wint-

SW_INT12BPHANTOM;PM18UserS/Wint-

SW_INT13BPHANTOM;PM1AUserS/Wint-

SW_INT14BPHANTOM;PM1CUserS/Wint-

SW_INT15BPHANTOM;PM1EUserS/Wint-

SW_INT16BPHANTOM;PM20UserS/Wint-

TRAPBPHANTOM;PM22Trapvector-

NMIBPHANTOM;PM24NonmaskableInt3

EMU_TRAPBPHANTOM;PM26EmulatorTrap2

SW_INT20BPHANTOM;PM28UserS/Wint-

SW_INT21BPHANTOM;PM2AUserS/Wint-

SW_INT22BPHANTOM;PM2CUserS/Wint-

SW_INT23BPHANTOM;PM2EUserS/Wint-

SW_INT24BPHANTOM;PM30UserS/Wint-

SW_INT25BPHANTOM;PM32UserS/Wint-

SW_INT26BPHANTOM;PM34UserS/Wint-

SW_INT27BPHANTOM;PM36UserS/Wint-

SW_INT28BPHANTOM;PM38UserS/Wint-

SW_INT29BPHANTOM;PM3AUserS/Wint-

SW_INT30BPHANTOM;PM3CUserS/Wint-

SW_INT31BPHANTOM;PM3EUserS/Wint—

;中断子向量入口定义pvecs

.sect".pvecs";定义子向量段

PVECTORSBPHANTOM;保留向量地址偏移量-0000h

BPHANTOM;保留向量地址偏移量-0001h

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-05

BPHANTOM;SCI_RX_ISR;保留向量地址偏移量

BPHANTOM;SCI_TX_ISR;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-0A

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-10

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-15

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-1A

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-20

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-25

BPHANTOM;保留向量地址偏移量-0026h

BT1GP_ISR;保留向量地址偏移量-0027hT1PINT中断

BPHANTOM;保留向量地址偏移量-0028h

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-2A

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;pvectoraddroffset0x02f-T3PINT

BPHANTOM;保留向量地址偏移量-30

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-35

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-3A

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-3F

BPHANTOM;CANMBX_ISR;保留向量地址偏移量

BPHANTOM;保留向量地址偏移量-0041h

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;

(2)主程序

.text

_c_int0

CALLSYSINIT;调系统初始化程序

CALLKEYLEDINIT;调键盘和LED初始化程序

LDP#DP_USER;指向0280h~0300h区

SPLK#01H,IOSFT_REG;寄存器和标志初始化

SPLK#00H,IO_COUNT

SPLK#001H,IO_DATA

SPLK#001H,LEDXS

SPLK#00H,LEDFLAG;LEDFLAG.0=1表示K1,K2,K3按下

;LEDFLAG.0=0表示K4按下

SPLK#01H,K1FLAG

CLRCINTM;开总中断

LOOP:

CALLKEY;调键盘程序,即扫描键盘

LDP#DP_USER

BITLEDFLAG,15

BCNDLEDBD1,TC

LACLIO_COUNT

SUB#03E8H

BCNDWAIT,LEQ;判10s延时到否

LEDBD1:

SPLK#00H,IO_COUNT

LDP#DP_PF2

LACLPFDATDIR

OR#0404H;IOPF2=1

SACLPFDATDIR;开74HC273片选信号

LDP#DP_USER

LACLLEDXS

OR#0FF00H;IOPB口为输出方式

LDP#DP_PF2

SACLPBDATDIR;送要显示的数据到IOPB口

LACLPFDATDIR

AND#0FFFBH;IOPF2=0

SACLPFDATDIR;关74HC273片选信号

LDP#DP_USER

BITLEDFLAG,15

BCNDLEDBD2,TC

LACLLEDXS

SFL

SACLLEDXS

LACLIOSFT_REG

SFL

SACLIOSFT_REG

BITIOSFT_REG,BIT8;判是否循环完一次

BCNDLOOP1,TC

BWAIT

LOOP1:

LDP#DP_USER

SPLK#01H,IOSFT_REG;赋初值

LEDBD2:

LACLIO_DATA

SACLLEDXS

WAIT:

NOP

BLOOP

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(3)系统初始化程序

SYSINIT:

SETCINTM

CLRCSXM

CLRCOVM

CLRCCNF;B0区被配置为数据空间

LDP#0E0H;指向7000h~7080h区

SPLK#81FEH,SCSR1;时钟4倍频,CLKIN=6M,CLKOUT=24M

SPLK#0E8H,WDCR;不使能WDT

LDP#0

SPLK#02H,IMR;使能中断优先级INT2

SPLK#0FFFFh,IFR;清中断标志

LDP#DP_EVA;指向7400h~7480h区

SPLK#80H,EVAIMRA;使能T1PINT中断

SPLK#0FFFFh,EVAIFRA;清EVA中断标志

SPLK#0,GPTCONA

SPLK#0EA6H,T1PR;使定时器每10ms产生一次中断

SPLK#0,T1CNT

SPLK#0164CH,T1CON;设置通用定时器1

RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(4)键盘和发光二极管初始化程序

KEYLEDINIT:

LDP#DP_PF2

LACLMCRC

AND#083FFH;IOPF2,IOPF[3~6]配置为一般的I/O口

SACLMCRC

LACLMCRA

AND#000FFH;IOPB[0~7]配置为一般的I/O口

SACLMCRA

LACLPFDATDIR

OR#0400H;IOPF2为输出方式

AND#08787H;IOPF[3~6]为输入方式

SACLPFDATDIR

LACLPBDATDIR

OR#0FF00H;IOPB[0~7]为输出方式

SACLPBDATDIR

RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(5)键盘程序

KEY:

CALLREADKEY;调读键程序

LACLKEYDATA

BCNDKEYRET,EQ;ACC=0?

CALLKEYDELAY

材料:

玉米粒50克,胡萝卜30克,生菜30克,鸡蛋3个,面粉100克

椒粉各少许;

做法:

1.先将鸡蛋打散成蛋液,加入少许胡椒粉拌匀,胡萝卜洗净切沥干切碎,葱切花;

2.将胡萝卜粒和玉米粒放入沸水中煮熟后沥干待用;

3.面粉中加入适量的盐,再倒入鸡蛋液,加入适量的水搅拌成

4.放入沥干的胡萝卜粒和玉米粒、生菜、葱花,再加入少许芝

;再一次读键值

LACLKEYDATA

BCNDKEYRET,EQ

LDP#DP_USER;判断按键情况

BITKEYDATA,15

BCNDKEYRET,NTC

CALLK1;"+"键按下

BKEYRET

KEYRET:

LACLKEYDATA

AND#0FFF0H;清读取的键值寄存器

SACLKEYDATA

RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(6)读键子程序

READKEY:

LDP#DP_PF2

LACLPFDATDIR;取出键值PFDATDIR.3~PFDATDIR.6

RPT#2

SFR;右移3位

OR#0FFF0H;屏蔽高4位(用到4个键)

CMPL

LDP#DP_USER

SACLKEYDATA;存放键值

RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(7)用软件延时30mS消抖动

KEYDELAY:

LACC#6000

KEYD1:

SUB#1

RPT#80

NOP

BCNDKEYD1,NEQ

RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(8)键子程序

K1:

;"+"键子程序

READK1:

CALLKEYDELAY

CALLREADKEY

LDP#DP_USER;判断按键K1是否松开

BITKEYDATA,15

BCNDREADK1,TC

SPLK#01,LEDFLAG;关闭LED左移标志,即LED对同一个数不刷新

LACLIO_DATA

ADD#1

SACLIO_DATA

RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(9)中断程序

GISR2:

;优先级INT2中断人口

;保护现场

LDP#0;保存机器上下文

SST#0,st0_temp;使用自动寻址DP-0

SST#1,st1_temp;保存状态寄存器到B2DARAM.

SACLcontext;保存ACC的低16位

SACHcontext+1;保存ACC的高16位

SARAR1,context+2

SARAR2,context+3

SARAR3,context+4

SARAR4,context+5

SARAR5,context+6

LDP#0E0H

LACCPIVR,1;读取外设中断向量寄存器(PIVR),并左移一位

ADD#PVECTORS;加上外设中断入口地址

BACC;跳到相应的中断服务子程序

T1GP_ISR:

;通用定时器1中断入口

LDP#DP_USER

LACLIO_COUNT

ADD#1

SACLIO_COUNT

; 恢复现场

LDP#DP_EVA

SPLK#0FFFFH,EVAIFRA

LDP#0

LARAR5,context+6

LARAR4,context+5

LARAR3,context+4

LARAR2,context+3

LARAR1,context+2

LACCcontext+1,16

ADDScontext

LST#1,st1_temp

LST#0,st0_temp

CLRCINTM;开总中断,因为一进中断就自动关闭总中断

RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;(10)假中断程序

PHANTOM

KICK_DOG;复位看门狗

RET

END

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

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1