📄 0832.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 + -