⑴ ①查询程序 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
实验内容 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
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页));该寄存器
的数值越大,输出时钟频率越
(低);

