单片机面试题.docx
- 文档编号:10874490
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:10
- 大小:34.20KB
单片机面试题.docx
《单片机面试题.docx》由会员分享,可在线阅读,更多相关《单片机面试题.docx(10页珍藏版)》请在冰豆网上搜索。
单片机面试题
1.看门狗复位重置点应该放在程序什么地方
2.六个按键最少需要几个普通IO口线
答案:
两根
#include
#defineucharunsignedchar
sbitIO1=P1^6;
sbitIO2=P1^7;
ucharkeybuf,keydat;
bitbkeyok;
voiddelay_us(unsignedintn)
{
while(--n);
}
voiddelay_ms(unsignedintn)
{
do
{
delay_us(1000);
}
while(--n);
}
bitscan_key(void)
{
uchartempkey;
IO1=1;IO2=1;
if(!
IO1)
{
if(!
IO2)
tempkey=3;
else
tempkey=2;
}
else
{
if(!
IO2)
tempkey=1;
else
{
IO1=0;
if(!
IO2)
{
IO1=1;IO2=0;
if(!
IO1)
tempkey=4;
else
tempkey=6;
}
else
{
IO1=1;IO2=0;
if(!
IO1)
tempkey=5;
else
tempkey=0;
}
}
}
IO1=1;IO2=1;
if((keybuf!
=0)&&(keybuf==tempkey))
{
bkeyok=1;
keydat=tempkey;
}
keybuf=tempkey;
return(bkeyok);
}
ucharread_key(void)
{
bkeyok=0;
return(keydat);
}
voiddoanything(ucharkey)
{
//----------处理只有有并正确消抖时才会进入,功能自己随便写
;
}
voidmain(void)
{
while
(1)
{
if(scan_key())
doanything(read_key());
delay_ms(10);
}
}
3.普通IO口如何实现LED十六级亮度调节
答案:
PWM控制
加速度传感器求位移算法。
数字滤波算法。
51浮点运算方法。
CD4060
微积分
Ucos操作系统GUI编程
继电器RC电路
运放电路分析
USB驱动
位运算是指按二进制进行的运算。
在系统软件中,常常需要处理二进制位的问题。
C语言提供了6个位操作运算符。
这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表:
运算符含义描述
&按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|按位或两个相应的二进制位中只要有一个为1,该位的结果值为1
^按位异或若参加运算的两个二进制位值相同则为0,否则为1
~取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<<左移用来将一个数的各二进制位全部左移N位,右补0
>>右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
1、“按位与”运算符(&)
按位与是指:
参加运算的两个数据,按二进制位进行“与”运算。
如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。
按位与其实与逻辑上“与”的运算规则一致。
逻辑上的“与”,要求运算数全真,结果才为真。
若,A=true,B=true,则A∩B=true例如:
3&53的二进制编码是11
(2)。
(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。
位是用以描述电脑数据量的最小单位。
二进制系统中,每个0或1就是一个位。
将11
(2)补足成一个字节,则是00000011
(2)。
5的二进制编码是101
(2),将其补足成一个字节,则是00000101
(2)
按位与运算:
00000011
(2)
&00000101
(2)
00000001
(2)
由此可知3&5=1
c语言代码:
#include
main()
{
inta=3;
intb=5;
printf("%d",a&b);
}
按位与的用途:
(1)清零
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:
原来的数中为1的位,新数中相应位为0。
然后使二者进行&运算,即可达到清零目的。
例:
原数为43,即00101011
(2),另找一个数,设它为148,即10010100
(2),将两者按位与运算:
00101011
(2)
&10010100
(2)
00000000
(2)
c语言源代码:
#include
main()
{
inta=43;
intb=148;
printf("%d",a&b);
}
(2)取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a0010110010101100
b00000
c00000
(3)保留指定位:
与一个数进行“按位与”运算,此数在该位取1.
例如:
有一数84,即01010100
(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:
01010100
(2)
&00111011
(2)
00010000
(2)
即:
a=84,b=59
c=a&b=16
c语言源代码:
#include
main()
{
inta=84;
intb=59;
printf("%d",a&b);
}
2、“按位或”运算符(|)
两个相应的二进制位中只要有一个为1,该位的结果值为1。
借用逻辑学中或运算的话来说就是,一真为真
。
例如:
60(8)|17(8),将八进制60与八进制17进行按位或运算。
00110000
|00001111
00111111
c语言源代码:
#include
main()
{
inta=060;
intb=017;
printf("%d",a|b);
}
应用:
按位或运算常用来对一个数据的某些位定值为1。
例如:
如果想使一个数a的低4位改为1,则只需要将a与17(8)进行按位或运算即可。
(3)交换两个值,不用临时变量
例如:
a=3,即11
(2);b=4,即100
(2)。
想将a和b的值互换,可以用以下赋值语句实现:
a=a∧b;
b=b∧a;
a=a∧b;
a=011
(2)
(∧)b=100
(2)
a=111
(2)(a∧b的结果,a已变成7)
(∧)b=100
(2)
b=011
(2)(b∧a的结果,b已变成3)
(∧)a=111
(2)
a=100
(2)(a∧b的结果,a已变成4)
等效于以下两步:
①执行前两个赋值语句:
“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
②再执行第三个赋值语句:
a=a∧b。
由于a的值等于(a∧b),b的值等于(b∧a∧b),
因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。
很神奇吧!
c语言源代码:
#include
main()
{
inta=3;
intb=4;
a=a^b;
b=b^a;
a=a^b;
printf("a=%db=%d",a,b);
}
4、“取反”运算符(~)
他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。
例如:
~77(8)
源代码:
#include
main()
{
inta=077;
printf("%d",~a);
}
5、左移运算符(<<)
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负
值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
例如:
将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。
若a=15,即00001111
(2),左移2
位得00111100
(2)。
源代码:
#include
main()
{
inta=15;
printf("%d",a<<2);
}
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。
但此结论只适用于该
数左移时被溢出舍弃的高位中不包含1的情况。
假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0
,而左移2位时,溢出的高位中包含1。
6、右移运算符(>>)
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负
值),移到右端的低位被舍弃,对于无符号数,高位补0。
对于有符号数,某些机器将对左边空出的部分
用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。
注
意:
对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移
入0。
如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。
有的系统移入0,有的
系统移入1。
移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
例:
a的值是八进制数113755:
a:
11101(用二进制形式表示)
a>>1:
10110(逻辑右移时)
a>>1:
11110(算术右移时)
在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是145766。
TurboC和其他一些C
编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。
源代码:
#include
main()
{
inta=0113755;
printf("%d",a>>1);
}
7、位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运算符。
例如:
&=,|=,>>=,<<=,∧=
例:
a&=b相当于a=a&b
a<<=2相当于a=a<<2
1
一月
二月
三月
产品名称
数量
金额
利润
产品名称
数量
金额
利润
产品名称
数量
金额
利润
合计
合计
合计
四月
五月
六月
产品名称
数量
金额
利润
产品名称
数量
金额
利润
产品名称
数量
金额
利润
合计
合计
合计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 试题