终于把这个模拟给做出来了,体会到了怎么去发现坑,学着去填坑,仿真文件供大家参考,谢谢。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- //利用_nop_()的等待命令
- #define uchar unsigned char
- #define uint unsigned int
- sbit adwr=P3^2;
- sbit adrd=P3^1;
- sbit CS=P3^0;
- sbit INTR=P3^3;
- uchar num;
- uchar code display[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //共阳极数码管的显示代码
- uchar COM[]={0x01,0x02,0x04,0x08};
- //数码管的位选代码
- uchar num, num2=0,time[4]={0,0,0,0},val;
- float val2;
- unsigned int val3;
- main()
- {
- //使用定时器0定时对结果扫描显示
- TMOD=0x01; //定时器的工作方式1
- TH0=(65536-917)/256; //定时定义初值
- TL0=(65536-917)%256;
- EA=1; //总中断使能打开
- ET0=1; //定时器0中断
- TR0=1; //定时器0启动
- CS=0; // 启动转换
- while(1)
- //此处循环等待时间到中断
- {
- adwr=1;
- _nop_();
- adwr=0;
- _nop_();
- adwr=1;
- INTR=0;//intr转换完成后自动拉低
- //当只有一片AD芯片时,可以将CS一直处在低位即可,连续转换
- adrd=1;
- _nop_();
- adrd=0;
- _nop_();
- val=P1;
- adrd=1;
- val2=((val*1.0/255)*5.0);//将数字量转换为数值。
- val3=val2*1000;//将转化的数值放大后,分别其对应位的值
- time[0]=val3/1000;//个位
- time[1]=val3%1000/100;//个分位
- time[2]=val3%100/10;//十分位
- time[3]=val3%10;//千分位
- }
- }
- void Timer_0() interrupt 1
- {
- TH0=(65536-917)/256; //中断后计数器重新赋值
- TL0=(65536-917)%256;
- num++;
- if (num==10)
- {num=0;
- P2=COM[num2];//取反后,位选数码管全部熄灭
- //共阳极数码管时,高电平选通,低电平关闭
- P0=0xff;//数码管全部低电平,熄灭
- {
- if(num2==0)
- {P0=display[time[num2]]&0x7F;} //显示带小数点的个位数
- else
- {P0=display[time[num2]];}
- }
- num2++;
- if(num2>=4) num2=0;
- }
- }
复制代码
所有资料51hei提供下载:
02_ADC转换.zip
(89.66 KB, 下载次数: 41)
|