这是我做的基于adc0832的电压表,模拟电压输入0-5v,adc0832模数转换
运用四位数码管显示,精确到第三位小数点,protues仿真,单片机型号为stc89c52
单片机源程序如下:
- #include<AT89x51.h>
- #include<intrins.h> //头文件声明
- #define uchar unsigned char
- #define uint unsigned int //定义数据类型
- sbit CS=P2^3; //0832的cs为单片机p2.3
- sbit CLK=P2^2; //0832的clk为单片机p2.2
- sbit DO=P2^1; //0832的do为单片机p2.1
- sbit DI=P2^0; //0832的di为单片机p2.0
- uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};//共阳数码管编码
- uint vvv,i; //声明电压值vvv
- void delay (int tt) //延时函数,时间为tt*0.5ms
- {
- while(tt--)
- {
- for(i=0;i<300;i++);
- }
- }
- uchar Get_AD_Result()
- {
- uint j=0;
- uchar dat1=0;
- CS=1;
- CLK=0; _nop_(); _nop_();
- CS = 0; _nop_(); _nop_();
- CLK = 1; _nop_(); _nop_(); //第一个上升沿
- DI = 1; _nop_(); _nop_(); //起始信号
- CLK = 1; _nop_(); _nop_();
- CLK = 0;DI = 1; _nop_(); _nop_(); //第一个下降
- CLK = 1; _nop_(); _nop_();
- CLK = 0;DI = 1; _nop_(); _nop_(); //第二个下降
- CLK = 1;DI = 0; _nop_(); _nop_();
- CLK = 0;DI = 1; _nop_(); _nop_(); //第三个下降后,须将DI置高,准备接收数据
- for(j=0;j<8;j++)
- {
- CLK = 1; _nop_(); _nop_(); //第四个下,一位一位的读取数据
- CLK = 0; _nop_(); _nop_();
- if(DO) //如果这一位数据为1,dat1与0x01或等,最后一位变为1
- {
- dat1|=0x01;
- }
- else //或者这一位数据为0,将dat1于0xfe与等,最后一位变成0
- {
- dat1&=0xfe;
- }
- CLK=0;
- _nop_();
- CLK=1; //上升沿,输出数据
- dat1=dat1<<1; //将数据进行左移运算,一直到8位移入完成
- }
- CS = 1; //使能置高,禁用AD芯片
- return dat1; //返回AD值
- }
- void display(uint dat) //显示函数程序
- {
- P1=0xff; //消隐 ,显示方式为动态显示
- P0=0x08; //通过p0口驱动,显示最高位,个位
- P1=tab[dat/100]&0x7f; //计算出个位数字,并带小数点进行显示
- delay(1); //延时
- P1=0xff;
- P0=0x04; //显示小数点后第一位
- P1=tab[dat%100/10];
- delay(1);
- P1=0xff;
- P0=0x02; //显示小数点后第二位
- P1=tab[dat%10];
- delay(1);
- P1=0xff;
- P0=0x01; //显示最后一位
- P1=tab[dat%1];
- delay(1);
- P1=0xff;
- } //主函数
- void main()
- {
- //P1=0xff; //清零
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
adc0832.rar
(63.36 KB, 下载次数: 80)
|