⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0832.c

📁 51单片机和ADC0832模数转换芯片和LED的组合
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define waitus 1

sbit ADCLK=P1^5;
sbit ADIO=P1^4;
sbit ADCS=P1^6;
sbit D=P2^4;
sbit CLK=P2^5;
sbit STR=P2^6;

uchar adread(uchar ch);
void datacov(uchar recdata,	uchar disnumber[]);
void delayms(uint ms);
void delayus(uchar us);
void display(uchar number[4]);

uchar segcode[18]={0x81,0xB7,0xC2,0x92,0xB4,0x98,0x88,0xB3,0x80,0x90,0xA0,0x8C,0xC9,0x86,0xC8,0xE8,0xFF,0xFE};	//0~F,全灭,负号
uchar segcode_com[18]={0x7E,0x48,0x3D,0x6D,0x4B,0x67,0x77,0x4C,0x7F,0x6F,0x5F,0x73,0x36,0x79,0x37,0x17,0x00,0x01};	//0~F,全灭,负号

void main(void)
{
	uchar recdata;
	uchar disnumber[4];
	while(1)
	{
		recdata=adread(0);
		datacov(recdata,disnumber);
		display(disnumber);
		delayms(1000);
	}
}

uchar adread(uchar ch)
{
	uchar recdata;
	uchar verifydata;
	uchar i;
	bit onebit;

	ADCS=1;
	ADIO=0;
	ADCLK=0;

	ADCS=0;
	ADIO=1;				//片选有效
	delayus(waitus);

	ADCLK=1;			//第一个上升沿IO为高,起始信号
	delayus(waitus);
	ADCLK=0;

	if(!ch)
	{
		
		ADIO=0;
		delayus(waitus);
		ADIO=1;
		ADCLK=1;
		delayus(waitus);
		ADCLK=0;
		delayus(waitus);
		ADIO=0;
		ADCLK=1;			//依次在第2,3个上升沿发送1,0,选择通道0
		delayus(waitus);
		ADCLK=0;
	}
	else
	{
		ADCLK=0;
		delayus(waitus);
		ADIO=1;
		ADCLK=1;
		delayus(waitus);
		ADCLK=0;
		delayus(waitus);
		ADIO=1;
		ADCLK=1;			//依次在第2,3个上升沿发送1,1,选择通道1
		delayus(waitus);
		ADCLK=0;
	}	

	delayus(waitus);

	for(i=0;i<8;i++)
	{
		ADCLK=1;
		delayus(waitus);
		ADIO=1;				//不要忘了先赋1再读数!!!
		ADCLK=0;
		recdata=recdata<<1;
		onebit=ADIO;
		if(onebit)
			recdata=recdata | 0x01;
	}

	if(onebit)
		verifydata=verifydata | 0x80;

	for(i=0;i<7;i++)
	{
		ADCLK=1;
		delayus(waitus);
		ADIO=1;
		ADCLK=0;
		verifydata=verifydata>>1;
		onebit=ADIO;
		if(onebit)
			verifydata=verifydata | 0x80;
	}

	while(recdata != verifydata);

	return(recdata);

}

void display(uchar number[4])
{
	uchar i;
	uchar j;
	uchar temp;
	STR=0;
	for(i=0;i<4;i++)	 //四个数码管
	{
		temp=segcode[number[i]];
		if(i==3)temp=temp & 0x7F;		//为在3位上显示小数点
		for(j=0;j<8;j++)  // 每个数码管有8位,均显示为0;
		{
			D=temp & 0x01;
			temp=temp>>1;
			CLK=1;
			CLK=0;
		}
	}
	STR=1;
}

void delayus(uchar us)	//延时5+2*N个机器周期
{
	while(--us);
}

void delayms(uint ms)
{
    uchar j;
    while(ms--)
    {
        for(j=0;j<125;j++);
    }
}

void datacov(uchar recdata,uchar disnumber[])
{
	uint temp;
	temp=recdata;				//注意!这个地方必须先把recdata(uchar类型)的先赋给temp(uint类型)
	temp=195*temp/10;			//否则直接用recdata进行运算会造成数据的丢失!因为结果已经超出了uchar类型的范围!!!
	disnumber[3]=temp/1000;
	disnumber[2]=(temp-(disnumber[3]*1000))/100;
	disnumber[1]=(temp-(disnumber[3]*1000)-(disnumber[2]*100))/10;
	disnumber[0]=(temp-(disnumber[3]*1000)-(disnumber[2]*100)-(disnumber[1]*10));
}

		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -