单片机最小系统实训报告
一、 实训目的
1、 掌握并理解单片机最小系统的原理及制作, 牢记最小系统中各元器件 的
参数及各元器的作用./
2、 掌握单片机芯片内部的组成及存储机构。 3、 理解常用指令的功能和使用方法。
4、 掌握单片机的中断源,中断控制寄存器,中断响应过程,定时/计数器的电
路结构、功能我使用方法,定时器/计数控制寄存器.
5、 复习利用Keil51软件对程序进行编译。
6、 用protel软件绘制“单片机最小系统”电路,并用测试程序进行仿真。 7、 会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果
能做出不分析我解释,能学出符合规格的实验报告。
二、 实训工具
1、 点偏激测试平台:PC机,串口线,并口线,单片机开发
板
2、 软件:keil51测试软件,protel仿真软件,DXP2004软件。 三、 实训要求
通过实训,学生应达到以下经济方面的要求: 素质要求
1、以积极认真的态度对待本次实训,遵章守纪、团结协作。
2、善于发现数字电路中存在的问题、分析问题、解决问题,努力培养
工作能力。
能力要求
1、模拟电路的理论知识
2、脉冲与数字电路的理念知识
3、通过模拟、数字电路实验有一定的动手能力 4、能熟练的制作单片机最小系统
5、嫩熟练的编写51单片机汇编程序
6、能够熟练的运用仿真软件对单片机最小系统仿真 四、实训内容
1、掌握并理解“单片机最小系统”的原理及制作,牢记最小系统中各元器件的参数及格元器件的作用。
2、用keil51测试元件编写51单片机汇编程序
3、用peotel软件绘制“单片机最小系统”单路原理图。 4、运用仿真软件对单片机最小系统进行仿真。 五.实训基本步骤
1、用peotel乳酸钠几十年绘制“单片机最小系统”单路原理图。 2、根据原理图生成pcb图、GB文件。钻孔文件 3、绘制印刷电路板。
4、根据原理图焊接元件,生成单片机开发板。 5、用keil51软件编写单片机最小系统测试程序。
6、用仿真软件绘制单片机最小系统原理图,测试测量程序。 7、把测试程序拷贝到单片机里进行实物测试。 8、观察测试结果。
六、51单片机C编语言程序测试 测试程序流水灯1: //用定时器做流水灯测试 //为定时显示做准备
//P1-0-----PF1.3 L0-----L3 #include #define unit unsigned int #define unchar unsigned char sbit L0 = P1^0; sbit L1 = P1^1; sbit L2 = P1^2; sbit L3 = P1^3; unsigned char data BUFFER[1]={0}; void main(void) { P2=0X0F; EA=1; IT0=1; ET0=1; TMOD=0X01; TH0=-5000/256; TL0=-5000%256; TR0=1; while(1) { }; } //定时器0中断服务程序// void timer0(void) interrupt 1 using 1 { TH0=-5000/256; TL0=-5000%256; BUFFER[0]=BUFFER[0]+1; if(BUFFER[0]==100) { L3=!L3; L2=!L2; L1=!L1; L0=!L0; } } 测试程序流水灯2: //此程序为了做花样流水灯的 //采用了C的宏定义 X 可以实现一改全改 #include #define unit unsigned int #define unchar unsigned char #define X 16 // unsigned int time=0; unsigned int a[X]={ 0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80, 0X18,0X24,0X42,0X81,0X42,0X24,0X18,0X00, void main(void) { P1=0X0f; EA=1; IT0=1; ET0=1; TMOD=0X01; TH0=9000/256; TL0=9000%256; TR0=1; while(1) { P1=a[time]; }; } //定时器0中断服务程序// void timer0(void) interrupt 1 using 1 { TH0=9000/256; TL0=9000%256; time++; if(time==X) time=0; } //此程序来测试数码管 //P0.0--P0.7 A B C D E F G dp //P2.0--P2.7 C0M0--------C0M8 #include #define unit unsigned int #define unchar unsigned char unsigned char data BUFFER[1]={0}; unsigned char X=0; //共阳极码表数码管 unsigned char leddata[]={ 0xC0, //\"0\" 0xF9, //\"1\" 0xA4, //\"2\" }; 0xB0, //\"3\" 0x99, //\"4\" 0x92, //\"5\" 0x82, //\"6\" 0xF8, //\"7\" 0x80, //\"8\" 0x90, //\"9\" 0x88, //\"A\" 0x83, //\"B\" 0xC6, //\"C\" 0xA1, //\"D\" 0x86, //\"E\" 0x8E, //\"F\" 0x, //\"H\" 0xC7, //\"L\" 0xC8, //\"n\" 0xC1, //\"u\" 0x8C, //\"P\" 0xA3, //\"o\" 0xBF, //\"-\" 0xFF, //熄灭 0xFF //自定义 }; unsigned char com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; void Delay(unsigned char cnt) { while(cnt--); } void xian_shi(unsigned char cp) { unsigned char i; unsigned int z=cp; for(i=0;i<8;i++) { P0=leddata[z%10]; P2=com[i]; Delay(200); z=z/10; } } void main(void) { P0=0X00; P2=0Xff; EX0=1; IT0=1; EA=1; while(1) { xian_shi(X); }; } //定时器0中断服务程序// void timer0(void) interrupt 1 using 1 { X++; if(X==25) { X=0; } } 此程序测试键盘 //P3.0---P3.3 L0-------L3 //从左到有显示为 0 1 2 3 P3.4/ //上/// 4 5 6 7 P3.5/ //到/// 8 9 A B P3.6/ //下/// C D E F P3.7/ //P3.4--=P3.7 H0----H3 #include #define uchar unsigned char #define uint unsigned int unsigned char led_data[]={ 0xC0, //\"0\" 0xF9, //\"1\" 0xA4, //\"2\" 0xB0, //\"3\" 0x99, //\"4\" 0x92, //\"5\" 0x82, //\"6\" 0xF8, //\"7\" 0x80, //\"8\" 0x90, //\"9\" 0x88, //\"A\" 0x83, //\"B\" 0xC6, //\"C\" 0xA1, //\"D\" 0x86, //\"E\" 0x8E, //\"F\" 0x, //\"H\" 0xC7, //\"L\" 0xC8, //\"n\" 0xC1, //\"u\" 0x8C, //\"P\" 0xA3, //\"o\" 0xBF, //\"-\" 0xFF, //熄灭 0xFF //自定义 }; void delay(uint i) { while(i--); } uchar keyscan(void) // { uchar cord_h,cord_l;//行列值中间变量 P3=0x0f; //行线输出全为0 cord_h=P3&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delay(100); //去抖 if(cord_h!=0x0f) { cord_h=P3&0x0f; //读入列线值 P3=cord_h|0xf0; //输出当前列线值 cord_l=P3&0xf0; //读入行线值 return(cord_h+cord_l);//键盘最后组合码值 } } return 0xFF; } void main() { uchar key; P2=0xbb; //1数码管亮 按相应的按键,会显示按键上的字符 while(1) { key=keyscan(); //调用键盘扫描, switch(key) { case 0xEE:P0=led_data[0];break;//0 按下相应的键显示相对应的码值 case 0xED:P0=led_data[1];break;//1 case 0xEB:P0=led_data[2];break;//2 case 0xE7:P0=led_data[3];break;//3 case 0xDE:P0=led_data[4];break;//4 case 0xDD:P0=led_data[5];break;//5 case 0xDB:P0=led_data[6];break;//6 case 0xD7:P0=led_data[7];break;//7 case 0xBE:P0=led_data[8];break;//8 case 0xBD:P0=led_data[9];break;//9 case 0xBB:P0=led_data[10];break;//a case 0xB7:P0=led_data[11];break;//b case 0x7E:P0=led_data[12];break;//c case 0x7D:P0=led_data[13];break;//d case 0x7B:P0=led_data[14];break;//e case 0x77:P0=led_data[15];break;//f } } } //此程序用来测试中断键盘P3.2 INT0 //下跳沿触发 // #include #define unit unsigned int #define unchar unsigned char sbit L0=P1^0; sbit L1=P1^1; sbit L2=P1^2; sbit L3=P1^3; unsigned int times=0; void delay(unsigned int cp) { unsigned int i=cp; while(i--); } unsigned char leddata[]={ 0xC0, //\"0\" 0xF9, //\"1\" 0xA4, //\"2\" 0xB0, //\"3\" 0x99, //\"4\" 0x92, //\"5\" 0x82, //\"6\" 0xF8, //\"7\" 0x80, //\"8\" 0x90, //\"9\" 0x88, //\"A\" 0x83, //\"B\" 0xC6, //\"C\" 0xA1, //\"D\" 0x86, //\"E\" 0x8E, //\"F\" 0x, //\"H\" 0xC7, //\"L\" 0xC8, //\"n\" 0xC1, //\"u\" 0x8C, //\"P\" 0xA3, //\"o\" 0xBF, //\"-\" 0xFF, //熄灭 0xFF //自定义 }; unsigned char com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; void xian_shi(unsigned char cp) { unsigned char i; unsigned int z=cp; for(i=0;i<8;i++) { P0=leddata[z%10]; P2=com[i]; delay(200); z=z/10; } } void main(void) { P1=0Xdd; EX0=1; IT0=1; EA=1; while(1) { xian_shi(times); }; } //INT0低电平中断服务程序// void intersvr0(void) interrupt 0 using 1 { L0=!L0; L1=!L1; L2=!L2; L3=!L3; times ++; } //最简单的24小时显示 #include #define unit unsigned int #define unchar unsigned char unsigned char data BUFFER[1]={0}; unsigned char time[3]={0}; unsigned char leddata[]={ 0xC0, //\"0\" 0xF9, //\"1\" 0xA4, //\"2\" 0xB0, //\"3\" 0x99, //\"4\" 0x92, //\"5\" 0x82, //\"6\" 0xF8, //\"7\" 0x80, //\"8\" 0x90, //\"9\" 0x88, //\"A\" 0x83, //\"B\" 0xC6, //\"C\" 0xA1, //\"D\" 0x86, //\"E\" 0x8E, //\"F\" 0x, //\"H\" 0xC7, //\"L\" 0xC8, //\"n\" 0xC1, //\"u\" 0x8C, //\"P\" 0xA3, //\"o\" 0xBF, //\"-\" 0xFF, //熄灭 0xFF //自定义 }; unsigned char com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; void Delay(unsigned char cnt) { while(cnt--); } void xian_shi(void) { unsigned char i; unsigned int SS=time[0]+100*time[1]+10000*time[2]; for(i=0;i<6;i++) { P0=leddata[SS%10]; P2=com[i]; Delay(200); SS=SS/10; } } void main(void) { P0=0X00; P2=0Xff; EA=1; IT0=1; ET0=1; TMOD=0X01; TH0=0xec; TL0=0x78; TR0=1; while(1) { xian_shi(); }; } //定时器0中断服务程序// void timer0(void) interrupt 1 using 1 { TH0=0xec; TL0=0x78; BUFFER[0]=BUFFER[0]+1; if(BUFFER[0]==100) { time[0]++; BUFFER[0]=0; if(time[0]==60) { time[0]=0; time[1]++; if(time[1]==60) { time[1]=0; if(time[1]==60) { time[1]=0; time[2]++; if( time[2]==24) } } } time[2]=0; } } 七、实训心得 高职高专教育培养的是技术应用型人才,学校为了陪养我们的创新精神和工程实践能力,提高我们的综合素质,我们进行实训,在实践中相互学习和进步。通过实践我们更清楚的认识了我们所学习专业在实践中的运用。也感觉到理论和实践的差距。 八、附件 单片机最小系统生成原理图
因篇幅问题不能全部显示,请点此查看更多更全内容