单片机复习参考答案Word文档下载推荐.docx
《单片机复习参考答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机复习参考答案Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
(1,波特率相同2,帧格式也要相同)
10.8051单片机最小系统原理图
11.8051控制74HC164,PCF8563,DS18B20,TLC549,数码管要几根线
(分别为2根,2根,1根,3根,)
12.异步串行通讯标准波特率是哪些值
(11520,12800,14400,19200,28800,38400,57600,115200)
13.REG52.H文件的作用是什么
(定义了一些宏,把单片机中的寄存器地址封装)
14.display.h,pcf8563.h,ds18B20.h,tlc549.h文件中一般有什么内容
display.h
voidshift(unsignedcharn,flag);
voiddisplay(unsignedcharj0,j1,j2,j3,j4,j5,j6,j7);
sbitsda=P0^5;
sbitscl=P0^6;
codecharled_code[19]=
{//displaycode
0x11,0xd7,0x32,0x92,0xd4,//0,1,2,3,4
0x98,0x18,0xd3,0x10,0x90,//5,6,7,8,9
0x50,0x1c,0x39,0x16,0x38,//a,b,c,d,e
0x78,0xfe,0xef,0xff//f-dotdark
};
pcf8563.h
sbitsda_8563=P0^3;
sbitscl_8563=P0^2;
unsignedcharyear,mon,day,hou=0x16,min=0x16,sec=0x20,week,last_week=7;
constunsignedchartime[7]={0x09,0x11,0x20,0x05,0x11,0x14,0x30};
//设置初值:
年.月.日.星期.时.分.秒
//与PCF8563有关的函数声明
voidstart(void);
//开始子程序
voidstop(void);
//结束子程序
unsignedcharwritebyte_8563(unsignedchar);
//写一个字节=====
unsignedcharreadbyte_8563(void);
//读一个字节
voidread_time_8563(void);
//读日期,数据放于year,mon,day,hou,min,sec,week
voidwrite_time_8563(void);
//写日期初值
ds18B20.h
sbitDQ=P0^4;
voiddelay(unsignedint);
voidinit_DS18B20(void);
ucharread_one_char(void);
voidwrite_one_char(unsignedchar);
intread_temperature(void);
tlc549.h
Sbitcs_549=P3^7;
Sbitsda_549=P3^6;
Sbitscl_549=P3^5;
Voiddelay(unsignedchar);
unsignedcharread_549();
15.手工推导数码管显示代码
首先运行数组LED[]={0x00,0x01,0x02,0x40,0x08,0x10,0x20,0x40,0x80,0xff}
然后标出顺序,根据顺序计算代码
16.延时约约1秒左右的程序
voiddelay1s(void)//延时1000000us,误差0us
{
unsignedchara,b,c;
for(c=167;
c>
0;
c--)
for(b=171;
b>
b--)
for(a=16;
a>
a--);
}
17.接P2口的发光二极管显示花样程序
#include<
reg52.h>
voiddelay_1s(unsignedintx);
main(){
while
(1){
P2=0xfe;
//11111110
delay_1s(42000);
P2=0xfd;
//11111101
delay_1s(42000);
P2=0xfb;
//11111011
P2=0xf7;
//11110111
P2=0xef;
//11101111
P2=0xdf;
//11011111
P2=0xbf;
//10111111
P2=0x7f;
//01111111
}}
18.数码管移位程序(使用74HC164芯片)
voidshift(ucharn)
ucharm,i;
m=table[n];
scl=0;
for(i=0;
i<
8;
i++)
{
if(m&
0x80)
sda=1;
else
sda=0;
scl=1;
scl=0;
m<
<
=1;
}
19.写出8个数码管显示(使用74HC164芯片)
voidshift(unsignedchar);
sbitsda=P0^0;
//mustmodifysbit
scl=P0^1;
//mustmodify
codecharled_code[12]=
{0xff,0xff,0xff,0xff,0xfe,0xfd,
0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};
main(){
unsignedchari;
while
(1){
for(i=0;
10;
i++){
shift(i);
}}}
voidshift(unsignedcharn){
unsignedcharm,i;
m=led_code[n];
scl=0;
i++)
if(m&
0x80)
{sda=1;
}
else
{sda=0;
}
scl=1;
m<
}}
voiddelay_1s(unsignedintx)
{
while(x--)
20.写出一个60以内整数变成可以用两个数码管十进制显示的拆分程序
Separate(inti)
For(i=0;
60;
I0=i/10;
I1=i%10;
21.写出一个255以内整数变成可以用两个数码管(十六进制)显示的拆分程序
Separate(unsignedinta)
{
A0=a/16;
A1=a%16;
22.设单片机晶振频率为4MHZ,使用定时器1以工作方式2产生周期为200微秒的等宽的方波脉冲,并在P1.6端输出,写出完整程序
计算:
机器周期为T=12/4=3(us)现在要产生200us的等宽方波脉冲,
Main()
Sbitout=P1.6
TMOD=0x20;
//定时器1和工作方式2
TH1=(256-66)/16;
TL1=(256-66)%16;
EA=1;
ET1=1;
TR1=1;
While
(1);
Voidtime1()interuppt2
P1.6=!
P1.6;
这道题用定时器很难得到完全准确的时间,这里是用大概的时间!
!
23.写出两机通讯程序
#include<
voidSerial_Send(unsignedcharSdata);
main()
while
(1)
unsignedchari;
//
TH1=0xfa;
TL1=0xfa;
SCON=0x50;
PCON=0x80;
//Buaddouble
TR1=1;
100;
Serial_Send(i);
//*****************************//
voidSerial_Send(unsignedcharSdata)
TI=0;
//清发送标记位
SBUF=Sdata;
//要发的数据放入缓冲区
while(!
TI);
//等待一帧数据发送完毕
voidSerial_Receive(unsignedcharSdata);
delay_1s(40000);
//0x80
EA=1;
ES=1;
while
(1);
voidSerial_Receive()interrupt4
{//中断接收服务函数
unsignedcharSdata;
Sdata=SBUF;
//把缓冲区的收到数据取出
RI=0;
//清接收标记位
24.根据I2C总线协议和PCF8563波形图,写出PCF8563:
1.关闭总线程序;
//我觉得应该是启动总线
voidstart(void)//开始子程序
sda_8563=1;
scl_8563=1;
sda_8563=0;
scl_8563=0;
2.结束总线程序;
voidstop(void)//结束子程序
读一个字节程序;
//======读一个字节=======
unsignedcharreadbyte_8563(void)
unsignedchari=8;
unsignedchardat=0x00;
for(;
i>
i--)
dat=dat<
1;
if(sda_8563)dat|=0x01;
return(dat);
3.写一个字节程序;
unsignedcharwritebyte_8563(unsignedchardat)//写一个字节
unsignedinti;
unsignedcharack=1;
for(i=8;
if(dat&
0x80){sda_8563=1;
else{sda_8563=0;
dat<
while(sda_8563){i++;
if(i==50000)break;
ack=sda_8563;
return(ack);
//有应答则返回0,无的返回1
4.读PCF8563年月日时分秒程序
voidread_time_8563(void)//读日期
7;
start();
writebyte_8563(0xa2);
//选择写8563芯片
writebyte_8563(i+0x02);
//写地址
writebyte_8563(0xa3);
//选择读8563芯片
switch(i)
{
case0:
sec=(readbyte_8563())&
0x7f;
break;
case1:
min=(readbyte_8563())&
case2:
hou=(readbyte_8563())&
0x3f;
case3:
day=(readbyte_8563())&
case4:
week=(readbyte_8563())&
0x07;
case5:
mon=(readbyte_8563())&
0x1f;
case6:
year=(readbyte_8563())&
0xff;
default:
}
stop();
sec=((sec&
0xf0)>
>
4&
0x0f)*10+(sec&
0x0f);
min=((min&
0x0f)*10+(min&
hou=((hou&
0x0f)*10+(hou&
day=((day&
0x0f)*10+(day&
mon=((mon&
0x0f)*10+(mon&
year=((year&
0x0f)*10+(year&
//BCD码转换成10进制数
25.根据1—Wire总线协议和给出DS18B20波形图,写出DS18B20:
1.启动总线程序
voidinit_DS18B20(void)
unsignedcharx=0;
DQ=1;
//DQ复位
delay(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
delay(80);
//精确延时大于480us
//拉高总线
delay(35);
2.写一个字节程序
voidwrite_one_char(unsignedchardat)
unsignedchari=0;
for(i=8;
i>
i--)
DQ=dat&
0x01;
delay(5);
dat>
3.读两个字节程序
ucharread_one_char(void)
unsignedchari=0;
unsignedchardat=0;
//给脉冲信号
//先进行移位操作,以免最后一位不能读出
if(DQ)
dat|=0x80;
delay(4);
returndat;
4.字节合并与折分程序
intread_temperature(void)
unsignedchara=0;
unsignedcharb=0;
intt=0;
init_DS18B20();
//初始化
write_one_char(0xCC);
//跳过读序号列号的操作
write_one_char(0x44);
//启动温度转换
//跳过读序号列号的操作
write_one_char(0xBE);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=read_one_char();
b=read_one_char();
t=b;
t<
=8;
t|=a;
returnt;
}
unsignedintTemp,LastTemp;
unsignedcharTEMP_H,TEMP_L,high_T,low_T;
while
(1)
Temp=read_temperature();
if(Temp!
=LastTemp)//温度变化时,才进行显示
TEMP_H=Temp>
TEMP_L=Temp;
high_T=((TEMP_H<
4)&
0xf0)|((TEMP_L>
//整数部分
ow_T=(unsignedchar)((TEMP_L&
0x0f)*0.625*10);
//小数部分
LastTemp=Temp;
//保存现在的温度值,准备与下一个读出的温度比较
separate(low_T,high_T);
display(j0,j1,j2,j3,j4,j5,j6,j7);
voidseparate(unsignedcharlow_T,high_T)
j0=low_T%10;
j1=low_T/10;
j2=high_T%10;
j3=high_T/10;
26.根据SPI总线协议和给出TLC549波形图,写出TLC549芯片的读A/D程序
ad549.h>
unsignedcharRead_549()
unsignedcharvalue_549=0;
sda_549=1;
//释放总线
scl_549=0;
//时钟低
cs_549=1;
//完成准备状态
cs_549=0;
delay(10);
if(sda_549==1)value_549|=0x01;
value_549<
scl_549=1;
return(value_549);
27.本课程的上机实验操作过程有关要点
28.本课程的上机实验时的出错信息的含义