设计,大部分都是跟着学霸的样子照猫画虎写出来的,做了些适当的改动
代码和功能都比较简陋,代码有注释,适合单片机入门参考(仿真用的是proteus8.6版本,低版本的可能打不开)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管断选码,不显示小数点
- unsigned char b[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //显示小数点
- sbit START=P2^4;
- sbit OE=P2^6;
- sbit EOC=P2^5;
- sbit add_a=P2^2;
- sbit add_b=P2^1;
- sbit add_c=P2^0;
- sbit led=P2^7;
- sbit buzzer=P2^3;
- sbit S_1=P0^0;
- sbit S_2=P0^1;
- sbit S_3=P0^2;
- sbit S_4=P0^3 ;
- void Delay1ms(unsigned int count)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- void main(void)
- {
- unsigned int addata=0,i;
- unsigned char temp0=0,temp1=0,temp2=0;
- while(1)
- { //采集第一路信号
- add_a=0;
- add_b=0;
- add_c=0;
- START=0;
- START=1;
- Delay1ms(5);
- START=0;
- while(EOC!=1);
- OE=1;
- addata=P1;
- OE=0;
- if(addata>=0xcc) //当大于4.0v时,则使用LED和蜂鸣器报警
- {
- for(i=0;i<100;i++)
- {
- led=~led;
- buzzer=~buzzer;
- }
- led=1; //控制发光二极管D2闪烁,发出光报警信号
- buzzer=1; //控制蜂鸣器发声,发出声音报警信号
- }
- else //否则取消报警
- {
- led=0; //控制发光二极管D2灭
- buzzer=0; //控制蜂鸣器不发声
- }
-
-
- addata=addata*100/51; // 二进制输出数据最高是255,仿真电压最高是5v,255/5=51,最小单位是51
- temp0=addata%10; // 取个位数 例如输出数据为123,123/10=12.3,addata为整数,不能等于12.3,只能取余数3
- temp1=(addata/10)%10; // 取十分位数
- temp2=(addata/100)%10; //取百分位数
- for(i=0;i<=200;i++)
- {
-
- S_1 = 0; //第一个数码管
- S_2 = 1;
- S_3 = 1;
- S_4= 1;
- P3=b[temp2]; //选取带有小数点的段选码
- Delay1ms(10); //延时
- S_1 = 1; //消隐
-
- //十分位
- S_1 = 1;
- S_2 = 0; //取第二个数码管
- S_3= 1;
- S_4= 1;
- P3=a[temp1]; //选取不带有小数点的段选码
- Delay1ms(5);
- S_2 = 1; //消隐
-
- //百分位
- S_1 = 1;
- S_2 = 1;
- S_3= 0; //取第三个数码管
- S_4= 1;
- P3=a[temp0]; //选取不带有小数点的段选码
- Delay1ms(5);
- S_3= 1;
- }
- }}
复制代码
所有资料51hei提供下载:
ADC0809数码管电压表.zip
(134.83 KB, 下载次数: 44)
(仿真用的是proteus8.6版本,低版本的可能打不开)
|