微机原理A4纸资料(汇编及之后)

更新时间:2023-04-25 20:38:01 阅读量: 自然科学 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

CPU 寄存器

累加器 (A)

索引寄存器(H:X)

堆栈指针(SP)

16位地址指针寄存器指向下一个有效的堆栈位置。堆栈可以放置在

包含RAM的 64 Kbyte地址空间的任意位置,其大小可以为任何RAM

中的有效值。堆栈用来自动保存子程序调用的返回地址、中断中CPU

寄存器和局部变量的返回地址。AIS(立即加堆栈指针,堆栈处理指令)

指令对SP加上一个8位有符号立即数。这经常用于对堆栈中的局部

变量分配和取消分配空间。

向上生长型(如51单片机)

特性:先加后压,先弹后减

向下生长型(飞思卡尔单片机)

特性:先压后减,先加后弹

程序计数器(PC)

条件代码寄存器(CCR)

寻址模式

寻址模式定义为CPU访问操作数和数据的方法。

对于BRCLR,BRSET, CBEQ和DBNZ,在指令设置表格中列出的寻址模

式是用于访问测试操作数的寻址模式,访问分支目的则需要使用相关

寻址模式。

S08的指令的寻址方式可以分为以下几类:

1.隐含寻址(Inherent)

2.立即寻址 (Immediate)

3.直接寻址 (Direct)

4.扩展寻址 (Extended)

5.变址寻址 (Indexed)

?无偏移量,8位,16位偏移量

6.相对寻址(Relative)

7.存储器到存储器寻址方式(Memory to Memory)

存储器到存储器的寻址方式

1.立即数到直接寻址

2.直接寻址到直接寻址

3.自动变址寻址到直接寻址

4.直接寻址自动变址寻址

__________________________________________________________

中断系统

微机的输入输出方式

一.无条件传送方式

二.查询传送方式(条件传送方式)

查询式传送的优点:通用性强,硬件结构简单。

缺点:查询时占用CPU,效率低。

三.中断传送方式

串行通信与并行通信

并行通信:数据的各位(bit)同时进行传送。

优点:传送速度快

缺点:需用传送线多,不适于远距离传送,

串行通信:数据的各位逐个按顺序传送。

优点:需用传送线少,适于远距离传送。

缺点:传送速度较低。

串行通信的传输制式

单工:数据只能单方向传送(发送或接收)。

半双工:数据可以双向传送,但只有一个通信回路,故不能同时发送

和接收。

全双工:数据可以同时双向传送,具有两个独立的通信回路。

异步通信与同步通信

异步通信:通信双方无统一的时钟脉冲控制。数据以“帧”(frame)

为单位传送。

帧格式:起始位、数据位、奇偶校验位、停止位。

同步通信:传送双方有统一时钟脉冲协调同步。数据以帧为单位传送。

帧格式:同步字符、(1-2个,1个一般用ASCII码SYNC-16H,

2个一般用国际通用码EB90H)数据字符、(个数不限,一般用ASCII

码)、校验字符(1-2个)

波特率:每秒钟传送的二进制代码的位数,单位为b/S,即

bps

串行通信协议(异步通信)

⑴.起始位:信号线上无数据传送时为1开始传送时发一个0信号,

即起始位。

⑵.数据位:紧接起始位之后,个数一般为7-8位。

⑶.奇偶校验位:紧接数据位之后。一般为1位。

奇校验:数据位与奇偶位中1的总个数为奇数。

偶校验:数据位与奇偶位中1的总个数为偶数。

⑷.停止位:一帧数据的结束标志,一般为“1”。

___________________________________________________________

串行外围接口SPI原理及应用

QG8的SPI特点

1、主从模式可选

2、全双工或单线模式可选

3、可编程波特率

4、收发双缓冲

5、时钟相位与极性可选

6、从机片选输出

7、高或低位在前传送模式可选。

____________________________________________________________

寄存器

键盘中断寄存器(KBI)

八位定时模块(MTIM)

该计数器为只读,写入任何数值对其没有影响,复位时为0x00。

⑷ MTIM模寄存器——MTIMMOD

该8位可读写的寄存器保存的数值是计数器计数的最大值,当计数器

计数到该最大值时会翻转到0,同时设置TOF标志。如果给该寄存器写

入数值0x00,会导致计数器成为一个没有约束的自由运行的计数器,

给MTIMMOD写入数值回导致计数器回0x00,而且溢出标志TOF也会清

零。MTIMMOD复位时为0x00。

十六位定时模块(TPM)

TPM计时寄存器高位TPMCNTH:

TPM计时寄存器低位TPMCNTL:

⑶定时器模寄存器——TPMMODH:TPMMODL

TPM模寄存器高位TPMMODH:

TPM模寄存器低位TPMMODL:

该可读/写寄存器定义了计数器的最大数值。

读取该寄存器将返回从接收数据缓冲器中读取的数据。写该寄存器将

会把数据写入发送数据缓冲器。

当 SPI 被配置为主模式时,写入数据到传输数据缓冲器发起一次 SPI

传输,即启动SPI。

一、I/O口输入输出实验

实验内容

⑴结合开发板电路图,用跳线

夹连接对应LED引脚。即LED1、

LED2分别与PTB6、PTB7相连接。

将PTB口定义为输出接口。对端

口写0即可点亮LED灯。单步运

行观察实验现象。

⑵结合开发板电路图,用跳线

