实验一 I/O口使用练习
1.复位
/*---------------------------------------------------------*/ /************************************************************ 实验内容:MCU复位 2011-11-06
实验现象:运行后,PB口指示灯连续闪烁五次后灭,按复位键后,再闪烁五次。 ************************************************************/ /*---------------------------------------------------------*/ #include
/*************************************************************/ /* 延时函数 */ /*************************************************************/ void delay(void) {
unsigned int i,j; for(i=0;i<5;i++) for(j=0;j<50000;j++); }
/*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) { DisableInterrupts;
DDRB =0xff; //PB口输出
PORTB =0x0f; //你可以改变PB口数据,显示不同形式的闪烁,如,0x0F,0xAA,0x55等
EnableInterrupts;
for(k=0;k<5;k++) //5次闪烁 { delay(); PORTB=~PORTB; delay(); PORTB=~PORTB;
}
for(;;); //死循环。
//将来应用时,以上可作为你设备的自检程序, }
2.流水灯
/*---------------------------------------------------------*/ /************************************************************ 实验内容:并口输出,移位使用 2011-11-06
实验说明:最小系统板上有8个发光二级管,每个二极管串联了一个限流电阻,用单片机的PB口控制二极管的亮灭状态,PB口的管脚置1时,二极管熄灭,置0时,二极管点亮。
实验现象:板上的D1、D2、D3、D4、D5、D6、D7、D8中有一个点亮,并且循环移动。 ************************************************************/ /*---------------------------------------------------------*/ #include
#include %unsigned char data=0x01;
/*************************************************************/ /* 延时函数 */ /*************************************************************/ void delay(void) {
unsigned int i,j; for(j=0;j<2;j++) for(i=0;i<60000;i++) ; }
/*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) {
DisableInterrupts;
DDRB=0xff; //设置为输出
PORTB=~data; //点亮LED1。如果不取反,有什么现象? for(;;) {
delay();
data=data<<1; //左移一位,补零 if(data==0) data=0x01;
EnableInterrupts;
PORTB=data; } }
实验二 中断实用练习
1. IRQ中断控制流水灯
/************************************************************ 实验内容:IRQ中断控制流水灯 2011-11-06
实验说明:用单片机的PB口控制二极管的亮灭状态,管脚置1灭,置0亮。 实验接线:IRQ-A或者IRQ-B连接目标板上的\区域的IRQ引脚上。 实验现象:如果连接的是IRQ-A,则按键松开灯移动一位;
如果连接的是IRQ-B,则按键按下灯移动一位。(用下降沿触发中断) 如果使用用XIRQ,将汇编那句注释去掉,中断处理号改为5 ************************************************************/ #include
#include %unsigned char data=0x01;
/*************************************************************/ /* 延时函数 */ /*************************************************************/ void delay(void) {
unsigned int i,j; for(j=0;j<10;j++) for(i=0;i<60000;i++) ; }
/******************PE1口中断设置****************************/ void IRQ_Init(void) { //IRQ中断允许寄存器IRQCR IRQCR_IRQE=1; //下降沿触发
//IRQCR_IRQEN=1; //中断使能。复位默认为1,可将此句去掉 }
/*************************************************************/ /* 主函数 */
/*************************************************************/ void main(void) {
DisableInterrupts; //中断禁止
DDRB=0xff; //设置为输出 PORTB=~data; //点亮LED1
asm ANDCC #$eF //XIRQ中断允许,是低电平触发,无寄存器设置 IRQ_Init();
EnableInterrupts; //中断允许 for(;;); //死循环,等中断 }
/***********************中断处理***************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED //中断
void interrupt 6 IRQ_interrupt(void) // IRQ中断号规定为6,见MC9S12XS128.h文件
{ //XIRQ中断号规定为5,见MC9S12XS128.h文件 data=data<<1; //左移一位 if(data==0) data=0x01; PORTB= ~data; delay(); }
#pragma CODE_SEG DEFAULT
2.流水灯及IRQ中断+数码管显示
/************************************************************ 实验内容:流水灯及IRQ中断+数码管显示 2011-11-06
实验说明:用单片机的PB口控制二极管的亮灭,置1灭,置0亮。 实验接线:1.IRQ-A或IRQ-B连接IRQ上,用于中断。
2.四位数码管的段选连接到PORTP,片选连接到PORTT,上下对应接上,
原理见书259页,
数码管的引脚: 12 11 10 9 8 板上的I/O引脚:T3 P0
7 6 5 4 3 2 1
P5 T2 T1 P1 T0 P6 P2 P7 P3 P4
实验现象:上电LED全灭,数码管显示\
当按下IRQ键时,数码管显示\,同时LED灯循环点亮;再按,则上述
现象交替出现。
************************************************************/
/*---------------------------------------------------------*/ #include
#include %unsigned char flag; unsigned char data=0x01;
//***********************常量定义*********************
const unsigned char DisplayDecode[]={~0x3f,~0x37,~0x71,0xff}; // 0 , n , F , 灭 const unsigned char WeiMa[]={0xf7,0xfb,0xfd,0xfe}; void LED_yiwei(void);
//************函数声明************************ void display(unsigned char wei,int data); void delay_ms(int m);
void dis(int time ,int a, int b, int c,int d) ; /**************************************************/ /*-----------------ms 级延时---------------------*/ /*************************************************/ void delay_ms(int m) {int i,j;
for(j=0;j /******************PE1的IRQ中断设置****************************/ void IRQ_Init(void) { IRQCR_IRQE=1; //下降沿触发 IRQCR_IRQEN=1; //IRQ中断允许 } /*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) { flag=0; data=0x01; DisableInterrupts;