做了一个关于数字电压表的课程设计,已经验收
电路原理图如下:
电路原理图如下:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
c源码
- #include<AT89X52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uint a1,b1,ge,fen,fen1;
- uchar t,dispcount,count=0,flag=0;
- uchar dispbuf[4]={0,0,0,0};// 0x76,0x3f,0x3f,0x4f
- uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xff};
- sbit W0=P3^5; //
- sbit W1=P3^4; //
- sbit W2=P3^3; //
- sbit W3=P3^2; //数码管位选
- sbit PIN=P1^7;
- sbit st=P2^4; sbit ale=P2^3; //通道控制
- sbit oe=P2^5; //输出控制
- sbit eoc=P3^7; //转换结束标志
- sbit a=P2^0; //
- sbit b=P2^1; //
- sbit c=P2^2; //通道选择
- sbit k1=P3^0; //功能转换键
- sbit k2=P3^1; //通道选择键
- void delay(uchar x)
- {
- uint a,b;
- for(a=x;a>0;a--)
- for(b=110;b>0;b--);
- }
- void xz()//通道选择
- {
- if(t==0)
- {
- a=0;b=0;c=0;
- ale=1;
- delay(1);
- ale=0; }
- if(t==1)
- {a=1;b=0;c=0;
- ale=1;
- delay(1);
- ale=0; }
- if(t==2)
- {a=0;b=1;c=0;
- ale=1;
- delay(1);
- ale=0; }
- if(t==3)
- {
- a=1;b=1;c=0;
- ale=1;
- delay(1);
- ale=0; }
- if(t==4)
- {
- a=0;b=0;c=1;
- ale=1;
- delay(1);
- ale=0; }
- if(t==5)
- {
- a=1;b=0;c=1;
- ale=1;
- delay(1);
- ale=0;
- }
- if(t==6)
- {
- a=0;b=1;c=1;ale=1;
- delay(1);
- ale=0;
- }
- if(t==7)
- {a=1;b=1;c=1;ale=1;
- delay(1);
- ale=0;
- }
- }
- void aj()//按键
- {
- if(k1==0)
- {
- delay(2);
- if(k1==0)
- TR1=!TR1; //定时器1 使能取反
- while(!k1);
- }
- if(TR1==0)
- {
- if(k2==0)
- {
- delay(5);
- if(k2==0)
- {
- t++;
- if(t==8)
- t=0;
- }
- while(!k2);
- }
- }
- }
- void du()//读数据
- {
- uchar tmp;
- st=1;
- st=0;
- delay(1); //这里必须延时给硬件处理时间if(eoc==1) //转换结束标志
- {
- oe=1; //转换结束输出控制
- delay(1);
- tmp=P0;
- oe=0;
- delay(1);
- }
- if(tmp>=255)
- {
- flag=1;
- }
- else
- {
- flag=0;
- }
- ge=tmp/51;
- a1=(tmp%51)*10;
- fen=a1/51;
- b1=(a1%51)*10;
- fen1=b1/51;
- dispbuf[0]=dispcode[t];
- dispbuf[1]=dispcode[ge];
- dispbuf[2]=dispcode[fen];
- dispbuf[3]=dispcode[fen1];
- }
- void init()//初始化
- {
- EA=1;
- ET1=1;
- TMOD=0x10;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- T2MOD=0x00;
- T2CON=0x04; TR2=1 ;RCAP2L=(65536-4000)%256;
- RCAP2H=(65536-4000)/256;
- TR2=1; //打开定时器中断1,2
- ET2=1;
- W0=1;
- W1=1;
- W2=1;
- W3=1;
- ale=0;
- oe=0;
- st=0;
- t=0;k1=1;k2=1;
- }
- void as() interrupt 3 using 0 {
- uchar a;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- a++;
- if(a==20)
- {
- a=0;
- t++;
- if(t==8)
- t=0;
- }
- }
- void main()
- {
- init();
- while(1)
- {
- aj();
- xz();
- du();
- // xs();
- }
- }
- void t1(void) interrupt 5 using 0
- {
- TF2=0; //T2定时器必须用软件清0
- P1=dispbuf[dispcount]; //控制数码管显示
- if (dispcount==0)
- {
- W0=0;
- W1=1;
- W2=1;
- W3=1;
- }
- if(dispcount==1)
- { PIN=0;
- W0=1;
- W1=0;
- W2=1;
- W3=1;
- }
- if(dispcount==2)
- {
- PIN=1;
- W0=1;
- W1=1;
- W2=0;
- W3=1;
- }
- if(dispcount==3)
- {
- W0=1;W1=1;W2=1;W3=0;
- }
- dispcount++;
- if(flag==1)
- count++;
- if(dispcount==4) dispcount=0;
- }
复制代码
全部资料51hei下载地址:
51上传.zip
(975.31 KB, 下载次数: 85)
|