初学单片机几月,这是我最近做的关于ad转换的电压采集。
如有错误,望请指正,蟹蟹~
希望大家能够多多与我交流经验,新人请多多指教。
用proteus画的仿真图,文档中含有源代码与仿真文件。
仿真实现结果
- #include<reg51.h>
- #include <intrins.h>
- sbit w1=P1^4;
- sbit w2=P1^5;
- sbit w3=P1^6;
- sbit w4=P1^7;
- sbit OE=P1^0;
- sbit EOC=P1^1;
- sbit ST=P1^2;
- sbit CLOCK=P1^3;
- sbit a=P0^0;
- sbit b=P0^1;
- sbit c=P0^2;
- unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12};/*带小数点的数字0~5*/
- unsigned char code table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0~9编码
- unsigned char vdata;
- void zhongduan()
- {
- a=0;
- b=0;
- c=0;//选择通道0
- TMOD=0x02;
- TH0=256-50;
- TL0=256-50;
- EA=1;ET0=1;
- TR0=1;
- }
- void delay()
- {unsigned char i,j;
- for(i=0;i<10;i++)
- for(j=0;j<50;j++);}
- void convert(unsigned char vdata)//数码管的动态显示
- {
- P2=table1[vdata*196/10000];/*小数点前一位数字显示 */
- w1=1;
- delay();
- w1=0;
- P2=table2[vdata*196/1000%10]; //小数点后一位
- w2=1;
- delay();
- w2=0;
- P2=table2[vdata*196/100%10];//小数点后两位
- w3=1;
- delay();
- w3=0;
- P2=table2[vdata*196/10%10]; //小数点后三位
- w4=1;
- delay();
- w4=0;
- }
- void main()
- {
- unsigned char vdata;
- zhongduan();
- while(1)
- {
- ST=0;
- _nop_();
- ST=1;
- _nop_();
- ST=0;
- _nop_(); //构造上升下降沿,启动AD转换器
- while(EOC==0); //等待ad转换结束
- OE=1;//数据送至out口
- _nop_();
- vdata=P3;//将数据值赋给变量vdata
- convert(vdata);//将转换的数据通过数码管显示所得数字
- delay();
- OE=0;
- }}
- void time0_int()interrupt 1 //中断服务子程序,产生时钟脉冲,将模拟信号转换为数字信号
- {
- CLOCK=~CLOCK;
- }
复制代码
|