16位单片机 期末大作业实验报告.docx

上传人:b****2 文档编号:2325923 上传时间:2022-10-28 格式:DOCX 页数:11 大小:633.03KB
下载 相关 举报
16位单片机 期末大作业实验报告.docx_第1页
第1页 / 共11页
16位单片机 期末大作业实验报告.docx_第2页
第2页 / 共11页
16位单片机 期末大作业实验报告.docx_第3页
第3页 / 共11页
16位单片机 期末大作业实验报告.docx_第4页
第4页 / 共11页
16位单片机 期末大作业实验报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

16位单片机 期末大作业实验报告.docx

《16位单片机 期末大作业实验报告.docx》由会员分享,可在线阅读,更多相关《16位单片机 期末大作业实验报告.docx(11页珍藏版)》请在冰豆网上搜索。

16位单片机 期末大作业实验报告.docx

16位单片机期末大作业实验报告

上海电力学院

16位单片机实验报告

 

 

实验名称:

使用键盘中断、PWM及LED数码管的实验

    专业:

姓名:

  

班级:

学号:

一、实验目的

使用使用键盘中断、PWM及LED数码管实现用键盘调整PWM呼吸灯的渐变快慢,同时用LED显示当前的速度级:

1、PWM占空比(如图1)。

2、16键键盘中断(如图2)。

图2键盘中断接线原理图

3、8段LED数码管(如图3)。

图3LED数码管结构图

二、实验设备及其连接

(一)、试验设备:

1.PC机一台

2.S12嵌入式开发系统一台

3.导线九根

4.小键盘一个

5.4连排共阴极8段数码管一个

(二)、设备连接:

1.键盘采用手动接线,将键盘接入双排插孔下一排插孔;

2.PTP0~3分别接键盘接线处的1~4;

3.PTA0~3分别接5-8;

4.8段数码管插到指定位置;

5.小灯接PP7口。

三、实验内容

1.在键盘中断主程序里添加PWM及LED的头文件(.h)及源文件(.c),并在键盘中断主程序main.c中添加PWM占空比小灯及LED显示程序:

2.在中断程序isr.c中添加PWM占空比小灯及LED显示程序:

 

3.运行程序并记录实验现象:

四、程序展示

1.添加头文件声明。

2.在main.c中添加time变量及LEDbuf[4]数组,其中time用来改变PWM渐变中的Delay延时时间,LEDbuf则用来显示每次按键改变的速度值:

main.c程序展示:

#include"Includes.h"//包含总头文件

//在此添加全局变量定义

uint8iii;

uint8period;

uint8duty;

uint8time=100;

uint8LEDbuf[4];

//主函数

voidmain()

{

//0.1主程序使用的变量定

uint32mRuncount=0;//运行计数器

//运行计数器

//uint8period,duty,time=10;

//0.2关总中断

DisableInterrupt();

//0.3芯片初始化

MCUInit(FBUS_32M);

//0.4模块初始化

Light_Init(Light_Run_PORT,Light_Run,Light_OFF);//RUN指示灯初始化为暗

SCIInit(0,FBUS_32M,9600);//串口0初始化

KBInit();//键盘初始化

PWMInit(7);//初始化PWM通道1

LEDInit();

//Light_Init(Light_Run_PORT,Light_Run,Light_OFF);//RUN指示灯初始化为暗

//0.5开放中断

EnableSCIReInt0;//开放SCI0接收中断

EnableKBint();//开放键盘中断

EnableInterrupt();

DDRB=0xff;

PORTB=0x00;//开放总中断

period=0xFF;//PWM周期

duty=0x00;

LEDbuf[0]='0';//待显示数据0000

LEDbuf[1]='0';

LEDbuf[2]='0';

LEDbuf[3]='0';

//主循环

for(;;)

{//inti,j,k;

LEDShow(LEDbuf);

//Light_Change(Light_Run_PORT,Light_Run);//指示灯的亮、暗状态切换

//}

//---------------------------------------------------------------------

//2.通过占空比的变化来调节小灯的亮度

for(duty=0;duty<0xff;duty++)

{

PWMSetting(7,period,duty);//不断增加PWM的占空比

LEDShow(LEDbuf);

Delay(time);

}//延时

for(duty=0xff;duty>0;duty--)

{

PWMSetting(7,period,duty);//不断增加PWM的占空比

LEDShow(LEDbuf);

Delay(time);

}//延时

}

}

3.在isr.c中添加对按键的判断,当按下按键时,缩短Delay延时使得小灯闪烁速度加快,同时改变LEDbuf数组的值使得LED显示当前的按键值(速度级)。

isr.c部分程序展示:

//头文件包含,及宏定义区

//头文件包含

#include"Includes.h"//包含总头文件

#pragmaCODE_SEG__NEAR_SEGNON_BANKED

externuint8iii;

externuint8time;

externuint8LEDbuf[4];

//中断服务程序区

//未定义的中断处理函数,本函数不能删除,默认

__interruptvoidisr_default(void)

{

DisableInterrupt();

EnableInterrupt();

}

//键盘中断

__interruptvoidisrKeyBoard(void)

{

uint8valve;

uint16i;

DisableInterrupt();

DisableKBint();

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

;//延时

valve=KBScanN(10);//扫描键值,存于value中

//SCISend1(0,valve);//发送键值

//SCISend1(0,KBDef(valve));

//发送键盘值

if(valve==0xEB)

{

time=50;LEDbuf[3]='1';

}

if(valve==0xDB)

{

time=10;LEDbuf[3]='2';

}

if(valve==0xBB)

{

time=5;LEDbuf[3]='3';

}

if(valve==0xED)

{

time=1;LEDbuf[3]='4';

}

if(valve==0xE7)

{

time=100;LEDbuf[3]='0';

}

五、实验小结

这次实验的难点在于键盘与PWM公用了一个通道,使得程序串行执行PWM小灯闪烁与键盘按键的等待(消抖),所以一开始无论怎么改程序始终会导致小灯渐变超慢。

最后解决办法是把PWM小灯的通道从PP1改成PP7,这样一来就不再占用同一通道,使得可以并行处理键盘和PWM小灯;之后添加LED显示也就顺利成章了。

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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