单片机课程设计
单片机课程设计报告
课题名称:数字时钟
一、设计目的:
随着半导体技术的不断发展,各种微处理芯片的性价比越来越高,在各个领域的应用也越来越广泛,其中MCU在工业控制、航天航空、民用家电、医疗设备等方面占有十分重要的地位。我们在之前所学习的MCS-51系统单片机就是MCU中的一员,作为低端的8位MCU它具有价格低、适配器件成熟种类多等优势,因此尽管现在32位、16位MCU不断发展,但8位的MCU仍占有大约50%的市场份额,同时它也是我们学习MCU的必要的入门途径,本次实习就是应用我们所学习的MCS-51单片机进行一次实际制作,要经过从硬件设计、软件设计、实验电路调试、软件调试直至最后作品焊接成型,这对以前我们所学习的理论知识进行进一步的巩固和深化,更重要的是学习以MCU为控制核心的应用的实际设计流程及基本的实践动手能力。
二、设计内容
应用AT89S51及相关器件制做一个LED数码显示电子时钟。所需使用的软件及硬件具体内容如下:
1.使用软件及器件
1)软件:Keil uVision2(IDE集成开发环境)、ELITE-IV单片机开发系统、protel99se 2)器材清单:
三、实习步骤
1. 根据实习内容及所提供元器件,设计硬件电路,提供的参考电路见图1,也可自行设计
1)复位及晶振电路是单片机最小系统必备部分 2)三个按钮接在、、上用于调整时、分、秒 3)P2口送LED 数码显示的段码 4)至送数码显示控制的位码
2. 根据设计的硬件电路,在面包板上搭接实验电路 3. 在硬件基础在keil 上上进行软件设计,调试 4. 调试通过后, 向AT89S51烧写程序
5. 将烧写好的AT89S51插接到实验电路中,验证是否正常,如果正常说明软、硬件正确可
进行电子时钟焊接制做。
6. 焊接好电子时钟后,再次上电调试,验证通过,实习圆满完成。 注意的问题:
单片机在锁紧座的正确放法:单片机缺口朝上。
在面包板上接好电路后,先用万用表测量一下电源及地是否会短路。 接电源调试时不能带电插拔元件
四、元件参数 1.9012
9012是一种最常用的普通三极管。
它是一种低电压,大电流,小信号的PNP 型硅三极管 集电极电流Ic :Max -500mA 集电极-基极电压Vcbo : -40V 工作温度:-55℃ to +150℃ 主要用途: 开关应用、射频放大
2.89S51管脚图
3.双位共阴极数码块管脚图
b1
c1 d1
e1
f1
g1 dp1
a2
b2
c2
d2
e2
f2
g2
dp2
a1
a b f
c dp e
d g
com1 com
部分程序参考流程图
主程序流程图
显示程序流程图
键盘处理程序流程图
定时中断程序流程图
ELITE-III系统硬件()介绍ELITE-IV实物图:
硬件资源介绍:
1.电源输入(6V)
2.电源开关按钮
3.电源正常指示灯
4.700mA过流指示灯
5.NE555
6.高档一体化红外接受头
7.流水等开关按键
8.Usb取电接口
9.DS1302时钟芯片
10.流水灯
11. 24C02
12. 93C46
13. ADC0804 模数转换芯片
14. MAX232
15.串口接口
16. AT89S**ISP切换键
17.蜂鸣器
18.复位键
19.华邦ISP切换
20. COM1座
21. MCU冷启动
22. COM1切换
23. I2C接口
24. A/D内外切换
25. EA切换
26. A/D输入
27. INTO
28. INT_TO
29. SPI接口
30. COM0测试
31. 18B20温度传感器接口
32. KEY_A
33. KEY-B
34. 51单片机
35.单片机缩紧座
36. A/D调节
37. LCD12864接口
38. 74HC574
39. LCD1602接口
40. ULN2003步进电机驱动芯片
41. LCD12232接口
42. 1602、12232LCD对比度
43. 74HC244
44. LCD12864对比度调整旋钮
45. 4*4键盘
46. 8*8键盘扩展接口
47.输出5V电源接口
48. 6位8字数码管
49.数码管开关按键。
50.步进电机
(二)下载器的安装和使用
一AT89S系列下载器
1.打开随机光盘中的“ISPSetup”文件夹,双击执行安装程序。
2.点击“下一步”,出现图6对话框,继续点“下一步”。
3.选择安装路径。
4.点击“完成”按钮,完成安装过程。
说明:本软件是对Atmel 的89S系列MCU进行在线下载程序,打开hex文件之前需要执行“清空”操作,同时要按下开发板上的 S1和S2 按钮。依次执行“鉴别”—“擦除”—“写入”操作后,弹起S1和S2按钮,按复位键,单片机即可运行刚下载的新程序。
(三)电子钟电路板布线
(四)数字钟程序
程序
#include<>
#include<>
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF}; /*定义并初始化变量*/
uchar seconde=0;
uchar minite=0;
uchar hour=12;
uchar mstcnt=0;
sbit P3_0=P3^0; // second 调整定义
sbit P3_1=P3^1; //minite调整定义
sbit P3_2=P3^2; //hour调整定义
/*函数声明*/
void delay(uchar k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序
/*****************************/
/*延时子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
if(seconde==60) //秒钟设为60进制 { seconde=0;
minite++;
if( minite==60) //分钟设为60进制
{ minite=0;
hour++;
if(hour==24) //时钟设为24进制
{hour=0; }
}
}
}
/*****************************/
/* 显示子程序*/
/*****************************/
void display(void)
{
P2=0xfe;
P0=dispcode[hour/10]; //显示小时的十位 delay(4);
P2=0xfd;
P0=(dispcode[(hour%10)])|0X80; //显示小时的个位 delay(4);
P2=0xfb;
P0=dispcode[minite/10]; //显示分的十位 delay(4);
P2=0xf7;
P0=(dispcode[minite%10])|0X80; //显示分的个位 delay(4);
P2=0xef;
P0=dispcode[seconde/10]; //显示秒的十位
delay(4);
P2=0xdf;
P0=dispcode[seconde%10]; //显示秒的个位
delay(4);
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan (void)
{
if(P3_0==0) //按键1秒的调整
{
delay(30);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{seconde=0; }
}
}
if(P3_1==0) //按键2分的调整
{
delay(30);
if(P1_1==0)
{
minite++;
if(minite==60)
{minite=0;}
}
}
if(P3_2==0) //按键3小时的调整
{
delay(30);
if(P1_2==0)
{
hour++;
if(hour==24)
{hour=0; }
}
}
}
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次 {
TH0=0x3c;
TMOD = 0x11;
mstcnt++;
if(mstcnt==20)
{
seconde++;
mstcnt=0; //对计数单元的清零
}
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{ P1=0xff; //初始化p1口,全设为1 TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while (1)
{
keyscan( ); //按键扫描
time_pro( ); //时间处理
display( ); //显示时间
}
}
附流水灯实验程序:
#include <>
#define uint unsigned int
#define uchar unsigned char
uint count,i=0;
void main()
{
TMOD=0x01;//定时器0工作方式1
TH0=0x3c;//装定时器初值高8位,50ms中断一次 (65536-50000)/256 TL0=0xb0;//装定时器初值低8位,50ms中断一次 (65536-50000)%256 EA=1;//开中断
TR0=1;//定时器0开始
ET0=1;//定时器0允许中断
while(1);//等待中断
}
void timer0()interrupt 1
{
TH0=0x3c;//重新设置初值
TL0=0xb0;//重新设置初值
count++;
if(count==20)
{
count=0;
P1=~(0X01<
if(++i==8)
i=0;
}
}
实习心得
机制0973班杨少波 07
时光飞逝,一转眼,一个学期又接进尾声了,本学期的单片机综合课程设计也在一周前完成了。
俗话说“好的开始是成功的一半”。说起课程设计,我认为最重要的就是做好设计的预习,认真的研究下老师所给的题目。其次,老师对实验的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计来才会事半功倍,如果没有弄明白,就迷迷糊糊的去做,到头来一点收获也没有。最后,要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。
虽然这次的课程设计算起来在实验室的时间只有五天,不过因为我们每个小组都有自己的实验板,所以可以自己带回宿舍里做,时间还是蛮充裕的。硬件的设计跟布线都要我们自己动手去连接,软件的编程也要我们不断的调试,最终一
个能完成课程设计的劳动成果出来了,很高兴它能按着设计的思想与要求运动起来。当然,这其中也存在着很多问题,可以总结如下:
第一、不够细心比如由于粗心大意接错了线,导致有些数码管不亮等等,还有由于对课本理论知识的不熟悉导致编程出现错误。
第二、是在学习态度上,这次课设是对我的学习态度的一次检验。对于这次单片机课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的问题多数都是由于我们不够严谨不够细心照成的。
第三、在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。通过程序的编写以及设计电路的过程,加强了我思考问题的完整性和理论联系实际的可行性。通过各个I/O口的接线,使我们对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且使我们熟练掌握了有关器件的性能及测试方法。
再次感谢老师的辅导以及同学们的帮助,是他们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要一步一个脚印的走。课程设计时间虽然很短,但我还是学习了很多的东西,使我眼界打开,感受颇深。
实习心得
机制0973班谢永福 16
通过这一周的单片机的实训,让我有了不少体会。
首先,通过老师对单片机C51程序设计基础的讲解,我对C语言程序中的数组、指针以及函数的一些只是有了更深一步的认识,并且通过老师对C51时钟芯片实时读写程序,接口电路设计实例程序和液晶模块实例程序的读取,让我对时钟芯片和液晶显示的功能有了更深的了解。
然后,在上机实训中,老师先让我们调试从课堂中认识的流水灯程序和电子时钟程序,通过对这两个程序的调试,我对液晶显示屏、时钟芯片的工作原理有了更深的理解,并且通过一些改编,让我们发现了一些问题,并通过自己修改,
最后完成实验。
最后,在开始设计实验时,先通过老师对我们的演示,使我们对程序设计有了初步了解,让后通过自己实践动手,自己发现解决问题,最后达到完成程序的问题,在这过程中,发现自己平时基本功不够扎实,不能及时有效的解决问题,而且不能善于思考问题,不能对问题有本质上的了解,而老师的一些点拨让我有些了解,进而解决问题,这次实训还是有了不少收获,对单片机的认识更加深了,自己动手能力也提高一些。
这次实训虽然其中会有些错误和失败,但总的来说是受益匪浅,在运用中发现问题,解决问题,就是最大的收获。专心做自己的事,是一种乐趣;互相交流,是大家一起进步的必要过程;上网查阅资料,是获得所需信息的有效途径。我想,这些练习和经验都将是我以后最宝贵的财富!