- #include
- #include
- #include
- #include
- sfr P1M0=0x92;
- sfr P1M1=0x91;
- sfr P2M0=0x96;
- sfr P2M1=0x95;
- sfr P3M0=0xb2;
- sfr P3M1=0xb1;
- #define uint unsigned int
- #define uchar unsigned char
- ***it cs=P1^0; //0832引脚
- ***it clk=P1^1;
- ***it di=P1^2;
- ***it do0832=P1^3;
- ***it relay=P1^4;
- ***it led=P1^7; //LED报警
- ***it SFTCLK=P2^2; //595引脚
- ***it LCHCLK=P2^1;
- ***it SDI=P2^0;
- ***it k1=P3^2;
- ***it k2=P3^3;
- uchar smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar smgwei[]={0xef,0xdf,0xbf,0x7f};
- uint t[30];
- uchar i=0,j=0,k,ch1=0,ch2=0;
- void delay() //延时5us
- {
- uchar a;
- _nop_();
- a=11;
- while(--a);
- }
- #define pulse {delay();clk=1;delay();clk=0;} //595脉冲
- void adc()interrupt 1 //1s一次adc
- {
- uchar a,b;
- j=0;
- cs=0; //允许0832
- di=1;
- pulse; //第一个脉冲,起始信号
- di=1;
- pulse; //第二个脉冲,DI=1表示双通道单极性输入
- di=1;
- pulse; //第三个脉冲,DI=1表示选择通道1(CH1)
- for(a=0;a<8;a++) //在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数(读前八位的值)
- {
- pulse;
- ch1<<=1;
- _nop_();
- if(do0832==1)
- ch1|=0x01;
- }
- for(b=0;b<8;b++) //在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数(读后八位的值)
- {
- ch2>>=1;
- if(do0832==1)
- ch2|=0x80;
- pulse;
- }
- cs=1; //释放ADC0832
- i++;
- if(i==30)
- {
- memset(t,0,sizeof(t)); //将t[i]初始化
- i=0;
- }
- t[i]=ch1;
-
-
- TH0=(65535-50000)/256;
- TL0=(65536-50000)%256;
- }
- void hc595(uchar x,uchar y) //595串行输入
- {
- int a,b;
- for(a=0;a<8;a++)
- {
- x<<=1;
- SDI=CY;
- SFTCLK=0;
- _nop_();
- SFTCLK=1;
- }
- for(b=0;b<8;b++)
- {
- y<<=1;
- SDI=CY;
- SFTCLK=0;
- _nop_();
- SFTCLK=1;
- }
- LCHCLK=0;
- _nop_();
- LCHCLK=1;
- }
- void cx()interrupt 0 //P32查询
- {
- ET0=0;
- if(i==0)
- {
- i=29;
- }
- i--;
- }
- void fw()interrupt 2 //P33继续测电压
- {
- i=k;
- ET0=1;
- }
- void display()interrupt 3 //数码管显示
- {
- float m;
- int n;
- if(relay==1)
- m=(t[i]*5.0)/256.0;
- else
- m=(t[i]*5.0)/256.0*10; //将数字电压换算成模拟电压
- if(i>1)
- {
- if(m<5) //继电器切换量程
- relay=1;
- }
- n=m*100; //用来显示两位小数
- if(n/1000!=0)
- hc595(smgwei[0],smgduan[n/1000]); //十位
- hc595(smgwei[1],smgduan[n/100%10]|0x80);//个位加小数点
- hc595(smgwei[2],smgduan[n/10%10]); //十分位
- hc595(smgwei[3],smgduan[n%10]); //百分位
- k=i;
- if(m>20) //LED报警
- led=1;
- else
- led=0;
- }
- void main()
- {
- EA=1; //初始化
- TMOD=0x01;
- TH0=(65535-50000)/256;
- TL0=(65536-50000)%256; //T0定时时间为50ms ,选择方式1
- ET0=1;
- TR0=1;
- TH1=(65535-5000)/256;
- TL1=(65536-5000)%256; //T1定时时间为5ms,选择方式0
- ET1=1;
- TR1=1;
- IT0=1;
- EX0=1;
- IT1=1;
- EX1=1;
- led=0;
- relay=0;
- while(1);
- }
基于52
单片机的自动切换量程的数字电压表
设计一个数字电压表,要求:
(1)要求测量0~20V的模拟电压,能显示两位小数。(5v和20v两档量程)
(2)可自动切换量程。
(3)超过20V时指示灯闪烁。
(4)储存电压值以供查询。
在
proteus仿真中测试了可以实现从20v到5v量程的切换,但是却不能从5v切换到20v,增加电压值,当电压值达到5v时,显示数值为4.98,继续增加电压值,数值仍然为4.98.而且按下s1按键不能查询以前的电压值。单片机课设,过几天就要交了,麻烦各位了。