标题:
C51单片机ADC0804模拟转换Proteus仿真程序
[打印本页]
作者:
joe_2019
时间:
2020-11-7 22:40
标题:
C51单片机ADC0804模拟转换Proteus仿真程序
终于把这个模拟给做出来了,体会到了怎么去发现坑,学着去填坑,仿真文件供大家参考,谢谢。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Snipaste_2020-11-07_22-35-35.jpg
(399.6 KB, 下载次数: 89)
下载附件
2020-11-7 22:39 上传
单片机源程序如下:
#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)
2020-11-7 22:39 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1