16位单片机 期末大作业实验报告.docx
《16位单片机 期末大作业实验报告.docx》由会员分享,可在线阅读,更多相关《16位单片机 期末大作业实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
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显示也就顺利成章了。