生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。分析实验参考程序,观察实验现象,记录实验结果。 参考程序