?? 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 + -