ADC0832电压表仿真原理图如下
单片机电压表源程序如下:
#include #include #define uint unsigned int #define uchar unsigned char sbit CS =P3^4; //片选使能端 sbit DI =P1^1; //数据信号输入端,选择通道控制(SIG/DIF和ODD/EVEN) sbit DO =P1^1; //数据输出端 sbit CLK =P1^0; //时钟脉冲 sbit S_1 = P2^3; sbit S_2 = P2^4; sbit S_3 = P2^5; sbit S_4 = P2^6; unsigned char wd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点的段选码 unsigned char yd[]={0x40,0x79,0x024,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的段选码 // ===========延时子程序================= void delay_ms(unsigned int x) { unsigned int i,j; for(i=0;i } /*=============读ADC0832函数=============*/ /*=============采集并返回=================*/ unsigned int Adc0832(unsigned char channel) //AD转换,返回结果 { uchar i=0; uchar j; uint dat=0; //正向输入数据 uchar ndat=0; //反向输入数据 //****************初始化操作************** if(channel==0)channel=2; //10B对应SGL/DIF=1,ODD/EVEN=0 if(channel==1)channel=3; //11B对应SGL/DIF=1,ODD/EVEN=1 //****************写操作,将通道数据写入ADC0832************** DI=1; _nop_();_nop_(); //发起始位,固定为1(1位) CS=0;_nop_();_nop_(); //拉低CS端,让ADC0832使能 CLK=1;_nop_();_nop_(); //拉高CLK端,DI端的数据移入ADC0832内部的多路移位寄存器 CLK=0;_nop_();_nop_(); //拉低CLK端,形成下降沿1,第一个周期开始 CLK=1; //拉高CLK端,在第一个时钟周期内,DI为高电平,表示启动位 //紧接着输入两位配置位进行通道选择 DI=channel&0x1;_nop_();_nop_(); //假设选取通道0,则10&01=0,即SGL/DIF=0,为差分输入(2位) CLK=0;_nop_();_nop_(); //拉低CLK端,形成下降沿2,第二个周期开始 CLK=1; //拉高CLK端 DI=(channel>>1)&0x1;_nop_();_nop_(); //假设选取通道0,则01&01=1,ODD/EVEN=1,表示通道0 CLK=0; //拉低CLK端,形成下降沿3 DI=1;_nop_();_nop_(); //控制命令结束 dat=0; //*************读操作,将AD转换的数从DO口输出**************** for(i=0;i<8;i++) //每一个CLK下降沿输出一位数,先输出高位 { dat|=DO; //收数据,“|”位或,如果2位中有一位为1,则结果为1,否则为0 CLK=1;_nop_();_nop_(); CLK=0;_nop_();_nop_(); //形成一次时钟脉冲 dat<<=1; if(i==7)dat|=DO; } for(i=0;i<8;i++) //每一个CLK下降沿输出一位数,先输出低位 { j=0; j=j|DO; //收数据 CLK=1;_nop_();_nop_(); CLK=0;_nop_();_nop_(); //形成一次时钟脉冲 j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } //*********************结束AD转换,并返回转换的数*********************** CS=1; //拉低CS端 CLK=0; //拉低CLK端 DO=1; //拉高数据端,回到初始状态 dat<<=8; dat|=ndat; return(dat); //返回数据 } //============数码管显示函数========================== void display(uchar p) //数码管显示函数 { uchar S1,S2,S3; S1=p/51; //个位 S2=(p*10/51)%10; //十分位 S3=(p*100/51)%10; //百分位 //个位 S_1 = 1; //第一个数码管 S_2 = 0; S_3 = 0; S_4= 0; P0=yd[S1]; //选取带有小数点的段选码 delay_ms(5); //延时 S_1 = 0; //消隐 //十分位 S_1 = 0; S_2 = 1; //取第二个数码管 S_3= 0; S_4= 0; P0=wd[S2]; //选取不带有小数点的段选码 delay_ms(5); S_2 = 0; //消隐 //百分位 S_1 = 0; S_2 = 0; S_3= 1; //取第三个数码管 S_4= 0; P0=wd[S3]; //选取不带有小数点的段选码 delay_ms(5); S_3= 0; //消隐 } //===========主函数================ int main(void) { while(1) //无限循环 display(Adc0832(0));//数码管显示 //Adc0832(0):选择通道0,单端模式 //调用Adc0832(0),SIG/DIF=0,ODD/EVEN=1,表示工作在差分输入方式,且CH0为-,CH1为+ ……………………
上一篇:单片机全自动洗衣机程序+仿真+原理图设计调试与分析
下一篇:51单片机之4位数加法计算器的设计报告
推荐阅读最新更新时间:2024-11-13 13:25
设计资源 培训 开发板 精华推荐
- LT3663HMS8E-3.3、2.5V 降压转换器的典型应用
- C3010131_WK2114芯片方案验证板
- DN05099/D, 32 W Type-C 接口 QC-3.0 适配器解决方案设计说明
- ZTL431 三端固定稳压器的输出控制典型应用
- LTC1732-8.4 的典型应用 - 锂离子线性电池充电器控制器
- 基于L6566BH的100W超宽范围反激转换器
- 使用 ON Semiconductor 的 KA7806E 的参考设计
- 3.3、用于光网络的5V模拟放大
- LT1021CIN8-5 由电流源驱动的负分流基准的典型应用
- AX8052F143 SoC 超低功耗射频微控制器的外部 VCO 典型应用,用于射频载波频率范围为 27 - 1050 MHz
- TI 培训积分全新上线!学课程 领积分 兑礼品
- 新活动上线!ST NUCLEO-U575ZI-Q免费测评来了~
- 有奖直播预报名|TI 新一代Sitara™ AM62处理器革新人机交互——加速边缘AI的开发
- “玄铁杯”第三届RISC-V应用创新大赛—国产高性能RISC-V Linux开发板LicheePi 4A报名专场,万元奖金,邀您奔赴开源设计盛宴
- MM32F103开发板测评等你来
- 罗德与施瓦茨-车载以太网及其一致性测试方案 回馈您的需求 看视频赢好礼
- ADI 生命体征监测技术:对人体实施状态监控,答题有好礼
- “西北模电王”新概念模拟电路4 《运放电路的频率特性和滤波器》
- 最后一天!Beetle ESP32-C3免费测评,赶紧上车
- 年终大冲关!第二期光荣榜活动震撼登场!