夹再将开发板上的按键SW1、SW2

连到PTA2。将PTA口定义为输入

口,将PTB口定义为输出口。按

下SW1时点亮LED1、LED2。按下

SW2时熄灭LED1、LED2。

参考程序

⑴直接点亮LED灯,其参考程序

如下。

C语言程序:

#include

#include "derivative.h"

/* 头文件 */

void main(void) {

PTBDD=0xff; /*

定义PTB口为输出口 */

PTBD=0xff; /*

输出高电平,LED灯灭*/

PTBD=0x00; /*PTB口输

出低电平,即PTB6、PTB7输出低

电平 */

for(;;)

{ __RESET_WATCHDOG(); /* 清看

门狗 */

}

/* 死循环 */

}

⑵按键控制LED灯

参考C语言程序如下:

#include

#include "derivative.h"

/* 头文件*/

void main(void) {

PTADD=0x00;

/* 初始化PTA口,定义为输入口

*/

PTBDD_PTBDD6=1;

PTBDD_PTBDD7=1;

/* PTB6,PTB7定义为输出口*/

PTBD_PTBD6=1;

PTBD_PTBD7=1;

/* PTB6,PTB7均写为1,开始时

灯熄灭 */

for(;;) {

if(PTAD_PTAD2==0)

{

PTBD_PTBD6=0;

PTBD_PTBD7=0;

}

else

if(PTAD_PTAD3==0)

{

PTBD_PTBD6=1;

}

else

__RESET_WATCHDOG(); /* 清看门

狗 */

}

}

二、键盘中断实验

实验内容

使能KBIP2、KBIP3,进而对LED1、

LED2进行控制。实现当按下SW1

时,LED1亮、LED2灭,当按下SW2

时,LED1灭、LED2亮。在中断函

数入口处设置断点,单步运行观

察实验现象。

参考程序

#include /* for

EnableInterrupts macro */

#include "derivative.h" /*

include peripheral

declarations */

void main(void) {

DisableInterrupts;

/*关中断总允许 */

PTADD_PTADD2=0;

PTADD_PTADD3=0;

/*PTA2、PTA3定义为输入口*/

PTBDD_PTBDD6=1;

PTBDD_PTBDD7=1;

/*PTB6、PTB7定义为输出口*/

PTBD_PTBD6=1;

PTBD_PTBD7=1;

/*LED灯均熄灭*/

KBISC_KBIE=0;

KBIES=0x00;

/*下降沿/低电平触发*/

KBIPE=0x0C;

/*键盘中断开启即KBIP2、KBIP3

键盘中断开启*/

KBISC_KBACK=1;

/*清除任何错误中断*/

KBISC_KBIE=1;

/*键盘中断允许*/

EnableInterrupts;

/* 开中断总允许*/

for(;;) {

__RESET_WATCHDOG();

}

}

void interrupt 18 Keyboard( )

{

KBISC_KBACK=1;

KBISC_KBIE=0;

/*禁止键盘中断*/

if(PTAD_PTAD2==0){

PTBD_PTBD7=1;

}

else if(PTAD_PTAD3==0) {

PTBD_PTBD6=1;

PTBD_PTBD7=0;

}

else __RESET_WATCHDOG();

KBISC_KBIE=1;

/*开启键盘中断*/

}

三、定时器实验

实验内容

⑴按照查询法,利用8位定时模

块——MTIM进行定时,使得LED

灯实现亮3秒、灭3秒、亮3秒、

灭3秒……无限循环的现象。

⑵采用中断法,利用16位TPM模

块编程,实现LED灯出现亮2秒、

灭2秒、亮2秒、灭2秒……无

限循环的现象。

⑶利用TPM的PWM模块,在通道0

处产生边沿排列方式的方波,周

期为1ms,占空比为25%。用示波

器观察并记录波形。

⑷利用TPM的PWM模块,在通道1

处产生中心排列方式的方波,周

期为1ms,占空比为25%。用示波

器观察并记录波形。

参考程序

⑴查询法8位定时模块(MTIM)

定时的参考程序。本程序采用内

部总线时钟(4MHZ),并64分频,

定时器溢出值为0xFA,外部采用

最大值为750的一个递减循环。

750*64*250/4M=3秒。

#include

#include "derivative.h"

int a;

/*定义循环参数*/

void main(void)

{

DisableInterrupts;

/*禁止中断*/

PTBDD=0xff;

PTBD=0xff;

/*初始化B口*/

a=750;

MTIMCLK=0x06;

/*采用内部总线时钟,且64分频

*/

MTIMMOD=0x0FA;

MTIMSC=0x20;

/*启动定时器 */

while(1)

{

__RESET_WATCHDOG();

{

MTIMSC_TOF=0;

a-=1;

if(a==0)

{

a=750;

PTBD=~PTBD;

}

}

}

}

⑵中断法16位定时模块(TPM)

的参考程序。本程序采用内部总

线时钟,并128分频,定时器溢

出值为0xF424(十进制为

62500),62500*128/4M=2秒。

#include

#include "derivative.h"

void main(void) {

EnableInterrupts;

PTBDD=0xff;

PTBD=0xff;

TPMMODL=0x24;

TPMMODH=0x0f4; /*

定时2秒*/

TPMSC=0x4f; /*

开中断,采用内部总线时钟,并

128分频 */

for(;;) {

__RESET_WATCHDOG();

}

}

