单片机与嵌入式系统课程实际
设计报告
姓名:
班级:
学号:
单片机与嵌入式系统课程设计
一、课程设计的目的与要求
(1)完成指定设计题目的各项功能。
(2)提交课程设计报告。
包括:实验内容描述;设计思路及方案;硬件电路图;软件框图及源代码;结论。
(3)熟悉软件、硬件操作,能够解答设计过程中所涉及内容的提问。
二、课程设计题目
按键操作显示:
利用学习板上的按键和数码管。
数码管显示一初始数值,按键定义为+、-键,按下对应键后,数码管显示的数值相应增、减。
利用学习板上的按键和LED。
由按键控制LED的亮度,亮度分为10级。
数码管显示A的时候,蜂鸣器发声。
三、设计思路及方案
按照设计题目的要求规定两个按键K1和K2,当K1按下时数码管上的数字增一,同时利用PWM控制LED的亮度分十个等级逐渐增加;当K2按下时,数码管上的数字减一。
当数码管上的数字为A时,蜂鸣器发声。
四、课程设计的收获与感受
这次单片机课程设计我们历时一天,从理论到实践,学到了很多的东西。
同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。
遇到一个问题时,最重要的一件事就是马上思考检查问题出在哪边,而不是抱怨或者马上请教同学老师。
只有这样我们才能真正的学会单片机,才能越学越会。
自己的独立处理问题的能力才会得到提高。
还有无论编程中遇到什么问题,都不要怨天尤人。
无论自己的程序有多好,都不能骄傲。
只有这样做到不骄不躁,力量才会源源不断,才会有更多的灵感。
要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
在整个课程设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。
虽然这个课程设计做的还是有一些遗憾,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富。
最后,无论如何都要好好的感谢张老师和田老师的帮助,在整个课程设计过程中,几乎每一个程序的设计成功都离不开老师平时的指导和帮助。
在老师的辛勤指导之下,学到了很多有用的经验和使用的知识。
而且还得感谢身边同学的帮助和交流,在互相帮助和交流的过程中能够学到很多很有创意的编程思想,更加扩宽了自己的思想。
附录
#include "AT89X51.H" //模拟PWM输出控制灯的10个亮度级
#define uchar unsigned char
#define uint unsigned int
unsigned int scale; //占空比控制变量
sbit D1=P1^0;
sbit K1=P1^4;
sbit K2=P1^5;
sbit shumaguan=P1^7;//
sbit FMQ=P1^6;
uchar code table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,
0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71}; //数码管编码
void delay(x) //延时程序
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<123;j++);
}
void main(void) // 主程序
{
uchar i=0;
shumaguan=0;
P2=table[i];
TMOD=0x02; //定时器0,工作模式2(0000,0010),8位定时模式
TH0=0x06; //写入预置初值6到定时器0,使250微秒溢出一次(12MHz)
TL0=0x06; //写入预置值
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
while(1) //无限循环,实际应用中,这里是做主要工作
{ if(K1==0)
{
delay(10);
if(K1==0)
{while(!K1);
i++;
if(i!=10)
{FMQ=1;}//让蜂鸣器在数码管不显示A的时候不响
scale++; //占空比控制变量scale加1
if(scale==10) scale=0;
//如果scale=10,使scale为0
}
if(i==10)//让蜂鸣器在数码管显示A的时候响
{FMQ=0;}
if(i>15)
{ i=0; }
P2=table[i];
while(!K1);
}
if(K2==0)
{
delay(10);
if(K2==0)
{while(!K2);
i--;
if(i!=10)
{FMQ=1;}
if(i==10)
{FMQ=0;
}
if(i>16)
{ i=15; }
P2=table[i];
while(!K2);
}
}
}
}
timer0() interrupt 1 //定时器0中断服务程序
{ static unsigned int tt ; //tt用来保存当前时间在一秒中的比例位置tt++; //每250微秒增加1
if(tt==10) //2.5毫秒的时钟周期
{ tt=0; //使tt=0,开始新的PWM周期
P1_1=0; //使LED灯亮
}
if(scale==tt) //按照当前占空比切换输出为高电平
P1_1=1; //使LED灯灭
}。