标题:
单片机酒精检测 AD转换 程序
[打印本页]
作者:
彧伟
时间:
2021-10-22 16:43
标题:
单片机酒精检测 AD转换 程序
1.png
(89.54 KB, 下载次数: 58)
下载附件
2021-10-22 17:23 上传
#include<intrins.h>
#include<reg51.h>
#define uchar unsigned char
#define nop _nop_()
code uchar seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90};
uchar cp1,cp2,dat_ad;
sbit CS = P3^0;
sbit CLK = P3^1;
sbit DIDO = P3^2;
/*对ADC0832初始化处理*/
void adc0832_init(void)
{
CS = 1;nop;
CLK = 1;
CS = 0;
}
/*对转换ch0通道的模拟信号*/
uchar adc0832_ch0(void)
{
uchar dat1,i;
adc0832_init();
DIDO = 1;CLK = 0;nop;CLK = 1;nop; //第一个下降沿,DI必须为高电平,表示启始信号
DIDO = 1;CLK = 0;/*这里是第二个下降沿*/nop;CLK = 1;nop; //第二个下降沿
DIDO = 0;CLK = 0;/*这里是第三个下降沿*/nop;CLK = 1;nop; //第三个下降沿,发送1,0;选择通道ch0
DIDO = 1; //释放总线
/*上面都是配置位,达到了启动并选择通道0的作用*/
for(i = 0;i<8;i++) //第4个下降沿到第11个下降沿
{
CLK = 0;nop; //
if(DIDO)dat1 = dat1|0x01; //最低位置1(与特定数字按位或的作用,可以达到控制指定位而其他位不变)
//注意dat1是MCU中的数据嗷,ADC发送的是DIDO
CLK = 1;nop; //这个CLK是单片机发给ADC的,因此在一个上升沿之间还可以处理一些程序。注意上面的这个IF语句是由MCU处理的啊!
dat1 = dat1<<1; //左移,低位填充0,依次输出最高位
//DIDO每发送一位,MCU中的dat1变化一位。8位完成后即dat1返回
}
return(dat1); //返回的是数模转换的值
CS = 1;
}
void timer0_init() //中断初始化函数
{
TMOD = 0x01;
TL0 = 0x78;
TH0 = 0xec;
EA = 1;
TR0 = 1;
ET0 = 1;
}
void timer0_isr()interrupt 1 //中断服务函数
{
TL0 = 0x78;
TH0 = 0xec;
cp1++;
if(cp1>100) //0.5s
{
cp1 = 0;
dat_ad=adc0832_ch0(); //adc0832转换一次
}
P0 = 0xff; //消隐
switch(cp2)
{
case 0:P0 = seven_seg[dat_ad%10];P2 = 0x01;break;
case 1:P0 = seven_seg[dat_ad%100/10];P2 = 0x02;break;
case 2:P0 = seven_seg[dat_ad/100];P2 = 0x04;break;
}
cp2++;
if(cp2>=3)
cp2 = 0;
}
void main()
{
timer0_init();
adc0832_init();
while(1);
}
复制代码
作者:
黑心栗子
时间:
2023-12-14 15:15
为什么改变滑动变阻器的阻值,数码管显示的数值不变呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1