void interrupt 7 TPM(){

PTBD=~PTBD;

/*B口送低电平,点亮LED1和

LED2*/

TPMSC_TOF=0;

/*清中断标志 */

}

⑶利用TPM模块边沿排列方式产

生1ms方波,占空比为25%。采用

内部总线时钟,分频数为1,模寄

存器值为0x0FA0(十进制为4000),

通道0 的通道值寄存器值为

0x03E8(十进制为1000)。

#include

#include "derivative.h"

int a;

void main(void) {

EnableInterrupts;

TPMSC=0x08; /*

工作在边沿对齐PWM模式,选择

总线时钟工作,预分频因子为1*/

TPMMODH=0x0F;

TPMMODL=0x0A0; /*

向模寄存器写初值*/

TPMC0SC=0x28; /*

高为真脉冲*/

TPMC0VH=0x03; /*

向通道1定时寄存器写初值*/

TPMC0VL=0x0E8;

TPMC0SC_CH0IE=1; /*

允许通道1中断*/

for(;;)

{ __RESET_WATCHDOG(); }

}

void interrupt 5 TPM0() {

a=TPMC0SC;

TPMC0SC_CH0F=0; /*

清除中断标志位*/

TPMC0VH=0x03; /*

向通道寄存器重新装初值*/

TPMC0VL=0x0E8;

}

⑷利用TPM模块中心排列方式产

生1ms方波,占空比为25%。采用

内部总线时钟,分频数为1,模寄

存器值为0x07D0(十进制为2000),

通道0 的通道值寄存器值为

0x01F4(十进制为500)。

#include

#include "derivative.h"

int a;

void main(void) {

EnableInterrupts;

TPMSC=0x28; /*

工作在以中心排列PWM模式,选

择总线时钟工作,预分频因子为

1*/

TPMMODH=0x07;

TPMMODL=0x0D0; /*

向模寄存器写初值*/

TPMC1VH=0x01;

TPMC1VL=0x0F4; /*

向通道1定时寄存器写初值*/

TPMC1SC=0x48; /*

高为真脉冲,允许通道1中断*/

for(;;) {

__RESET_WATCHDOG();

}

}

void interrupt 6 TPMC1() {

a=TPMC1SC_CH1F;

TPMC1SC_CH1F=0; /*清

除中断标志位*/

TPMC1VH=0x01;

TPMC1VL=0x0F4; /*重

装通道寄存器初值*/

}

四、模数转换(ADC)实验

实验内容

⑴利用ADC转换,采用通道0,在

仿真输入条件下对模数转换进行

观察。即:选择下载方式为Full

Chip Simulation,然后在运行菜

单里选择HCS08FCS/ADC

Module/Queue ADC Input

Data(ADDI)。输入一个介于$0—

—$FF中的数值,运行程序,在

memory窗口的$0100-0101处观察

a中所得到的数值是否与输入值

一致。

⑵利用中断,选择VREFH通道,

进行模数转换,设置转换结果为

10位,连续转换5次,观察结果

是否为$03FF。在中断服务函数处

设置断点,观察进入中断的状况。

⑶利用硬件中断脉冲来触发AD转

换,选择VREFL通道,转换5次,

结果取8位精度,转换结束后点

亮LED1和LED2。

⑷①选择VREFH通道,启动内部

比较器,转换结果取8位精度,

选择大于或等于触发比较模式,

比较值低位寄存器取为$90,记录

实验结果。

②在①的基础上修改程序,将

ADCSC1=0x1d换为ADCSC1=0x1e,

选择VREFL通道,记录实验结果。

③在②的基础上修改程序,将比

较器的触发方式选为小于触发,

记录实验结果。

④在③的基础上修改程序,选择

VREFH通道,记录实验结果。

参考程序

⑴仿真输入ADC模数转换参考程

序:

#include

#include "derivative.h"

int a;

