专业技能综合训练
总结报告
班 级:_电子0891 姓 名:__金钊_ 学 号:_2008943027 同 组:__王佛长___ 学 号:_2008943025 组 号: 19组
指 导: 信息工程学院电子教研室 地 点: 信息工程学院电子实验室
2011年12月19日~2011年1月13日
一、 实习目的与要求:
1、对典型单片机仿真软件PROTUS与开发套件进行熟悉与训练,结合具体
应用电路解剖分析,并通过分小组的专题实践,掌握单片机应用系统的调试与开发过程,同时规范设计的文档格式。为毕业设计储备必要的电路板设计工艺知识和软件编程的操作技能。 2、通过具体焊接实物PCB板,掌握实际工作中经常碰到的测试与调试的方法,从而达到进一步熟练掌握电子系统的开发全过程。
二、 实习内容: 12月19号
1、要求在一周的实践时间里,完成用PROTUS仿真一个单片机电路系统。
Sch9v-5v
2 、 AT89X51_74HC164_1
程序:
//////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// #include /////////////////////////////////////////////////////////////////////////////////////////// #define disp_clk P0_0 #define disp_dat P0_1 void disp_74HC164_1(unsigned char dat); //显示0-9的数字 void delay1ms(unsigned int Nms); ////disp_table[10]: 0,1,2,3,4,5,6,7,8,9共阳 const unsigned dispTable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// void main(void) { char unsigned char x; while(1) { x++; if(x>9) x = 0; disp_74HC164_1(x); delay1ms(500); } } ////////////////////////////////////////////////////////////////////////////////////////// ////------------------------------------------------------------------ ////////////////////////////////////////////////////////////////////////////////////////// void delay1ms(unsigned int Nms) { unsigned int i; unsigned char j; for(i=0;i unsigned char i; unsigned char tempdat; tempdat = dispTable[dat]; for(i=0;i<8;i++) { disp_clk = 0; disp_dat = (tempdat&0x80)?1:0; tempdat = tempdat<<1; disp_clk = 1; } } ///////////////////////////////////////////////////////////////////////////////// 3、 AT89X51_74HC164_4 程序: void disp_74HC164_4(unsigned int dat) { int x1,x2,x3,x4; unsigned char i; unsigned char tempdat; x1=dat%10; x2=(dat/10)%10; x3=(dat/100)%10; x4=(dat/1000)%10; tempdat=dispTable[x1]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } tempdat=dispTable[x2]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } } tempdat=dispTable[x3]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } tempdat=dispTable[x4]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } 12月20号 4、键盘显示 程序: #include \"AT89x52.h\" #define disp_clk P0_0 #define disp_dat P0_1 void disp_74HC164_4(unsigned int value); //显示0-9数字 void delay1ms(unsigned int Nms); //disp_table[10]:0,1,2,3,4,5,6,7,8,9共阳 const unsigned char dispTable[10]={0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/}; #define keyport P3 unsigned char key_cnt=0; unsigned int value=0; unsigned char timerx=0; ////////////////////////////////// void main(void) { /* unsigned int x; while(1) { x++; if(x>99) x=0; disp_74HC164_1(x); delay1ms(500); } */ TMOD=0x10; TH1=0x3c; TL1=0xb0; ET1=1; EA=1; TR1=1; while(1) { disp_74HCl64_4(); delaylms(300); } } unsigned char key scan() { unsigned char key1,key2; keyport=0xff; key1=~keyport; delaylms(20); key2=~keyport if(key1!=key2) return 555; if(key1==0x00) return 555; if(key1==0x01) return 0; if(key1==0x02) return 1; if(key1==0x04) return 2; if(key1==0x08) return 3; if(key1==0x10) return 4; if(key1==0x20) return 5; if(key1==0x40) return 6; if(key1==0x80) return 7; } void tlint() interrupt 3 { unsigned int key; TH1=0x3c; TL1=0xb0; timerx++; if(timerx!=4) return; timerx=0; key=keyscan(); if(key==222) return; if(key==7) { key_cnt=0; value=0; return; } (if key_cnt<4) key_cnt++; else return; if (key_cnt==1) value=key; if (key_cnt==2) value=value*10+key; if (key_cnt==3) value=value*10+key; if (key_cnt==4) value=value*10+key; } void delay1ms(unsigned int Nms) { unsigned int i; unsigned char j; for(i=0;i ///////////////显示 void disp_74HC164_4(unsigned int value) { int x1,x2,x3,x4; unsigned char i; unsigned char tempdat; x1=value%10; x2=(value/10)%10; x3=(value/100)%10; x4=(value/1000)%10; tempdat=dispTable[x1]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } tempdat=dispTable[x2]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } tempdat=dispTable[x3]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } tempdat=dispTable[x4]; for(i=0;i<8;i++) { disp_clk=0; disp_dat=(tempdat&0x80)?1:0; tempdat=tempdat<<1; disp_clk=1; } } 5、去零按键显示 程序: #include <74HC164.h> #define up P3_6 #define down P3_7 void delay1ms(unsigned int Nms); void main(void) { unsigned int x; x==0; disp_74HC164_4(x); delay1ms(500); while(1) { if(up==0) { while(up==0); x++; if(x>9999) x=0; disp_74HC164_4(x); //delay1ms(500); } if(down==0) { while(down==0); if(x<1) x=10000; x--; disp_74HC164_4(x); //delay1ms(500); } } } void delay1ms(unsigned int Nms) { unsigned int i; unsigned int j; for(i=0;i 程序: #include \"AT89x52.h\" #define dispdat P0 #define dispLE_1 P3_0 void disp_74HC573_1(unsigned char dat); //显示0-9数字 void delay1ms(unsigned int Nms); //disp_table[10]:0,1,2,3,4,5,6,7,8,9共阳 const unsigned char dispTable[10]={0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/}; void main(void) { unsigned char x; while(1) { dispLE_1=0; x++; if(x>9) x=0; disp_74HC573_1(x); delay1ms(500); } } void delay1ms(unsigned int Nms) { unsigned int i; unsigned char j; for(i=0;i void disp_74HC573_1(unsigned char dat) { dispLE_1=0; dispdat=dispTable[dat]; dispLE_1=1; dispLE_1=0; } 7、74HC573_4 程序: #include \"AT89x52.h\" #define dispDat P0 #define dispLE_1 P3_0 #define dispLE_2 P3_1 #define dispLE_3 P3_2 #define dispLE_4 P3_3 #define keyport P1 unsigned char key_cnt=0;//按键计数器 unsigned int value=0; unsigned int temp1=0;//KEY14加计数标志位 unsigned int temp2=0;//KEY11减记数标志位 unsigned char timerx=0; unsigned char keyscan(); //矩阵扫描 void disp_74hc573_4(unsigned int dat); void delay1ms(unsigned int Nms); const unsigned char dispTable[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void main(void) { TMOD=0x01; TH0=0x3C; TL0=0x0B; ET0=1; EA=1; TR0=1; value=0; dispLE_1=0; while(1) { disp_74hc573_4(value); delay1ms(400); if(temp1==1) //KEY14标志位=1,开始加计数 { value++; if(value>9999) value=0; } if(temp2==1) //KEY11标志位=1,开始减计数 { value--; if(value<0 ) value=9999; } } } //////////////////////////////////////////////////////////////////////////////////////////////// unsigned char keyscan() { unsigned char key1, key2, keyA, keyB; keyport = 0xf0; key1 = ~keyport; keyport = 0x0f; key2 = ~keyport; keyA = (key1&0xf0) + (key2&0x0f); delay1ms(20); keyport = 0xf0; key1 = ~keyport; keyport = 0x0f; key2 = ~keyport; keyB = (key1&0xf0) + (key2&0x0f); if(keyA != keyB) return 222; if(keyA==0x11) return 0; if(keyA==0x21) return 1; if(keyA==0x41) return 2; if(keyA==0x81) return 3; if(keyA==0x12) return 4; if(keyA==0x22) return 5; if(keyA==0x42) return 6; if(keyA==0x82) return 7; if(keyA==0x14) return 8; if(keyA==0x24) return 9; if(keyA==0x18) return 10; if(keyA==0x28) return 11; if(keyA==0x48) return 12; if(keyA==0x44) return 13; } /////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////// void t0int() interrupt 1 //定时 { unsigned int key=0; TH0=0x3C; TL0=0xB0; timerx++; if(timerx!=4) return; timerx=0; key=keyscan(); if(key==222) return; if(key ==10 ) { temp1=0; //按下KEY13 停止计数 ,并清0 key_cnt=0; value=0; return; } if(key==12) { temp1=~temp1;} //按下KEY15停止计数 值保持不变 if(key==11) //按下KEY14开始加计数 temp1=1; if(key==13) //按下KEY11开始减计数 temp2=1; if(key!=15) { if(key_cnt<4) key_cnt++; else return; if(key_cnt==1)value=key; if(key_cnt==2)value=value*10+key; if(key_cnt==3)value=value*10+key; if(key_cnt==4)value=value*10+key; } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// void delay1ms(unsigned int Nms) { unsigned int i; unsigned char j; for(i=0;i void disp_74hc573_4(unsigned int dat) { unsigned char i; unsigned char x1,x2,x3,x4; unsigned char tempdat; x1=dat%10; x2=(dat/10)%10; x3=(dat/100)%10; x4=(dat/1000)%10; dispLE_1=0; dispDat=dispTable[x1]; dispLE_1=1; dispLE_1=0; dispLE_2=0; dispDat=dispTable[x2]; dispLE_2=1; dispLE_2=0; dispLE_3=0; dispDat=dispTable[x3]; dispLE_3=1; dispLE_3=0; dispLE_4=0; dispDat=dispTable[x4]; dispLE_4=1; dispLE_4=0; } 8、 2Led_delay #include void Port_Init(void); // Port initialization routine void SYSCLK_Init(void); void delay(unsigned int dl); //----------------------------------------------------------------------------- sbit LED = P1^6; // LED='1' means ON sbit SW1 = P3^7; // SW1='0' means switch pressed //----------------------------------------------------------------------------- void main(void) { WDTCN = 0xDE; // Disable watchdog timer WDTCN = 0xAD; SYSCLK_Init(); //switch to external crystal Port_Init(); // Init Ports while (1){ LED = 1; delay(0xffff); LED = 0; delay(0xffff); }; } //----------------------------------------------------------------------------- void SYSCLK_Init(void) { unsigned int i; OSCICN |= 0x03; //configure internal oscillator for its highest frequency (16MHz) // Step 1. Enable the external oscillator. OSCXCN = 0x60; //b01100000; // external crystal mode, not divided by 2 OSCXCN |= 0x07; //b00000111; //crystal 10 MHz < f <= 30 MHz // Step 2. Wait at least 1 ms. for (i = 9000; i > 0; i--); // at 16 MHz, 1 ms = 16000 SYSCLKs, DJNZ = 2 SYSCLKs // Step 3. Poll for XTLVLD => ?? while ((OSCXCN & 0x80) != 0x80){}; // Step 4. Switch the system clock to the external oscillator. OSCICN |= 0x08; } //----------------------------------------------------------------------------- void Port_Init(void) { XBR0 = 0x04; // Route UART0 to crossbar XBR2 |= 0x40; // Enable crossbar, weak pull-ups P0MDOUT |= 0x01; // enable TX0 as a push-pull output P1MDOUT |= 0x40; // enable LED as push-pull output P0MDOUT |= 0x01; // Set TX1 pin to push-pull P1MDOUT |= 0x40; // Set P1.6(LED) to push-pull } //----------------------------------------------------------------------------- void delay(unsigned int dl) { do{ dl--; }while(dl>0); } //---------------------------------- 12月22号 程序1:按键按一次亮一次 #include \"c8051F020.h\" sbit led1=P1^6; sbit key1=P3^7; void delay(unsigned int n) { unsigned int i,j; for(i=0;i //////////////////////////////////// // OSCICN = 0x06; P1MDOUT=0X40; XBR2=0X40; //////////////////////////////////// while(1) { if(key1==0) { led1=1; } else { led1=0; } /* led1=1; delay(800) ; led1=0; delay(800); */ } } 程序2:闪烁,延时 #include \"C8051F020.h\" sbit LED1 = P1^6; // LED='1' means ON sbit key1 = P3^7; // SW1='0' means switch pressed //----------------------------------------------------------------------------- void delay(unsigned int n) { unsigned int i,j; for(i=0;i } 程序3:按键,中断,闪烁 #include \"c8051F020.h\" sbit led1=P1^6; sbit key1=P3^7; unsigned int cntInt; void Timer_Init() { TMOD = 0x02; TL0 = 0x01; TH0 = 0x01; } void Interrupts_Init() { IE = 0x82; } void Timer0_ISR(void) interrupt 1 { cntInt++; if(cntInt>100) {cntInt=0; led1=~led1; } } //////////////////////////////////// main() { //////////////////////////////////// // OSCICN = 0x06; P1MDOUT=0X40; XBR2=0X40; //////////////////////////////////// Timer_Init(); Interrupts_Init(); while(1) { if(key1==0) { led1=1; } else { led1=0; } /* led1=1; delay(800) ; led1=0; delay(800); */ } } 12月23号 程序1: 2_led1_delay #include void Port_Init(void); // Port initialization routine void SYSCLK_Init(void); void delay(unsigned int dl); //----------------------------------------------------------------------------- sbit LED = P1^6; // LED='1' means ON sbit SW1 = P3^7; // SW1='0' means switch pressed //----------------------------------------------------------------------------- void main(void) { WDTCN = 0xDE; // Disable watchdog timer WDTCN = 0xAD; // SYSCLK_Init(); //switch to external crystal Port_Init(); // Init Ports while (1){ LED = 1; delay(0xffff); LED = 0; delay(0xffff); }; } //----------------------------------------------------------------------------- void SYSCLK_Init(void) { unsigned int i; OSCICN |= 0x03; //configure internal oscillator for its highest frequency (16MHz) // Step 1. Enable the external oscillator. OSCXCN = 0x60; //b01100000; // external crystal mode, not divided by 2 OSCXCN |= 0x07; //b00000111; //crystal 10 MHz < f <= 30 MHz // Step 2. Wait at least 1 ms. for (i = 9000; i > 0; i--); // at 16 MHz, 1 ms = 16000 SYSCLKs, DJNZ = 2 SYSCLKs // Step 3. Poll for XTLVLD => ?? while ((OSCXCN & 0x80) != 0x80){}; // Step 4. Switch the system clock to the external oscillator. OSCICN |= 0x08; } //----------------------------------------------------------------------------- void Port_Init(void) { XBR0 = 0x04; // Route UART0 to crossbar XBR2 |= 0x40; // Enable crossbar, weak pull-ups P0MDOUT |= 0x01; // enable TX0 as a push-pull output P1MDOUT |= 0x40; // enable LED as push-pull output P0MDOUT |= 0x01; // Set TX1 pin to push-pull P1MDOUT |= 0x40; // Set P1.6(LED) to push-pull } //----------------------------------------------------------------------------- void delay(unsigned int dl) { do{ dl--; }while(dl>0); } //----------------------------------------------------------------------------- 程序2:3_led1_timer #include //----------------------------------------------------------------------------- void Port_Init(void); // Port initialization routine void SYSCLK_Init(void); void timer3(void); //----------------------------------------------------------------------------- unsigned char stepXXmsfactor = 40; //stepXXmsfactor * 25ms = XXms sbit LED = P1^6; // LED='1' means ON //----------------------------------------------------------------------------- void main(void) { WDTCN = 0xDE; // Disable watchdog timer WDTCN = 0xAD; SYSCLK_Init(); //switch to external crystal Port_Init(); // Init Ports CKCON = 0x08; //use sysclk TMR3H = 0x4c; //25ms TMR3L = 0x00; TMR3RLH = TMR3H; TMR3RLL = TMR3L; IE = 0x80; EIE2 = 0x01; //enabled int: t3, ea TMR3CN |= 0x04; //TR3 = 1; while (1){}; } //----------------------------------------------------------------------------- void SYSCLK_Init(void) { unsigned int i; OSCICN |= 0x03; //configure internal oscillator for its highest frequency (16MHz) // Step 1. Enable the external oscillator. OSCXCN = 0x60; //b01100000; // external crystal mode, not divided by 2 OSCXCN |= 0x07; //b00000111; //crystal 10 MHz < f <= 30 MHz // Step 2. Wait at least 1 ms. for (i = 9000; i > 0; i--); // at 16 MHz, 1 ms = 16000 SYSCLKs, DJNZ = 2 SYSCLKs // Step 3. Poll for XTLVLD => ?? while ((OSCXCN & 0x80) != 0x80){}; // Step 4. Switch the system clock to the external oscillator. OSCICN |= 0x08; } //----------------------------------------------------------------------------- void Port_Init(void) { XBR0 = 0x04; // Route UART0 to crossbar XBR2 |= 0x40; // Enable crossbar, weak pull-ups P0MDOUT |= 0x01; // enable TX0 as a push-pull output P1MDOUT |= 0x40; // enable LED as push-pull output P0MDOUT |= 0x01; // Set TX1 pin to push-pull P1MDOUT |= 0x40; // Set P1.6(LED) to push-pull } //----------------------------------------------------------------------------- void timer3(void) interrupt 14 { stepXXmsfactor--; if (stepXXmsfactor == 0) { stepXXmsfactor = 40; LED = ~LED; } TMR3CN &= 0x7f; //tf3=0, note that t3's interrupt flag must be cleared by software. this not like t0,t1 } //----------------------------------------------------------------------------- 程序3:1_led_breathing #include //---------------------------------------------------------------------------------- void SYSCLK_Init(void); void Port_Init(void); void timer0(void); void timer3(void); //---------------------------------------------------------------------------------- //pulse high time + low time = 1 pulse cycle, i define the pulse cycle relate to 250, any value big enough but 255 not. #define PulseCycle 250 unsigned char PulseHighCounts[] = {0,30,60,90,120,150,180,210,240,250,250,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,0,0,0,0}; unsigned char PulseHighCount, PulseLowCount; unsigned char index; unsigned char IsHigh; unsigned char stepXXmsfactor = 2; //stepXXmsfactor * 25ms = XXms sbit LED = P1^6; //---------------------------------------------------------------------------------- void main() { WDTCN = 0xDE; // Disable watchdog timer WDTCN = 0xAD; SYSCLK_Init(); Port_Init(); index = 0; PulseHighCount = PulseHighCounts[index]; PulseLowCount = PulseCycle - PulseHighCount; IsHigh = 1; CKCON = 0x08; //use sysclk TMOD = 0x02; //t0=mode 2, 8bit auto-reload //TMR3CN = 0x02; //0x02 means t3 use sysclk, default 0x00 means sysclk/12 TH0 = 0xff; //as short as possible TL0 = 0xff; TMR3H = 0x4c; //25ms TMR3L = 0x00; TMR3RLH = TMR3H; TMR3RLL = TMR3L; IE = 0x82; EIE2 = 0x01; //enabled int: t0, t3, ea //t0=base pulse, t1=adjust time interval EIP2 = 0x01; //timer3 priority high. IMPORTANT!! otherwise there's no time change for T3 to run it's int routine, cpu is busily interrupted by t0 TR0 = 1; TMR3CN |= 0x04; //TR3 = 1; while(1){}; } //---------------------------------------------------------------------------------- void SYSCLK_Init(void) { unsigned int i; OSCICN |= 0x03; //configure internal oscillator for its highest frequency (16MHz) // Step 1. Enable the external oscillator. OSCXCN = 0x60; //b01100000; // external crystal mode, not divided by 2 OSCXCN |= 0x07; //b00000111; //crystal 10 MHz < f <= 30 MHz // Step 2. Wait at least 1 ms. for (i = 9000; i > 0; i--); // at 16 MHz, 1 ms = 16000 SYSCLKs, DJNZ = 2 SYSCLKs // Step 3. Poll for XTLVLD => ?? while ((OSCXCN & 0x80) != 0x80){}; // Step 4. Switch the system clock to the external oscillator. OSCICN |= 0x08; } //---------------------------------------------------------------------------------- void Port_Init(void) { XBR0 = 0x04; // Route UART0 to crossbar XBR2 |= 0x40; // Enable crossbar, weak pull-ups P0MDOUT |= 0x01; // enable TX0 as a push-pull output P1MDOUT |= 0x40; // enable LED as push-pull output P0MDOUT |= 0x01; // Set TX1 pin to push-pull P1MDOUT |= 0x40; // Set P1.6(LED) to push-pull } //---------------------------------------------------------------------------------- void timer0(void) interrupt 1 { if (IsHigh==1) //LED is on { if (PulseHighCount == 0) //it's end for on, now change LED to off { LED = 0; IsHigh = 0; PulseHighCount = PulseHighCounts[index]; PulseLowCount = PulseCycle - PulseHighCount; } else PulseHighCount--; } else //LED is off { if (PulseLowCount == 0) //it's end for off, now change LED to on { LED = 1; IsHigh = 1; PulseHighCount = PulseHighCounts[index]; PulseLowCount = PulseCycle - PulseHighCount; } else PulseLowCount--; } } //---------------------------------------------------------------------------------- void timer3(void) interrupt 14 { stepXXmsfactor--; if (stepXXmsfactor == 0) { stepXXmsfactor = 2; index++; if (index==sizeof(PulseHighCounts)) index = 0; PulseHighCount = PulseHighCounts[index]; PulseLowCount = PulseCycle - PulseHighCount; } TMR3CN &= 0x7f; //tf3=0, note that t3's interrupt flag must be cleared by software. this not like t0,t1 } //---------------------------------------------------------------------------------- 因篇幅问题不能全部显示,请点此查看更多更全内容