xlndz 发表于 2012-2-21 12:46:38

8位数字电位器程序

#include<reg51.h>
#include<absacc.h>
#define PD XBYTE                        //8255控制口
#define PC XBYTE                        //8255扩展C口
#define PB XBYTE                        //8255扩展B口
#define PA XBYTE                        //8255扩展A口

#define DAC0832 XBYTE                //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=0x00;                //通道0启动信号
        x=XBYTE;
    XBYTE=0x00;
}
void ADC0809() interrupt 0{

x=XBYTE;
XBYTE=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;
                PD=smgb;
                delay(600);
                PD=smgb;

                PA=smgd;
                PD=smgb;
                delay(600);
                PD=smgb;

                PA=smgd;
                PD=smgb;
                delay(600);
                PD=smgb;
}
                  
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转换
                }          
        }                  
}

niaiwma003 发表于 2012-9-15 19:10:12

有没有电路图呀发上来吗

wwwavrw 发表于 2012-9-15 21:05:20

希望给出电路图,.

liuzhengyaAVR 发表于 2012-9-15 21:31:01

用的那个电位器的?

ksd 发表于 2012-9-15 21:31:34

这个制作成本有些高了,而且还比较复杂。我以前看到过一个2051做的,比较简单实用。

cxtx00 发表于 2012-10-20 17:31:56

电路图额
页: [1]
查看完整版本: 8位数字电位器程序