void main(void) {

DisableInterrupts;

APCTL1=0x01; /* AD0管脚,

屏蔽I/O控制,只作为A/D输入

通道使用*/

ADCCFG=0x90; /* 配置为

低功耗、1分频、长采样、8位模

式、总线时钟 */

ADCSC1=0x00; /*启动一

次AD转换*/

while(ADCSC1_COCO!=1)

{__RESET_WATCHDOG();} /*查

询转换是否结束*/

a=ADCRL; /*读取转

换结果并转移*/

for(;;){__RESET_WATCHDOG();

}

} ⑵中断法转换5次内部高电平: #include #include "derivative.h" int a[5]; int r,i; void main(void) { DisableInterrupts; ADCCFG=0x98; /*初始化,采用10位精度转换结果*/ for(r=0;r<5;r++) { /*转换5次*/ ADCSC2=0; ADCSC1=0x5d ; /*启动一次转换,转换结果应为$03FF*/ EnableInterrupts; for(i=0;i<100;i++){ __RESET _WATCHDOG();}/*等待转换结束触发中断*/ } for(;;) { __RESET_WATCHDOG(); } } void interrupt 19 ADC(){ /*中断服务子程序,将结果保存*/ a[r]=ADCR; /*读取转换结果并转移*/ } ⑶硬件中断脉冲触发AD 转换: #include #include "derivative.h" int a[5]; int r; void main(void) { DisableInterrupts; PTBDD=0xFF; ADCCFG=0x90; /* 配置为低功耗,1分频、长采样、8位模式、总线时钟 */ for(r=0;r<5;r++) { /*循环5次*/ SRTISC=0x14; /*设置RTI ,使能实时中断。*/ ADCSC2=0x40; /*选择硬件触发转换*/ ADCSC1=0x1E ; /*选择VREFL 通道 转换内部低电平 */ while(ADCSC1_COCO!=1){__RESE T_WATCHDOG();} /*等待转换结束*/ a[r]=ADCRL; /*一个转换结束后,读取数据入内存*/ } PTBD_PTBD6=0; PTBD_PTBD7=0; for(;;) { __RESET_WATCHDOG(); } /* 无限循环,禁止看门狗复位*/ } ⑷ I .转换高电平,大于或等于触发比较器模式: #include #include "derivative.h" int a[10]; int r ; void main(void) { DisableInterrupts; ADCCFG=0x90; /* 配置为低功耗、1分频、长采样、8位模式、总线时钟 */ for(r=0;r<10;r++) { /*循环10次*/ ADCSC2=0x30; /*软件触发转换,启动比较、置大于或等于触发*/ ADCCVL=0x90; /*低位比较值寄存器。*/ ADCSC1=0x1d; /*接通内部高电平,若为0x1e 则表示连接内部低电平*/ while(ADCSC1_COCO!=1) {__RESET_WATCHDOG();} /*判断转换是否结束*/ a[r]=ADCRL; /*读取转换结果并转移*/ } for(;;) {__RESET_WATCHDOG(); } } II .转换低电平,小于触发比较器模式: #include #include "derivative.h" int a[10]; int r ; void main(void) { DisableInterrupts; ADCCFG=0x90; /* 配置为低功耗、1分频、长采样、8位模式、总线时钟 */ for(r=0;r<10;r++) { /*循环10次*/ ADCSC2=0x20; /*软件触发转换,启动比较器、置小于触发*/ ADCCVL=0x90; /*低位比较值寄存器。*/ ADCSC1=0x1e; /*连接内部低电平 */ while(ADCSC1_COCO!=1) {__RESET_WATCHDOG();} /*判断转换是否结束*/ a[r]=ADCRL; /*读取转换结果并转移*/ } for(;;) {__RESET_WATCHDOG(); } } 五、异步串行通信SCI 实验内容 ⑴ 将相应管脚用导线连接起来,即:在保证两个通信单片机共地的情况下,发送单片机的TXD 与接收单片机的RXD 连接起来。在相应参考程序中,发送程序和接收程序按照查询和中断两种方式各给出了两个参考程序,发送和接收可两两组合共有四种情况,两人一组,选取两种进行实验,记录实验结果,画出程序流程图。 ⑵ 按照TXD —RXD 的对应关系将两个单片机的串口引脚连接起来(同时还要保证共地)。利用中断方式,实现接收、发送依次进行,单片机1发送数据0x37(若发送成功则点亮LED1),单片机2进行接收,当接收到0x37时(接收成功则点亮LED2),再往单片机1发送一个数据0x38(发送成功则点亮LED1),若单片机1接收成功则点亮LED2。 参考程序 ⑴ ①发送参考程序 I 查询方式发送: #include #include "derivative.h" /*只发送一次不采用中断*/ int a; void main(void) { DisableInterrupts; PTBDD=0xFF; PTBD=0xFF; SCIBDH=0; SCIBDL=0x1A; SCIC1=0x00; SCID=0x37; /*发送数据为0x37*/ SCIC2=0x08;/*不采用中断,打开发送器*/ while(SCIS1_TDRE!=1){ __RESE T_WATCHDOG(); } PTBD_PTBD6=0; /*发送成功则点亮LED1*/ for(;;) { __RESET_WATCHDOG(); } } II 中断方式发送: #include #include "derivative.h" /*中断发送*/ int a; void main(void) { EnableInterrupts; PTBDD=0xFF; PTBD=0xFF; SCIBDH=0x00; SCIBDL=0x1A; SCIC1=0x00; /*普通发送模式*/ SCID=0x37; SCIC2=0x88; /*采用中断,打开发送器*/ for(;;) { __RESET_WATCHDOG(); } } void interrupt 16 SCI1 () { PTBD_PTBD6=0; /*点亮LED1,表示发送成功 */ SCIC2_TIE=0; /*禁止发送中断 */ } ② 接收参考程序 I 查询方式接收: #include #include "derivative.h" /*查询接收一次*/ int b; void main(void) { DisableInterrupts; PTBDD=0xFF; PTBD=0xFF; SCIBDH=0x00; SCIBDL=0x1A; SCIC1=0x00; SCIC2=0x04; /*只打开接收器,不采用中断方式*/ while(b!=0x37){ while(SCIS1_RDRF!=1){ __RES ET_WATCHDOG(); } b=SCID; } PTBD_PTBD6=0; /*若接收成功则点亮LED1*/ for(;;) { __RESET_WATCHDOG(); } } II 中断方式接收: #include #include "derivative.h" /*中断接收一次 */ int c,d; void main(void) { EnableInterrupts; PTBDD=0xFF; PTBD=0xFF; SCIBDH=0x00; SCIBDL=0x1A; SCIC1=0x00; SCIC2=0x24; /*打开接收器,允许接收中断 */ for(;;) { __RESET_WATCHDOG(); } } void interrupt 15 sci0(){ SCIC2_RIE=0; d=SCIS1; /*清楚中断标志位RDRF*/ c=SCID; if(c==0x37){ PTBD_PTBD6=0; /*若接收成功则点亮LED1*/ DisableInterrupts; } else { SCIC2_RIE=1; } } II 中断发送与中断接收相结合 I 单片机1参考程序(先发送后接收): #include #include "derivative.h" /*中断发送,再中断接收*/ int a,b; void main(void) { EnableInterrupts; PTBDD=0xFF; PTBD=0xFF; SCIBDH=0x00; SCIBDL=0x1A; SCIC1=0x00; /*普通发送模式*/ SCID=0x37; SCIC2=0x88; /*采用中断,打开发送器*/

