左边的模拟称重传感器电位一变,数码管就显示重量了中间有个数模模数转换仿真均真实有效
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <REG52.H>
- #include <intrins.h>
- #define uchar unsigned char //宏定义方便以后用
- #define uint unsigned int
- #define ulong unsigned long
- //数码管位选
- sbit S1=P2^0;
- sbit S2=P2^1;
- sbit S3=P2^2;
- sbit S4=P2^3;
- //定义ADC的引脚
- sbit AD_CS=P1^3;
- sbit AD_CLK=P1^0;
- sbit AD_IN=P1^1;
- sbit AD_OUT=P1^2;
- uchar Disdatabuf[5]={0}; //数码管显示数据
- char code SEGtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管码表
- void delay()
- {
- uint i=5;
- while(i--);
- }
- //读取adc数值
- uint ReadADC_TLC2543(uint CH)
- {
- uint ad=0,i;
- AD_CLK=0;
- AD_CS=0;
- CH<<=4;
- for(i=0;i<12;i++)
- {
- if(AD_OUT) ad|=0x01;
- AD_IN=(bit)(CH&0x80);
- AD_CLK=1;
- delay();
- AD_CLK=0;
- delay();
- CH<<=1;
- ad<<=1;
- }
- AD_CS=1;
- ad>>=1;
- return(ad);
-
- }
- void Delay(uint i)//1ms延时
- {
- uchar x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- //数码管动态扫描
- void Show_data()
- {
- static uchar i=0;
- P0=0xff; //关闭显示
- switch(i)
- {
- case 0: //显示模式
- S1=1;S2=0;S3=0;S4=0;
- P0=SEGtable[Disdatabuf[3]];
- i++;
- break;
- case 1: //正反转
- S1=0;S2=1;S3=0;S4=0;
- P0=SEGtable[Disdatabuf[2]];
- i++;
- break;
- case 2:
- S1=0;S2=0;S3=1;S4=0;
- P0=SEGtable[Disdatabuf[1]];
- i++;
- break;
- case 3:
- S1=0;S2=0;S3=0;S4=1;
- P0=SEGtable[Disdatabuf[0]];
- i=0;
- break;
-
- }
- }
- //主函数
- void main()
- {
- ulong temp=0;
- ulong AD_Data=0; //ADC数值
- while(1)
- {
- AD_Data=ReadADC_TLC2543(0); //读取ADC
- temp= AD_Data*1000/4094;//转化数据
- //显示占空比
- Disdatabuf[3]= temp/1000;
- Disdatabuf[2]= temp%1000/100;
- Disdatabuf[1]= temp%100/10;
- Disdatabuf[0]=temp%10;
- Show_data(); //显示数据
- Delay(10); //延时
- }
- }
复制代码
Keil代码与Proteus仿真下载:
T88称重仿真.zip
(595.27 KB, 下载次数: 35)
|