应该还可以吧,课堂作业。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit dat=P1^2;
- sbit sclk=P1^1;
- sbit cs=P1^0;
- uchar ad_flag;
- uint ad_value[4]={0};
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3e};
- unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed};
- unsigned char code wei[]={0x01,0x02,0x04,0x08};
- void display()
- { uchar num;
- uchar t=180;
- for(num=0;num<4;num++)
- { P0=~wei[num];
- if(num==0)
- P2=~table1[ad_value[num]];
- else
- P2=~table[ad_value[num]];
- while(t--);
- }
-
- }
- /*********AD转换函数*************/
- uint adc0831() //根据时序图写出的模拟数据输出
- {
- uchar i;
- uint temp;
- dat=1;
- sclk=0;
- cs=1; //启动AD
- _nop_();
- _nop_();
- cs=0;
- _nop_();
- _nop_();
- sclk=0; // 第一个周期
- _nop_();
- _nop_();
- sclk=1; //
- _nop_();
- _nop_();
- sclk=0; // 第二个周期
- _nop_();
- _nop_();
- sclk=1; //
- _nop_();
- _nop_();
- sclk=0; // 第三个周期
- _nop_();
- _nop_();
- for(i=0;i<8;i++)
- {
- //高电平内接收数据
-
- temp<<=1; //ADC0831先传输数据高位,再传输数据低位
- if(dat)
- {
- temp++;
- }
- sclk=1;
- _nop_();
- _nop_();
- sclk=0;
- _nop_();
- _nop_();
- }
- cs=1;
- _nop_();
- _nop_();
- return(temp);
- }
- /*************主函数********************/
- void main()
- { uint ad,i=0;
- ad_value[3]=10;
- while(1)
- { i++;
- if(i==255)
- {
- i=0;
- ad=adc0831(); //ADzhuanhuan
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
简易数字电压表.rar
(21.25 KB, 下载次数: 61)
|