for(;;) {

__RESET_WATCHDOG(); } }

void interrupt 15 SCI0 () { /*接收中断函数 */ SCIC2_RIE=0; /*先禁止接收中断 */

b=SCIS1;

a=SCID; /*清除接收标志位 */

if(a==0x38){

PTBD_PTBD7=0;/*若接收成功点亮LED2*/ }

else SCIC2_RIE=1; /*若未接收到正确结果,继续允许接收中断 */

}

void interrupt 16 SCI1 () { /*发送中断函数 */

PTBD_PTBD6=0; /*点亮LED1,表示发送成功*/

SCIC2_TIE=0; /*禁止发送中断*/

SCIC2=0x24; /*允许接收中断*/ }

II 单片机2参考程序(先接收后发送):

#include

#include "derivative.h" //中断接收一次 再中断发送 int c,d;

void main(void) {

EnableInterrupts; PTBDD=0xFF; PTBD=0xFF; SCIBDH=0x00; SCIBDL=0x1A; SCIC1=0x00; SCIC2=0x24; for(;;) {

__RESET_WATCHDOG(); } }

void interrupt 15 sci0(){/*接收中断服务函数*/

SCIC2_RIE=0; /* 禁止接收中断 */ d=SCIS1;

c=SCID; /*清除中断标志位RDRF*/

if(c==0x37){

PTBD_PTBD7=0; /* 点亮LED2表示接收成功 */ SCID=0x38;

SCIC2=0x88; /* 发送一个新的数据*/ }

else { SCIC2_RIE=1; } } void interrupt 16 sci1(){ /* 发送中断函数 */

SCIC2_TIE=0; /* 禁止发送中断 */

PTBD_PTBD6=0; /*点亮LED1表示发送成功*/ }

六、同步串行通信SPI 实验内容

⑴ 分别用导线将通信的四个管脚对应的连接起来,采用查询方式,主机发送一个数据,从机接收,发送成功则点亮主机的LED2,从机接收成功则点亮LED1。观察实验现象,记录实验结果。 ⑵ 利用中断方式,主机先发送一个数据再接收一个从机发送的数据,从机接收主机发送的一个数据,再发送一个数据至主机。主机发送成功则点亮LED2,接收成功则点亮LED1;从机接收成功则点亮LED1,发送成功则点亮LED2。分析实验参考程序,观察实验现象,记录实验结果。 参考程序

⑴ ①查询程序 I 主机发送程序: #include

#include "derivative.h"

int a=0; void main(void) {

DisableInterrupts; /*禁止所有中断*/ SPIC1=0x56; /*使能SPI 功能,并设本机为主机*/ SPIC2=0x10; SPIBR=0x77; /*设预置分频因子为8,设分频因子为256*/ PTBDD_PTBDD5=1; PTBD_PTBD5=0; /*使SS 为低电平,选通从机*/ /*初始化完毕*/ while(a==0) { if(SPIS_SPTEF){ /*判断是否可以发送*/ SPID=0x57; /*将待发送数据送入发送缓冲器*/ PTBDD_PTBDD7=1; PTBD_PTBD7=0; /*点亮LED2,以显示发送成功*/ a=1; } } PTBD_PTBD5=1; /*使SS 为高电平,通信结束*/ for(;;) { __RESET_WATCHDOG(); } } II 从机接收程序: #include #include "derivative.h" int a,b=0; void main(void) { DisableInterrupts; /*禁止所有中断*/ SPIC1=0x46; /*使能SPI 功能,并设本机为从机*/ SPIC2=0x10; SPIBR=0x77; /*设预置分频因子为8,设分频因子为256*/ while(b==0){ if(SPIS_SPRF==1) { /*判断是否可以接受*/ a=SPID; if(a==0x57){ /*判断接收的数据是否正确*/ PTBDD_PTBDD6=1; PTBD_PTBD6=0; /*点亮LED1,以示接收成功*/ b=1; } } } for(;;) { __RESET_WATCHDOG(); } } ② 中断程序 I 主机先发送再接收程序: #include #include "derivative.h" int a; void main(void) { EnableInterrupts; SPIC1=0x76; /*使能SPI 功能,并设本机为主机*/ SPIC2=0x10; SPIBR=0x77; /*设预置分频因子为8,设分频因子为256*/ PTBDD_PTBDD5=1; PTBD_PTBD5=0; /*使SS 为低电平,选通从机*/ /*初始化完毕*/ for(;;) { __RESET_WATCHDOG(); } } void interrupt 13 spi(){ if(SPIS_SPTEF) { /*判断是否可以发送*/ SPIC1_SPTIE=0; PTBDD_PTBDD7=1; PTBD_PTBD7=0; /*点亮LED2,以示发送成功*/ SPID=0x57; /*将待发送数据送入发送缓冲器*/ SPIC1_SPIE=1; } if(SPIS_SPRF) { a=SPID; if(a==0x56){ SPIC1_SPIE=0; PTBDD_PTBDD6=1; PTBD_PTBD6=0; PTBD_PTBD5=1; } } } II 从机先接收再发送程序: #include #include "derivative.h" int a; void main(void) { EnableInterrupts; SPIC1=0x0C6; /*使能SPI 功能,并设本机为从机*/ SPIC2=0x10; SPIBR=0x77; /*设预置分频因子为8,设分频因子为256*/ for(;;) { __RESET_WATCHDOG(); } } void interrupt 13 spi(){ __RESET_WATCHDOG(); if(SPIS_SPRF&&SPIC1_SPIE) { /*接收数据*/ a=SPID; if(a==0x57){ SPIC1_SPIE=0; PTBDD_PTBDD6=1; PTBD_PTBD6=0; SPIC1_SPTIE=1; /*开发送中断*/ } } else __RESET_WATCHDOG(); if(SPIS_SPTEF&&SPIC1_SPTIE) { /*又发送新数据*/ SPID=0x56; PTBDD_PTBDD7=1; PTBD_PTBD7=0; SPIC1_SPTIE=0; } else __RESET_WATCHDOG(); } 其他例程

