五、实习体会
单片机作为我们主要的专业课程之一,我觉得单片机课程设计很有必要,而且很有意义。但当拿到题目时,确实不知道怎么着手,有些迷茫,上网查资料,问同学,在我们小组的共同努力下,历时一个星期,解决一个又一个的困难,终于完成任务。
在这次课程设计中,学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的一大收获。另外,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会有益于我在以后的学习、工作和生活中。设计过程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不能灵活运用。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,知道了团队合作的重要性,这为自己今后的学习和工作做出了很好的榜样。
六、参考文献
1.《51单片机原理及应用—基于Keil C与Proteus》(陈海宴 北京航空航天大学出版社)
2.《单片机原理实验指导书》 (东北大学秦皇岛分校) 3.《c语言程序设计》 (谭浩强 清华大学出版社)
~ 11 ~
~ 12 ~
附录、源程序代码
#include
#define uchar unsigned char #define uint unsigned int sbit shezhi=P3^2; sbit jia=P3^3;
uchar duan1,duan2,duan3,duan4,duan5,duan6;//定义相关变量 uint miao=0,fen=0,shi=0;
uchar xdata wei _at_ 0xff20; //Pa port on 8255 //定义8255端口指针 uchar xdata duan _at_ 0xff21;//Pb port on 8255
uchar xdata ctrl _at_ 0xff23; //control port on 8255 uchar code table[]={ 0xc0,/*0*/ 0xf9,/*1*/ 0xa4,/*2*/ 0xb0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xf8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ }; //定义数码管显示数值
/*------------------------------------------------ 定时器初始化子程序
------------------------------------------------*/ void Init_Timer0(void) {
TMOD=0x01;
//使用模式1,16位定时器
TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 TL0=0x00;
EA=1; //总中断打开 ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------ 延时子程序
------------------------------------------------*/ void delayms(unsigned char ms) {
uchar i;
while(--ms!=0)
for(i = 0; i < 50; i++); }
/*------------------------------------------------ 显示子程序
------------------------------------------------*/ void xianshi() {
wei=0xdf; //打开位选,选第一位数码管
duan=duan1; //打开段选,显示数码关管第一位//1101 1111 delayms(3);
wei=0xef; //1110 1111 duan=duan2; delayms(3);
wei=0xf7;// 1111 0111 duan=duan3; delayms(3);
wei=0xfb; //1111 1011 duan=duan4; delayms(3);
wei=0xfd;//1111 1101 duan=duan5; delayms(3);
wei=0xfe;//1111 1110 duan=duan6; delayms(3); }
/*------------------------------------------------
初始化子程序
------------------------------------------------*/ void sys() {
shezhi=1;//引脚置高电平作为输入
jia=1;
Init_Timer0(); ctrl=0xc0; delayms(3); }
/*------------------------------------------------ 主程序
------------------------------------------------*/ void main() {
uint flag=0,j=0,xuanze1=0;//定义闪烁标志变量flag,闪烁时间变量j
//时分秒选择变量xuanze1
sys();
while(1)//主循环 {
if(xuanze1==0) {
TR0=1;//如果时间设置时分秒选择变量为0,说明处于运行状态,
此时定时器开启 烁
flag=1;//烁标志位强制置1,不闪烁
}
if (!shezhi)//P3.2设置按钮 {
xianshi();//延时去抖,用显示子程序延时,防止按动按钮时闪
if (!shezhi)//再次确认按键是否按下,没有按下则退出