1.实验六(流水灯)(1)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */ void delay(void){int i,j;for(i=0;i<=1000;i++)for(j=0;j<=1000;j++);}void main(void) {DDRA=0xff;//定义A口输出PORTA=0x00;//灯全灭for(;;) {delay();PORTA=0x55;//高电平灯亮delay();PORTA=~PORTA;}}(2)高位到低位逐个点亮#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void delay(){unsigned int i,j;for(i=0;i<=100;i++)for(j=0;j<=100;j++);}void main(void){DDRA=0xFF;PORTA=0x80;for(;;){delay();PORTA>>=1;//右移一位if(PORTA==0x00)//反复循环PORTA=0x80;}}低位到高位逐个点亮#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void delay(){unsigned int i,j;for(i=0;i<=100;i++)for(j=0;j<=100;j++);}void main(void){DDRA=0xFF;PORTA=0x01;for(;;){delay();PORTA<<=1;//左移一位if(PORTA==0x00)//反复循环PORTA=0x01;}}(3)与按键结合#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void main(void) {DDRA=0xff;DDRH=0x00;for(;;) {PORTA=PTH^0x0f;//按下时灯灭,取反后按键灯亮}}2.实验七(定时器延迟流水灯)(1)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void liangdeng(void){PORTA=~PORTA;while(TCNT!=0x0000);//计数到0停止}void main(void) {EnableInterrupts;TSCR1=0x80;//定时器使能TSCR2=0x07;//128分频,计数频率=时钟频率/分频DDRA=0xff;//A口输出PORTA=0x55;for(;;){liangdeng();}}(2)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void liangdeng(void){while(TCNT!=0x0000);PORTA<<=1;if(PORTA==0x00)PORTA=0x01;}void main(void) {EnableInterrupts;TSCR1=0x80;//定时器使能TSCR2=0x05;//128分频DDRA=0xff;//A口输出PORTA=0x01;for(;;){liangdeng();}}3.实验八(数码管显示连续4位)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */ Const unsigned char DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7b,0x71}; const unsigned char WeiMa[]={0xf7,0xfb,0xfd,0xfe};void delay(void){int i,j;for(i=0;i<=100;i++)for(j=0;j<=100;j++);}void display(unsigned char wei,int data){PTP=WeiMa[wei-1];PTT=DuanMa[data];delay();}void dis(int time,int a,int b,int c,int d){int i;for(i=1;i<=time;i++){display(1,a);display(2,b);display(3,c);display(4,d);}}void main(void){EnableInterrupts;DDRP=0xff;DDRT=0xff;for(;;){dis(20,6,7,8,9);dis(20,1,2,3,4);}}4.实验九(定时器延迟数码管)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */const unsigned char DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7b,0x 71};const unsigned char WeiMa[]={0xf7,0xfb,0xfd,0xfe};void SET_PLL(void) //总线时钟频率为4MHz{CLKSEL=0x00;PLLCTL=0xe1;SYNR=3;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)=8MHz//实验板上OSCCLK=4MHzREFDV=3;PLLCTL=0x60;asm NOP;asm NOP;asm NOP;while((CRGFLG&0x08)==0);//等待时钟校正同步CLKSEL=0x80;//选定PLL时钟,Bus Clock=PLLCLK/2=4MHz}void display(unsigned char wei,int data){PTP=WeiMa[wei-1];PTT=DuanMa[data];while(TCNT!=0x0000);}void dis(int time,int a,int b,int c,int d){int i;for(i=1;i<=time;i++){display(1,a);display(2,b);display(3,c);display(4,d);}}void main(void){SET_PLL();EnableInterrupts;TSCR1=0x80;TSCR2=0x01;DDRP=0xff;DDRT=0xff;for(;;){dis(20,6,7,8,9);dis(20,1,2,3,4);}}5.实验十(AD连续采样求平均值送数码管显示)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */const unsigned char duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff,0x88,0x83,0xc6,0XA1,0x86,0x8e,};//A~F段码,dp不同对应的高低电位不同const unsigned char weima[]={0xfe,0xfd,0xfb,0xf7};//PORTP口对应的位码,低电平有效unsigned int i,result,d;int ADdata[8];//8次转换结果void SET_PLL(void) //总线时钟频率为4MHz{CLKSEL=0x00;PLLCTL=0xe1;SYNR=3;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)=8MHz//实验板上OSCCLK=4MHzREFDV=3;PLLCTL=0x60;asm NOP;asm NOP;asm NOP;while((CRGFLG&0x08)==0);//等待时钟校正同步CLKSEL=0x80;//选定PLL时钟,Bus Clock=PLLCLK/2=4MHz}void delay()//延迟设置{int i,j;for (i=0;i<100;i++)for (j=0;j<100;j++);}void AD_init(void)//AD初始化{A TD0CTL2=0x80;//使能AD,正常清除标志A TD0CTL3=0x08;//单次转换,非FIFO,完成转换后继续A TD0CTL4=0x25;//10精度,4AD转换周期总线时钟频率的十二分之一A TD0CTL5=0xa7;//10精度,右对齐,无符号数据位,模拟量输入通道7A TD0DIEN=0x00;//输入允许}void dis(unsigned int wei,unsigned int data){PTP=weima[wei-1];//PORTP口对应位码PTT=duanma[data];//PORTT口对应段码delay();//送一个数码管的段码位码,延迟后送另一位数码管}void display(int a,int b,int c,int d) {for(;;){dis(1,a);//动态显示,四个数码管几乎同时点亮dis(2,b);dis(3,c);dis(4,d);}}void AD(void){for(i=0;i<8;i++){while(!A TD0STA T0_SCF);//每次采样一个通道,循环采样8次{d=A TD0DR0;A TD0STA T0_SCF=1;//清标志位ADdata[i]=d;}}}void lvbo(void) {int i,j,temp;d=0;for(i=0;i<7;i++)for(j=0;j<i;j++){if(ADdata[j]>ADdata[j+1]){temp=ADdata[j];ADdata[j]=ADdata[j+1];//冒泡排序法,从小到大排序ADdata[j+1]=temp;}}for(i=2;i<=5;i++){d+=ADdata[i];//排序后滤波,取中间几位并求平均值}result=d>>2;}void main(void){SET_PLL(); //锁相环AD_init();//AD初始化EnableInterrupts;DDRP=0xff;//P口T口均为输出DDRT=0xff;for(;;){AD();//8次转换结果存数组lvbo();//排序求平均display(result/1000,(result/100)%10,(result/10)%10,result%10);//数码管十进制显示}}6.综合(AD与秒表计时切换)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */unsigned char duanma[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E Funsigned char weima[4]={0xfe,0xfd,0xfb,0xf7};unsigned int clock1,seconds,result,time,key,b;unsigned int d1,d2,d3,d4;unsigned int T1,T2,T3,T4;int ADdata[8];//8次转换结果void display(unsigned int time,unsigned int a1,unsigned int a2,unsigned int a3,unsigned int a4); void dis(unsigned int wei,unsigned int shuju);void SET_PLL(void);void AD(void);void lvbo(void);void button(void);void Delay(unsigned int i){while(i--);}void main(void){/* put your own code here */SET_PLL();RTICTL = 0x7e;//4M/15*2^16 = 4HzCRGINT = 0x80;clock1=0;key=0;EnableInterrupts;A TD0CTL2=0xc0;//使能AD,快速清除标志A TD0CTL3=0x08;//1次转换,非FIFO,完成转换后暂停A TD0CTL4=0x45;//10精度,8AD转换周期总线时钟频率的十二分之一A TD0CTL5=0xa7;//10精度,右对齐,无符号数据位,模拟量输入通道7 A TD0DIEN=0x00;//输入允许*/DDRT=0XFF;DDRP=0XFF;DDRH=0x00; //设置数码管输出IO均为输出for(;;){AD();//8次转换结果存数组lvbo();//排序求平均if(key%2==0)display(2,T1,T2,T3,T4);elsedisplay(2,d1,d2,d3,d4);//button();//display(2,T1,T2,T3,T4);//AD转换数码管十进制显示//display(2,d1,d2,d3,d4);//数码管十六进制显示}for(;;){}}void AD(void){int i;for(i=0;i<8;i++){while(!A TD0STA T0_SCF);{ADdata[i]=A TD0DR0;}}}void lvbo(void) {int i,j,temp;int sum=0;for(i=0;i<7;i++)for(j=0;j<i;j++){if(ADdata[j]>ADdata[j+1]){temp=ADdata[j];ADdata[j]=ADdata[j+1];//冒泡排序法,从小到大排序ADdata[j+1]=temp;}}for(i=2;i<=5;i++){sum+=ADdata[i];//排序后滤波,取中间几位并求平均值}result=sum>>2;T1=result/1000,T2=(result/100)%10,T3=(result/10)%10,T4=result%10;}void display(unsigned int time,unsigned int a1,unsigned int a2,unsigned int a3,unsigned int a4) {int i;for(i=1;i<=time*250;i++){dis(1,a1);dis(2,a2);dis(3,a3);dis(4,a4);}}void dis(unsigned int wei,unsigned int shuju){PTT=duanma[shuju];PTP=weima[wei-1];Delay(100);}void SET_PLL(void) //总线时钟频率为4MHz{CLKSEL=0x00;PLLCTL=0xe1;SYNR=3;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)=8MHz//实验板上OSCCLK=4MHzREFDV=3;PLLCTL=0x60;asm NOP;asm NOP;asm NOP;while((CRGFLG&0x08)==0);//等待时钟校正同步/*注意:有一个实验板,在设置锁相环时锁相环频率稳定不下来,这个while循环一直等待,退不出来。