实验内容 1> PC 通过串口总线发送’o’(open 的意思)字符到单片机,单片机接收到’o’后,点亮LED2灯,并返回’D’(Done 的意思)字符; 2> PC 通过串口总线发送’c’(close 的意思)字符到单片机,单片机接收到’c’后,熄灭LED2灯,并返回’D’字符; 3> PC 通过串口总线发送’f’(flash 的意思)字符到单片机,单片机接收到’f’后, LED2灯以512ms 的周期进行闪烁,并返回’D’字符; 波特率设置为19200 参考程序 #include #include "derivative.h“ void SCISendc(unsigned char c); Int Cnt; void main(void) { SOPT1=0X03; SCIBD=4000000/16/19200; SCIC1=0x00; SCIC2=0x2C; SCIC3=0x00; PTBDD = 0xFF; SRTISC = 0x16; for(;;) { } /* loop forever */ }

void SCISendc(unsigned char c) { while(!SCIS1_TDRE); SCID=c;

}

interrupt 15 void Rel(){

unsigned char i;

i=SCID;

switch (i) {

case 0x67 :

PTBD_PTBD7=0;Cnt=0;S CISendc(‘D’);break;

case 0x63 :

PTBD_PTBD7=1;Cnt=0;S CISendc(‘D’;)break;

case 0x66 : Cnt = 1; SCISendc(‘D’;)break;

}

}

interrupt 23 void RTI_ISR() {

if(Cnt=1) {

PTBD ^=0xff;}

else{

}

SRTISC = 0x56; //清除标志

}

实验内容

基于MC9S08QG8单片机编写SPI 通信方式的主机程序(C语言),并画流程图。总线频率4MHz,时钟极性设置为平时低电平,时钟相位为前沿输出,后沿采样,8位数据传送时高位在前。波特率12500bps(25000bps),采用查询方式,传送数组SPI_BUFF[6]里的6个数据,不考虑SPI模块的SS 管脚的使用。

分析:分频比=总线时钟/bps=4000000/12500=320

据此,预分频因子5(100),波特率分频因子:64(101)/(32)(100)SPIBR:01000100(0x44)

参考程序

#include

#include "derivative.h"

//包含头文件

char SPI_BUFF[6],j; /*定义两个全局变量*/

void main(void) {

DisableInterrupts;

/*禁止所有中断*/

SPIC1=0X54;

/*使能SPI功能,并设本机为主机*/

SPIBR=0X45(0X44);

/*设预置分频因子为5,设分频因子为64(32)*/

PTBDD_PTBDD5=1;

PTBD_PTBD5=0;

/*使SS为低电平,选通从机*/ for(j=0;j<6;j++) {

while(SPIS_SPTEF==0);

/*判断是否可以发送*/

SPID=SPI_BUFF[j];

/*将待发送数据送入发送缓冲器*/

}

}

实验内容

MC9S08QG8的8个AD模拟输入端分别连接温度采集电路,对八个位置进行温度监控,用C语言编写程序,在数组AD_DATA[8] 中保存8个位置的温度转换数值。(AD 配置为低功耗,1分频、长采样、8位模式、总线时钟,采用RTI 硬件触发,每秒钟转换一次。)

参考程序

提示:先采用硬件触发的方式对0通道进行转换,在0通道的转换完成中断里切换通道,分别对其它通道进行软件触发方式的转换,将所有通道转换结果保存在某个数组中,全部完成后,求出数组的最大值,并存放在某个采用固定地址定义的变量中。

#include

unsigned char AD_DATA[8] ; void main(void){ DisableInterrupts;

SOPT1 = 0x03; //1

SRTISC = 0x47; //1 ADCCFG = 0x90; //1

ADCSC2 = 0x40; //1

ADCSC1 = 0x40; //1

APCTL1 = 0Xff; //1 EnableInterrupts;

while(1);

}

interrupt 19 void AD_ISR() //1

{

unsigned char i;

AD_DATA[0] = ADCRL; //1 ADCSC2 = 0x00; //1 for(i = 1;i<8;i++)

//1

{

ADCSC1 = i;

//1

while(ADCSC1_COCO!=1

) ; //1

AD_DATA[i] = ADCRL;

//1

}

ADCSC2 = 0x40;

//1

ADCSC1 = 0x40;

//1

}

