8位数字电位器程序

2020-02-03 10:06发布

#include<reg51.h>
#include<absacc.h>
#define PD XBYTE[0xb003]                        //8255控制口
#define PC XBYTE[0xb002]                        //8255扩展C口
#define PB XBYTE[0xb001]                        //8255扩展B口
#define PA XBYTE[0Xb000]                        //8255扩展A口

#define DAC0832 XBYTE[0xC000]                //DAC0832地址

unsigned char smgd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //数码管段吗
unsigned char smgb[]={0x00,0x01,0x02,0x03,0x04,0x05};                                                 //数码管位码
unsigned char sc,sb,sa;                //数码管个位c,十位b,百位a                                               
unsigned char x=0;


void delay(unsigned int ms){                        //可变延时
        while(ms--);
}
void up(void){                                                  //加一
EA=0;
if (x>254) x=255 ; else x++;
EA=1;
}

void down(void){                                         //减一
EA=0;
if (x<1) x=0 ; else x--;
EA=1;
}

void fangbo(void){
for(;;){
DAC0832=200;
delay(1);
DAC0832=0;
delay(1);
}
}

void juchibo(void){
unsigned char i;
while(1){
   for (i=1;i<255;i++){
   DAC0832=i;
   }
   }
}

void ADC0809start(void){
        XBYTE[0xd000]=0x00;                //通道0启动信号
        x=XBYTE[0xd000];
    XBYTE[0xd000]=0x00;
}
void ADC0809() interrupt 0{

x=XBYTE[0xd000];
XBYTE[0xd000]=0x00;
}

unsigned char keyscan(void){
unsigned char key;
        while(1)       
        {
                if (PB!=0xff){
                                delay(2900);
                                if (PB!=0xff){
                                        key=PB;
                                        switch(key){
                                                case 0xfe : return 0x01 ;break;
                                                case 0xfd :        return 0x02 ;break;       
                                                case 0xfb :        return 0x03 ;break;
                                                case 0xf7 : return 0x04 ;break;
                                                case 0xef : return 0x05 ;break;
                                                case 0xdf :        return 0x06 ;break;       
                                                case 0xbf :        return 0x07 ;break;
                                                case 0x7f : return 0x08 ;break;
                                                  default : return 0xff;
                                        }
                                }
                 }
                return 0xff;         
        }               
}
void disp(void) interrupt 1{                                  //数码管显示中断服务子函数
                TH0=0xC4;                //定时器0初值装载
                TL0=0x00;                //定时器0初值装载                                    
                PA=smgd[sa];
                PD=smgb[0];
                delay(600);
                PD=smgb[1];

                PA=smgd[sb];
                PD=smgb[2];
                delay(600);
                PD=smgb[3];

                PA=smgd[sc];
                PD=smgb[4];
                delay(600);
                PD=smgb[5];
}
                  
void c8255init(void){          //8255初始化
        PD=0x82;
        PC=0xff;
        PB=0xff;                
        PA=0Xff;
}          
void main(void){        //主函数
        c8255init();
        TMOD=0x01;                //设置定时器0工作在方式1
        TH0=0xC4;                //定时器0初值装载
        TL0=0x00;                //定时器0初值装载                                 
        EA=1;                         //开CPU中断
        ET0=1;                         //        开定时器0中断
        EX0=1;                        // 关外部中断
        TR0=1;                        //启动定时/计数器0
        IT0=1;
        while(1){
         
        sc=x%10;
        sb=x%100/10;
        sa=x/100;
        DAC0832=x;
                switch (keyscan()){
                        case 0x01:                   up();break;                // 加1
                        case 0x02:                  down();break;                // 减1
                        case 0x03:           fangbo();break;                // 输出方波
                        case 0x04:    juchibo();break;                //输出锯齿波
                        case 0x05:    ADC0809start();break;           //开启AD转换
                }          
        }                  
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。