单片机期末复习资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、给原码,写补码。(如原码为两个负数)
补码的补码就是原码
带符号数中只有负数的原码反码和补码是不一样的,正数的这些都是一样的,涉及码制转换
原码求补码是取反加1
补码求原码还是取反加1(符号位除外)
(正数的原反补一致,负数的反码为原码取反,补码为反码末尾加一,从补码到原码,再取反加1。以八位2进制位为例: 1 0000001 -1原码,最高位1表示负数 1 1111110 -1反码,除了符号位其余全部取反1 1111111 -1补码,反码加1)
2、在C语言程序设计中,逻辑运算符的表示。逻辑“与”:&&;逻
辑“或”:||;逻辑“非”:!;按位逻辑“与”:&;“或”:|;“异
或”:^;“取反”:~。
3、C工程的头文件要包含某些文件要如何写?如:
#include
4、关于STC15F2K60S2单片机:
复位后,P1口是什么电平?高电平;SP值是多少?07H内部程序存储空间:8~62KB的Flash程序存储器、2KB的片内SRAM数据存储器、内部数据存储器、Data Flash(即EEPROM);内部有多少(3个:T0、T1、T2)个定时计数器?多少(2个:串口1、串口2)个串口?多少(14)个中断源?单片机里边的AD通道占用哪个I/O口?P1口
如何计算定时计数初值?
定时器的初值的计算如下:
在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。若选择12M晶振,则定时器的计数频率为1MHZ。假设定时时间为T,机器周期为T1,即12/晶振频率。X为定时器初值。则 X=2^n-T/T1。方式0,n=13,方式1时,n=16,方式2和方式3,n=8
大题:
5、简述STC15F2K60S2单片机响应中断的基本条件与基本过程?先做什么,再做什么,最后做什么?
单片机响应中断的条件是:
(1)、开中断(CPU开中断,即中断允许控制寄存器IE中的中断总允许位EA=1。)
(2)、该中断源要允许中断(该中断源的中断允许位=1,即该中断源没有被屏蔽。)
(3)、没有高级别的中断在申请中断或同级别的中断在处理(中断源
发出中断请求,即该中断源对应的中断请求标志为1。)
(4)、该中断源被触发。
中断响应被封锁的情况:
(1)、CPU正在处理同级或高优先级的中断;
(2)、所查询的机器周期不是所执行指令的最后一个机器周期;(3)、正在执行的指令是RET1或是访问IE、IP寄存器的指令。
中断处理过程分为四个阶段:中断请求、中断响应、中断服务、中断返回。
(编程步骤:设置SP堆栈指针;设置中断优先级;控制中断源的操作(外部中断触发方式、定时器方式与启动);允许中断;开放中断;设计中断服务子程序(包括中断入口设置)。)
中断响应的主要过程:首先将程序计数器PC的内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向相应的中断入口地址。
5、做异步串行通信时,通信双方要事先协商好那些东西?
所谓异步通信,就是接收和发送双方不使用共同的同步时钟来控制收、发双方的同步,而是依靠各自的时钟来控制数据的转送。在串行口异步通信中,收发双方发送和接收串行数据的速率必须一致。波特率发生器的作用就是用来协调收发双方串行通信速率保持一致的。
程序题:
7、温度采集实验:DS18B20的初始化(12分)。
bit Init_DS18B20(void)
{
DQ = 1; //DQ复位
Delay_us(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_us(90); //精确延时大于 480us
DQ = 1; //拉高总线
Delay_us(8);
presence = DQ; //如果=0则初始化成功 =1则初始化失败
Delay_us(100);
DQ = 1;
return(presence); //返回信号,0=presence,1= no presence
}
8、ADC实验。(18分)
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x00; //不设置P1口为模拟口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上电并延时
}
/*----------------------------
发送ADC结果到PC
----------------------------*/
void ShowResult()
{
SendData(GetADCResult()); //显示ADC高8位结果
// SendData(ADC_LOW2); //显示低2位结果
}
/*----------------------------
读取ADC结果
----------------------------*/
BYTE GetADCResult()
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 0 | ADC_START; _nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成