实验内容

请用C语言编程实现如下功能:

飞思卡尔QG8单片机,采用 16

位的TPM模块在通道0产生边沿

对齐的PWM方波,方波频率1KHz,

占空比可由KEY1控制(接PTA2);

KEY1事件采用中断处理方式,初

始运行时PWM方波的占空比为

25%,以后每次按动KEY1键,方

波的占空比增加25%,达到100%

后再按键则恢复到25%占空比。

参考程序

#include

#include “derivative.h”

unsigned char int PWM_HIGH;

void main(void){

DisableInterrupts;

SOPT1=0X03; //看

门狗设置及MAIN函数1分

PTBDD=0XFF; //I/O

端口设置3分

PTADD=0;

PTBD=0XFF;

TPMMOD=4000;

TPMSC=0X08;

TPMC0V=1000;

PWM_HIGH=TPMC0V;

TPMC0SC=0X68;

KBISC=0X04; //键

盘设置3分

KBIES=0;

KBIPE=0X04;

KBISC=0X06;

EnableInterrupt; //使

能中断1分

for(;;){ //死

循环1分

}

}

void interrupt 18 KBI_ISR() {

//键盘中断程

序6分

unsigned int delay;

for(delay=0;delay<1000;delay

++)

{}

if(PWM_HIGH<4000)

{PWM_HIGH+=1000;}

else{PWM_HIGH=1000;}

KBISC=0x06;

}

____________________________

小题

1、单片机组成:1> CPU 2> 存

储器 3>I/O ;

2、存储器包括2大类: ROM , RAM

3、标准ASCII码使用(1)个字

节表示字符;

4、BCD码是用(二)进制表示的

(十)的数据;

5、HCS08QG8的最小系统包括(电

源和时钟,复位电路,程序下载

口);

6、QG8管脚数量(16)、只能输

入的是(PTA5)、只能输出的是

(PTA4)、程序下载的是(PTA4)、

接外部时钟的是(PTB6和PTB7);

7、QG8的管脚可以作为数字输入

输出、也可以作为模拟输入,可

以作为模拟输入的有(A3~A0);

8、QG8管脚复用优先级最低的功

能是(数字I/O);

9、QG8存储器配置中,不同资源

的分界线(P39);

10、CPU寄存器有(A, HX, PC, CCR,

SP);

11、可以执行位操作的地址范围

(0X0000~0X005F);

12、有地址的寄存器分成了(3)

块(0页,高页,非易失);

13、如何在C语言中定义常数(数

据类型变量名;),如何指定变量

的地址(数据类型变量名 @ 地

址;);

14、堆栈的管理者是寄存器(SP);

15、SP的复位缺省值是(0X00FF),

一般应该通过程序将其调整到

(0x025F);

16、堆栈对数据的操作特点是(向

上生长型:先压后减、先弹后加;

先进后出,后进先出);

17、堆栈一般在RAM的高地址区

域还是低地址区域?高地址区

18、内部时钟源包括哪4大部分:

外部时钟,低成本晶体振荡器,可

编程内部时钟参考,锁频环

19、外部时钟分哪2大类;振荡

器,整形外部时钟

20、内部时钟中FLL固定倍频(512

倍频);

21、ICS的7种工作模式(FEI, FEE,

FBI, FBILP, FBE, FBELP, stop);

22、ICS的内部参考时钟是可以

校准、微调的,调整的寄存器名

(ICSTRM,(在0页));该寄存器

的数值越大,输出时钟频率越

(低);

23、FLASH是按页管理的,页大

小(512)字节,每页分(8)行;

24、高页寄存器可以采用扩展和

间接寻址方式进行读写,高页寄

存器位于FLASH的最后一页的(倒

数第二行)位置;

25、 FLASH的最后一页最后一行

是(中断向量);

26、 FLASH块保护寄存器(FPROT);

块加密寄存器(FOPT);对应的非

易失寄存器分别是(NVOPT,

NVPROT);

27、 FLASH操作的一般过程是:

往某个地址写一个数——清除错

误标志——往命令寄存器写命令

——发布命令——看命令是否完

28、 FLASH操作的有效命令有(空

检查,字节编程,突发模式编程,

页擦除,全部ROM擦除);

29、记录程序运行状态的CPU寄

存器是(CCR);

30、指令系统包括6大类指令,

分别是(算术运算指令、数据传

送指令、数据和位操作、逻辑运

算、程序控制、堆栈处理);

31、寻址方式是指(CPU访问操

作数和数据的方法);

32、寻址方式包括7大类16种,

分别是:

INH IMM DTR EXT

IX,IX1,IX2,SP1,SP2,IX+,IX1+

REL IMD, DD,IX+D,DIX+

33、8指令模板和6指令模板分别

是();

8指令:立即数,DIR,EXT,IX,

IX1,IX2,SP1,SP2

6指令:DIV,IX,IX1,SP1,A,

X

34、QG8是高电平复位还是低电平

复位?低电平

35、QG8数据存储器RAM的大小

为(512)字节;

36、上电复位期间将管脚(A4)

设置为(低)电平可以进入调试

模式

37、QG8的存储器结构为冯·诺

伊曼还是哈佛结构?冯诺依曼

38、中断过程中自动入栈的字节

