《嵌入式系统应用技术基础》实验报告(一)
基于µPD78F0485单片机的流水灯
音乐盒设计与实现
    专业:      软件工程     
    班级:      2009         
    学号:      **********   
    ****      ***       
1.设计环境及使用工具
1.1设计环境:PC机、瑞萨EZ/EM-1仿真器、程序下载及仿真调试电缆、PC机到仿真器的USB通信线。
1.2使用工具:NEC upd78F0485单片机。
2.需求分析
当前,在世界范围内,一个以微电子技术,计算机的通讯技术为先导的,一信息技术及信息产业的信息革命时期。而计算机技术怎样与实际应用更有效的结合并有效地发挥其作用是科学界最热门的话题,也是当今计算机应用中空前活跃的领域。本文主要从计算机的应用上来实现流水灯加蜂鸣器的音乐盒。
3.设计方案
设计一个电路,在uPD78F0485单片机的P40/KR0~P45/KR5引脚上各连接1个按键,即KEY1-KEY6;在P30-P33、P40-这43、P50-P53引脚上连接12个LED灯,即LED1-LED2.在P33/BUZ引脚上连接一个蜂鸣器。编写程序实现按键控5种不同的流水灯(LED灯亮、灭闪烁)显示方案,并且伴随蜂鸣器的声音,每次灯闪、灯灭蜂鸣器换种频率,如果在显示某种方案的过程中有按键探马下,则会中断现在的方案,进入所按下按键所设定的方案进行显示。
4.程序设计(包括程序流程图)
开始
杨云阁声明全局变量gFlag, gModel
向着太阳
定义软件延时函数void delay();
定义与中断有关的函数void InitKey_INTKR();__interrrupt void OnKeyPress(void);
定义5种模式Scheme0-----Scheme5
执行主函数
不同的按键中断实现不同方案
结束
图4.1  程序流程图
5.操作说明
1.按下Key1键
进入第一种模式,P13.1到P13.0的12个LED灯顺时针方向依次点亮,所有灯点亮之后,12个LED灯依次熄灭,如没有按键按下,则一直循环下去。中间伴随蜂鸣器的声音。
2.按下Key2键
进入第二种模式,P13.1到P13.0的12个LED灯逆时针方向依次点亮,所有灯点亮之后,12个LED灯依次熄灭,如没有按键按下,则一直循环下去。中间伴随蜂鸣器的声音。
3.按下Key3键
进入第三种模式,12个小灯按照红,绿,黄的顺序点亮,每次亮四个灯(即同一时刻只有一种灯亮),如没有按键按下,则一直循环下去。中间伴随蜂鸣器的声音。
4.按下Key4键
爱情美酒
进入第四种模式,12个小灯按照方位,由北,东,南,西的顺序依次闪烁,每次亮三个灯,如果延时过小,则有可能看起来像一条线条流动,如没有按键按下,则一直循环下去。中间伴随蜂鸣器的声音。
5.按下Key5键
进入第五种模式,12个小灯按照对角线,由P13.3和P15.1开始(两个灯同时点亮),顺时针方向依次点亮,并按照这种方式,逆时针依次熄灭,如没有按键按下,则一直循环下去。中间伴随蜂鸣器的声音。
6.按下Key6键
不管运行的哪种模式,按下KEY6键,程序立刻中止。
表5.1  操作对照表
6.设计中遇到的主要问题及解决办法
问题
原因
解决方法
1.程序运行开始,还没有任何按键中断响应,已经按照某种方案执行。
按键中断服务函数中的闪亮模式(变量)与按键不对应,并与主函数的switch函数的变量不统一。
将两个函数中的变量值修改成对应模式。
2.程序开始,第一次按下任何中断键,都能按照对应模式执行,但是一旦开始,就只能按照某种模式执行,不能响应中断。
程序问题,在每种模式中,一旦执行开始之后,就进入死循环,while(1),导致模式不能响应中断。
由于按下中断键之后gFlag的值由1变成0,因此可以将while中的循环变量设为gFlag,如果没有按键响应,gFlag为1,则循环执行,若有按键响应,gFlag为0,循环得以结束,执行另一种模式。
    3.按键中断响应之后,只能等上次方案执行完成,才能进入下一种模式。
