1、广州周立功单片机发展有限公司面试题集锦(考生整理) 试题一:对 80C51 单片机内部 RAM 低 128 字节存储单元清零,请用汇编语言编程(12 分)。 答题分析:这是一道非常基础的题目,具有良好习惯的程序员编写的第一段程序就是对单 片机上电进行初始化。单片机内部低 128 字节即就是 0127,转换为 16 进制数值则表示为 07FH。如果用循环语句的话,那么计数器的初始值应该为 7FH,假设 R0=7FH。程序设 计如下: ORG 0000H AJMP MAIN ORG 0030H MAIN:MOV R0,#7FH CLR A LOOP:MOV R0,A DJNZ R0,LOOP AJ
2、MP $ ; END R0 在此既作为循环程序计数器,又作为内部存储单元的动态地址指针(计数器) 。当 计数器 R0 为 7FH 时,那么 R0 所对应的存储单元的地址为 7FH;当计数器 R0 减 1 时,则 R0 所对应的存储单元地址相应地减 1;当计数器 R0 减为 0 时,则 R0 所对应的存储单元地 址也减为 0,即就是 00H 单元。 如果选用 R1 作为计数器的话,即便将 R1 减为 0,也不能将 00H 单元清 0,因为 R1 在内 部存储器的实际地址为 01H,那么最后还需要单独对 00H 单元进行清 0 才能完成初始化。 试题二:用 MCS-51 单片机的 I/O 口直接驱
3、动 8 个发光二极管,回答以下问题(12 分): (1) 试画出实现原理图,给出合适的电路参数; (2) 用“汇编语言或 C 语言编程” ,将这 8 个发光管循环点亮,每次只有一个亮,用肉眼能 看见其循环。 试题三:用你最熟悉单片机的 I/O 口直接驱动一个七段字形 LED 数码管,回答以下问题 (12 分): (1) 试画出实现原理图,给出合适的电路参数,得到合适的笔形码; (2) 用“汇编语言或 C 语言编程” ,让数码管循环显示 09,用肉眼能看见其循环。 试题四:算放大器:求放大倍数,何时输入电阻最大;555 定时口器接成的多谐振荡器: 工作原理,波形图,振荡周期;74HC594 的用
4、法:用 74HC594 来驱动一位七段数码管,要 求循环显示 09 硬件 A(本科)有七题: 1、运放,用到虚短虚断的知识 2、三极管设计成的电源控制电路,用到三极管电流电压基本计算 3、串联电路转换成并联电路,用到阻抗变换的计算 4、运放电路放大倍数的计算及输入电阻的计算 5、555 多谐振荡电路,数电课本的例题 6、单片机程序设计题:用 74HC594 来驱动一位七段数码管,要求循环显示 09 7、C 语言程序设计题:涉及数据结构与队列 试题五: 试题六:用任意一单片机设计一个 4X4 的键盘并编出程序得到键值,要求有去抖,去抖时 单片机可以做其它事情,按一下键盘蜂鸣器叫一下,蜂鸣器叫过程
5、中也要单片机可以做其 它事情。 (提示:用定时器产生基本节拍) 题目是我做后记下来的,当时在做得时候写的很乱,被老师评为编程不怎么样。回来后想 想其实很简单就一个中断函数搞定: void time1_sv() interrupt 5 using 2 EA=0; TF2=0; /清中断标志位 if(spcnt-)=0)spcnt=0;SPEAK=0x00; if(scankey()count+; if(count8)getkeyval();count=0;spcnt=30;SPEAK=0xff; else count=0; EA=1; 思路是:连续 n 次进入中断时都检测到有按键,那就去取按键值
6、,并使蜂鸣器叫,蜂鸣器叫 多长时间由 spcnt 的值决定。 试验源程序: #include “mydef.h“ /定义外围器件地址 #define SPEAK XBYTE0xC000 #define KEYIN XBYTE0xE000 #define KEYOUT XBYTE0xF000 #define PORTA XBYTE0xa000 #define PORTB XBYTE0xb000 #define LEDD XBYTE0x9000 /3000 个机器周期中断一次 #define TIME_H (65535-3000)/256 #define TIME_L (65535-3000)%2
7、56 /LED 显示译码 uchar code table=0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0A1,0 x86,0x8E,0x7F,0x89; /全局变量 uchar key_value,count,spcnt; /判断有无按键 uchar scankey() KEYOUT=0x00; if(KEYIN) /有键按下 else return(0); /得到键值 void getkeyval(void) KEYOUT=0x0e; switch(KEYINbreak; case 13:
8、key_value=1;break; case 11:key_value=2;break; case 7:key_value=3;break; default:break; KEYOUT=0x0d; switch(KEYINbreak; case 13:key_value=5;break; case 11:key_value=6;break; case 7:key_value=7;break; default:break; KEYOUT=0x0b; switch(KEYINbreak; case 13:key_value=9;break; case 11:key_value=10;break;
9、 case 7:key_value=11;break; default:break; KEYOUT=0x07; switch(KEYINbreak; case 13:key_value=13;break; case 11:key_value=14;break; case 7:key_value=15;break; default:break; /定时 T2 中断 89c52,w78e58 之类的单片机都有定时器 2 void time1_sv() interrupt 5 using 2 EA=0; TF2=0; /清中断标志位 if(spcnt-)=0)spcnt=0;SPEAK=0x00;
10、if(scankey()count+; if(count8)getkeyval();count=0;spcnt=30;SPEAK=0xff; else count=0; EA=1; /粗劣延时 mS 级 void msec(uint x) unsigned int j; while(x-)!=0) for(j=0;j=123;j+) ; /数码管显示 void dir(uchar leddat) ORTA=0x00; ORTB=0xff; LEDD=tableleddat; msec(2); ORTA=0xff; LEDD=tableleddat; ORTB=0x00; msec(2); ORTB=0xFF; /主函数 main() C_T2=0; /T2 工作在定时器 CP_RL2=0; /自动装栽 RCAP2H=TH2=TIME_H; RCAP2L=TL2=TIME_L; EA=1; ET2=1; TR2=1; while(1) dir(key_value);