单片机课程设计报告一、目的与意义《单片微机原理及应用》是一门技术性、应用性很强的学科,实验课教学是它的一个极其重要的环节。
不论是硬件扩展、接口应用还是编程方法、程序调试,都离不开实验课教学。
如果不在切实认真地抓好学生的实践技能的锻炼上下功夫,单凭课堂理论课学习,势必出现理论与实践脱节,学习与应用脱节的局面。
任随书本上单片微机技术介绍得多么重要、多么实用、多么好用,同学们仍然会感到那只是空中楼阁,离自己十分遥远,或者会因此对它失去兴趣,或者会感到它高深莫测无从下手,这些情况都会令课堂教学的效果大打折扣。
《单片微机课程设计》的目的就是让同学们在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行单片机应用系统的开发设计工作打下一定的基础。
二、硬件电路图1、主板2、四位数码管3、八位LED流水灯4、蜂鸣器5、串口三、程序流程图五、实现的功能及现象1、键盘扫描输入当程序运行时,自动检测是否有按键按下,是哪个按键按下,并且通过返回值,在四位数码管上显示出按下键所对应的数字、字母或执行相应的功能。
2、四位数码管显示通过四位数码管显示相应的按键值、提示语或者执行相关功能。
3、八位流水灯程序运行时,当按下“B”功能键,八位流水灯依次循环点亮熄灭。
4、秒表程序运行时,当按下“C”功能键,数码管清零,从零开始逐秒增加。
5、串口通信程序运行时,当按下“F”功能键,数码管显示“232C”,提示进行串口输入,当从串口助手中输入控制字符时,八位LED灯得到对应的结果。
例如:当输入“00”时,八位灯全亮;当输入“AA”时,八位灯间隔亮。
6、蜂鸣器做按键提示音程序运行时,除串口功能键“F”外,按下任意键,在执行功能的同时,会有短暂的“滴”声,当执行秒表功能时,蜂鸣器会持续发声,直到秒表停止。
六、收获体会通过这次单片机课程设计,我对单片机系统设计更加熟悉,初步学会了单片机程序的编程及调试和主板硬件的焊接技术。
在这个过程中,我认识到,单片机的学习需要有耐心,并且持之以恒,坚持不懈,同时还要不断进行尝试,不要害怕犯错,要在错误中学习、进步。
其中,最困难的就是程序的编写与调试,因为,写好一个程序,往往需要很长时间,之后还需要不断的调试,才能得到理想的结果。
还有就是,要实现一个单独的功能比较容易,然而,把这些功能综合到一起,就会出现问题,会出现很多冲突,最后只好放弃一些功能。
所以我们在设计和编写程序的时候都必须充分考虑到这些因素,才能得到理想的效果。
附:实验程序#include<reg52.h>#include<string.h>#include<absacc.h>#define WR273 XBYTE[0xc000]#define RD244 XBYTE[0xc000]#define dis_playXBYTE[0Xa000]=XBYTE[0Xb000]=XBYTE[0X9000]=XBYTE[0X8000] #define uchar unsigned char#define uint unsigned intuchar t1;ucharx,flag;sbit c=P0^1;void Delay(uint z);////////////////////////////////////////////////ucharm,fen,miao,t,temp;uchar dis_16_1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//无小数点uchar dis_16_2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};//含有小数点uchar dis_10[]={0xff,0xF9,0xA4,0xB0,0x99,0x92,//1~50x82,0xF8,0x80,0x90,0xC0,//6~00x88,0x83,0xC6,0xA1,0x86,0x8E};//A~F/////////////////////////////////////////ucharkey_test(){WR273=0xf0;if((RD244&0x0f)!=0x0f){return 1;c=0;}else return 0;}/////////////////////////////////////////////voidtime_init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;XBYTE[0x8000]=0xc7;XBYTE[0x9000]=0xc7;XBYTE[0xa000]=0x86;XBYTE[0xb000]=0x89;}voidtime_dis(){XBYTE[0x8000]=dis_16_1[m%10];XBYTE[0x9000]=dis_16_2[miao%10];XBYTE[0xa000]=dis_16_1[miao/10];XBYTE[0xb000]=dis_16_2[fen%10];}voidtime_work(){if(t1==2){t1=0;m++;if(m==10){m=0;miao++;if(miao==60){miao=0;fen++;if(fen==10)fen=0;}}}time_dis();}/////////////////////////////////////////////////延时void Delay(uint z){uint y;for(;z>0;z--){for(y=110;y>0;y--);}}//////////////////////////////////////////////// 键盘扫描void scan(ucharvalue,ucharnum,uchar *p){uchar key;XBYTE[0Xc000]=value;key=XBYTE[0Xc000];if((key&0X01)!=0X01){Delay(2); key=XBYTE[0Xc000];if((key&0X01)!=0X01) *p=1+num;}if((key&0X02)!=0X02){Delay(2); key=XBYTE[0Xc000];if((key&0X02)!=0X02) *p=5+num;}if((key&0X04)!=0X04){Delay(2); key=XBYTE[0Xc000];if((key&0X04)!=0X04) *p=9+num;}if((key&0X08)!=0X08){Delay(2); key=XBYTE[0Xc000];if((key&0X08)!=0X08) *p=13+num;}}ucharkey_scan(){ucharkey_value;scan(0Xf7,0,&key_value);//第一列scan(0Xfb,1,&key_value);//第二列scan(0Xfd,2,&key_value);//第三列scan(0Xfe,3,&key_value);//第四列returnkey_value;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////串口voidserial_init(){TMOD=0x20;//定时器一为工作方式二SM0=0;SM1=1;REN=1;TH1=0xf4;TL1=0xf4;TR1=1;ES=1;EA=1;}void serial(){serial_init();while(1){if(flag==1){flag=0;ES=0;SBUF=x;while(!TI);TI=0;ES=1;}}}voidser() interrupt 4{RI=0;P1=SBUF;x=SBUF;flag=1;}///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// void lsd() //流水灯{uchartemp,i;temp=0xfe;while(1){if(key_test())return;for(i=0;i<8;i++){if(key_test())return;P1=temp;Delay(100);temp=(temp<<1)|0x01;}temp=0x7f;for(i=7;i>0;i--){if(key_test())return;P1=temp;Delay(100);temp=(temp>>1)|0x80;}}}//////////////////////////////////////////voidkey_firm(){temp=key_scan();switch(temp){case 1: dis_play=dis_10[temp]; break;//1case 2: dis_play=dis_10[temp]; break;//2case 3: dis_play=dis_10[temp]; break;//3case 4: dis_play=dis_10[temp]; break;//4case 5: dis_play=dis_10[temp]; break;//5case 6: dis_play=dis_10[temp]; break;//6case 7: dis_play=dis_10[temp]; break;//7case 8: dis_play=dis_10[temp]; break;//8case 9: dis_play=dis_10[temp]; break;//9case 10: dis_play=dis_10[temp]; break;//0case 11: dis_play=dis_10[temp]; break;//Acase 12: lsd(); break;//流水灯case 13: time_work(); break;//秒表case 15: time_init(); break;//复位case 16: { XBYTE[0x8000]=0xc6;XBYTE[0x9000]=0xa4;XBYTE[0xa000]=0xb0;XBYTE[0xb000]=0xa4;serial();} break;//串口}}void main(){time_init();while(1){key_firm();}}void time_sm() interrupt 1 /*定时器0中断程序,定时50毫秒*/ {TH0=(65536-50000)/256;TL0=(65536-50000)%256;t1++;}。