由于gFlag中的值在while循环变量中,即使有按键中断,gFlag的值变为0,也需程序执行室外一次,才能判断循环。
暂末解决。
表6.1  问题及对应解决方案
7.总结及展望
随着微控技术的日益完善和发展,单片机的应用在不断走向深入。它的应用比定导致传统的控制技术从根本上发生变革。也就是说单片机应用的出现是对传统控制技术的革命。它在工业控制、数据采集、智能化仪表、机电一体化、家用电器等领路得到了广泛应用,极大的提高了这些领域的技术水平和自动化控制。因此单片机的开发应用已成为高技术工程领域的一项重大课题。因此了解单片机知识,掌握单片机的应用技术具有重大的意义。
8.程序清单
8.1引入、函数声明和初始化变量:
#pragma sfr
#pragma NOP
#pragma DI
#pragma EI
#pragma interrupt INTKR OnKeyPress
void delay();
void InitKey_INTKR(void);
unsigned char gModel = 0;
unsigned char gFlag = 1;
8.2软件延时函数:
void delay(int k)
{int i,j;
for(i = 0; i < k; i++)
for(j = 0;j < k; j++ );}
8.3蜂鸣器调用:
void a(int m)
{switch(m){case 1:CKS=0x80; case 2:CKS=0xA0;
case 3:CKS=0xC0;case 4:CKS=0xE0;}}
void b(){BZOE=0;}
8.4按键中断初始化函数:
void InitKey_INTKR(void)
{PM4 = 0x3F;
    PU4 = 0x3F;
    KRM = 0x3F;
    KRMK = 0;}
8.4按键中断服务函数:
__interrupt void OnKeyPress(void)
佩利亚斯与梅丽桑德{
    DI();
    gFlag = 0;
    switch(P4&0x3F)
    {
        case 0x3E:  gModel = 1;  break;
        case 0x3D:  gModel = 2;  break;
        case 0x3B:  gModel = 3;  break;
        case 0x37:  gModel = 4;  break;
        case 0x2F:  gModel = 5;  break;
        case 0x1F:  gModel = 6;  break;
        default:break;
        EI();    }}
8.5模式1-5:
8.5.1  第一种模式:
    void Scheme_0(void)
{ while(gFlag)
    {P13.1=1;a(1);delay(70);b();P13.2=1;a(3);delay(70);b();P13.3=1;a(2);delay(70);b();
P14.0 = 1;a(2);delay(70);b(); P14.1=1;a(4)delay(70);b();P14.2=1a(3);delay(70);b();
P14.3 =1;a(3);delay(70);b();P15.0 =1;a(2);delay(70);b();P15.1=1;a(2);delay(70);b();
P15.2 = 1;a(4);delay(70);b();P15.3 =1;a(3);delay(70);b(); P13.0=1;a(4);delay(70);b();
P13.1 =0;a(3);delay(70);b();P13.2=0;a(1);delay(70);b();P13.3=0;a(2);delay(70);b();
P14.0=0;a(2);delay(70);b();P14.1=0;a(4);delay(70);b();P14.2=0;a(3);delay(70);b();
P14.3=0;a(1);delay(70);b();P15.0=0;a(2);delay(70);b();P15.1=0;a(1);delay(70);b();
P15.2=0;a(4);delay(70);b();P15.3=0;a(1);delay(70);b();P13.0=0;a(3);delay(70);b();}}
8.5.2第二种模式:
    void Scheme_1(void)
{ while(gFlag)
{ P13.1=1;a(1);delay(70);b();P13.0=1;a(2);delay(70);b();P15.3=1;a(4);delay(70);b();
P15.2=1;a(3);delay(70);b();P15.1=1;a(1);delay(70);b();P15.0=1;a(3)delay(70);b();
P14.3=1;a(1);delay(70);b();P14.2=1;a(3);delay(70);b();P14.1=1;a(4);delay(70);b();
梁汉文 七友P14.0=1;a(3);delay(70);b();P13.3=1;a(1);delay(70);b();P13.2=1;a(3);delay(70);b();
P13.1=0;a(1);delay(70);b();P13.0=0;a(3);delay(70);b();P15.3=0;a(2);delay(70);b();
P15.2=0;a(1);delay(70);b();P15.1=0;a(2);delay(70);b();P15.0=0;a(3);delay(70);b();
P14.3=0;a(3);delay(70);b();P14.2=0;a(1);delay(70);b();P14.1=0;a(2)delay(70);b();
P14.0=0;a(2);delay(70);b();P13.3=0;a(2);delay(70);b();男人就是累 陈玉建P13.2=0;a(3);delay(50);b();}}
8.5.3第三种模式:
void Scheme_2(void)
{ while(gFlag)
{ P13.0=1;P13.3=1;P14.2=1;P15.1=1;a(2);delay(70); b();
P13.0=0;P13.3=0;P14.2=0;P15.1=0;a(3);delay(70); b();