有(PCL,PCH,A,CCR,X);

39、在C语言中如何定义变量为

“易变型”;用volatile

40、使用外部整形后的时钟从管

脚(PTB7)输入;

41、CPU时钟是总线时钟的(2)

倍;

42、如何调整内部时钟到想要的

频率?;

43、最高优先级中断是(复位中

断);

44、想要保护最后的4页FLASH,

则寄存器FPROT应赋值(11110110,

0xF6);

45、ADC转换器设置成硬件触发

时,是采用实时中断RTI计数器

的溢出信号(ADHWT)进行启动转

换的。

46、QG8单片机在中断处理过程中

不会自动入堆栈的CPU寄存器是

H 。

47、除法指令是将H:A除以X,

商放在 A ,余数放在

H 。

48、异步串行数据通信的帧格式

设置为1个起始位、8个数据位、

1个停止位组成。如一分钟传

送了28800个ASCII字符,则SCI

的波特率应设置为

28800*10/60= 4800 bps 。

49、SCI通信过程中,发送完成

的标志位是_TDRE_,表征接收数

据完成的标志位是__RDRF__。

50、TPM除了普通定时器的功能外,

两个独立通道还可以配置为输入

捕捉、输出比较、以及 PWM功

能。

51、通过设置时钟极性和时钟

相位来选择SPI的四种工作模

式。

52、QG8的管脚复用严重,其中

PTA0管脚最高优先级功能是

( ACMP+ )。

53、下面可作为RTI时钟源的是

(B C )。

A、总线时钟

B、内

部参考时钟 (RTI必须用1kHz的

内部时钟)

C、外部时钟

D、CPU

时钟

54、下列汇编指令中,错误的是

( D)

A、MOV $00,$70

B、LDA ,X

C、CBEQ

$0B,X+,LOOP D、

STHX ,X

55、不能导致SPI模块产生中断

事件的有( B )。

A、发送缓冲区空

B、发送完成

C、接收缓冲区满

D、总线冲突

56、QG8单片机的最高级中断入

口地址是 0xFFFE,Flash的起始

地址是 0xE000 。

57、定时器TPM通道0工作于计

数方式时,计数脉冲从TCLK 引脚

输入

58、当 SCI发送完成、RTI、ADC

和KBI四个中断同时申请时,CPU

最先响应的是( A)

A、SCI发送完成

B、KBI

C、RTI

D、ADC

59、系统内部时钟的主输出是

ICSOUT ,缺省的总线时钟是4M

Hz。

60、可以采用X+寻址的指令有

( B )。(CBEQ和MOV)

A、LDA

B、

CBEQ C、ADD D、

CPHX

61、内部寄存器( AB )可作为

间接寻址寄存器。(七种间接寻址

方式)

A、X

B、

PC C、SP

D、A

62、汇编语法格式是标号、操作

码、操作数以及注释。

63、汇编程序设计中,标号本质

是程序地址。

64、分别说明伪指令ORG、EQU、

DS、DC的意义。

P69

65、汇编程序程序设计的一般结

构包括:顺序结构、子程序结构、

分支结构、循环结构。

66、简述中断处理过程。

P78

67、中断过程中自动入栈的寄存

器顺序是:PCL, PCH, X, A, CCR

68、子程序返回指令与中断返回

指令分别是RTS(子),RTI(中),

返回处理的不同?P220

主要是返回处理不同,子程返回

不保存x、CCR等,仅返回PCH

69、MTIM启动控制位是(TSTP)

(设为1则停止计数,保留当前

数值;清除该位时从当前值开始

计数);

70、MTIM的时钟分频因子最大为

(256),而TPM的最大分频为

(128);

71、为了能产生任意占空比的波

形,要求模寄存器数值实际为

0x0001到 0x7FFE

72、SPI缺省模式下,发送字节

时是高位在前还是低位高位。

74、IIC通讯中,有效应答信号

为高电平还是低电平低电平。

75、在IIC通讯中,在时钟(低)

电平是允许数据变动。

76、简述IIC中S信号与P信号

的产生方法。

77、ADC中,信号输入范围从0

到3300毫伏,则10位ad对应的

电压分辨率为(3.23)毫伏。3300

/ 1023

78、简述实现50Hz采样的方法。

(每1/50 s取一次值)

补码%10110110的真值为

-74 。

高页寄存器可以采用扩展、变址、

相对寻址方式进行读写。

QG8寄存器被分成了三组:零页

寄存器、高页寄存器、非易失寄

存器。

乘法指令是将X与A中的数相乘,

结果的高位放在 X ,低位放在 A,

标志位C为 0。

单片机复位后,寄存器SP的缺省

数值为 0xFF ,一般应该通过程

序将其调整到 0x25F 。

QG8单片机的最高级中断入口地

址是 0xfffe 。

设字长为8位,那么十进制数37

用二进制数表示为_%100101,BCD

码表示为 _$37。

异步串行数据通信的帧格式由起

始位、数据位、奇偶校验位

和停止位组成。

系统内部时钟的主输出是

ICSOUT ,缺省的总线时钟是 4

MHz。

定时器TPM通道0工作于计数方

式时,计数脉冲从 PTA0 引

脚输入。

通过设置相位和极性来

选择SPI的四种工作模式。

a/d转换器设置成硬件触发时,是

采用 RTI 溢出信号进行启动转

换的。

本文来源:https://www.bwwdw.com/article/lobq.html

Top