“Mona”通过精心收集,向本站投稿了2篇结合单片机学习板学习c语言之AD转换,下面是小编整理后的结合单片机学习板学习c语言之AD转换,欢迎大家阅读借鉴,并有积极分享。

篇1:结合单片机学习板学习c语言之AD转换
目的:通过STC单片
机接收ADC0804
的数字量,并把该数字
量通过8155控制的
LED显示出来,
/*本程序利用查询法
得到ADC0804的
AD转换后的数字量。
*/
#include“a
t89x51.h”
#include“a
bsacc.h”
#include “intrins.h
”
#include
tdio.h>
#include“m
ath.h”
#define uchar unsigned char
sfr ISP_CONTR =0xE7;
uchar advalue,ad
l,adh;
uchar code BitdisL[]=
{0x1f,0x2f
,0x37,0x3b
,0x3d,0x3e
};
uchar code Chardis[]=
{0x3f,0x06
,0x5b,0x4f
,0x66,0x6d
,0x7d,0x07
,0x7f,0x6f
,0x77,0x7c
,0x39,0x5e
,0x79,0x71
};
delay_05s(
)
{
int count;
count=647
395;
for(;coun
t!=0;count
--);
}
/*void ad interrupt 2 //如果想要用中断法
,可以使用这个子程序
{
//EX1=0;
RD=0;
advalue=P
0;
adl=adval
ue & 0x0f;
adh=_cror
_(advalue,
4);
RD=1;
//P1=~P1;
//P1=adva
lue;
WR=0;
_nop_();
WR=1;
//EX1=1;
}*/
void serial() interrupt 4 //编号0-4,外中
断0,定时器0,外中
断1,定时器1,串行
中断
{
uchar a;
RI=0;
a=SBUF;
if (a==0xFE)
{P1_0=0;
delay_05
s();
delay_05
s();
ISP_CONT
R=0x60;}
else if(a=='A')
{P1_1=0;
delay_05
s();
P1_1=1;
}
}
void main(void)
{
unsigned int b;
unsigned char cmd,temp;
TMOD=0x20
;
TH1=0xf4;
TL1=0XF4;
TR1=1;
SCON=0XF8
;
PCON=0X80
;
IT0=1;
EA=1;
ES=1;
RI=0;
cmd=0x0F;
XBYTE[0X7
FF0]=cmd;
WR=0;
_nop_();
WR=1;
while(1)
{
WR=0;
_nop_();
WR=1;
while(P3
_3);
RD=0;
advalue=
P0;
RD=1;
if (cabs(adva
lue-temp)>
0x01)/*该句仅
仅为了显示值不会老是
变动,但代价是显示精
度减少了,有的电压不
能用数字显示出来,
*
/
{
temp=ad
value;
adl=adv
alue & 0x0f;
adh=adv
alue>>4;
}
XBYTE[0X
7FF3]=Bitd
isL[1];
XBYTE[0X
7FF1]=Char
dis[adl];
for(b=0;
b<500;b++)
;
XBYTE[0X
7FF3]=Bitd
isL[0];
XBYTE[0X
7FF1]=Char
dis[adh];
for(b=0;
b<500;b++)
;
}
}
【重点难点】
1.启动ADC080
4,有的书写MOVX
@Ri,A (即XBYTE[0X
0000]=0X00
;),用这个语句来启
动单片机,我个人认为
,程序没错,但是它可
能针对低频晶振用的,
当用到高频晶振,WR
篇2:结合单片机学习板学习c语言之led数码管显示
目的:STC单片机通
过控制8155I/O
扩展芯片驱动6位7段
LED数码管显示,
/*本程序通过单片机
控制8155的PA与
PC口,在6位的LE
D上显示123456
*/
#include“a
t89x51.h”
#include“a
bsacc.h”
#include “intrins.h
”
#include
tdio.h>
#define uchar unsigned char
sfr ISP_CONTR =0xE7;
uchar code BitdisL[]=
{0x1f,0x2f
,0x37,0x3b
,0x3d,0x3e
};
uchar code Chardis[]=
{0x3f,0x06
,0x5b,0x4f
,0x66,0x6d
,0x7d,0x07
,0x7f,0x6f
,0x77,0x7c
,0x39,0x5e
,0x79,0x71
};
delay_05s(
)
{
int count;
count=647
395;
for(;coun
t!=0;count
--);
}
void serial() interrupt 4 //编号0-4,外中
断0,定时器0,外中
断1,定时器1,串行
中断
{
int a;
RI=0;
a=SBUF;
if (a==0xFE)
{delay_0
5s();
delay_05
s();
ISP_CONT
R=0x60;}
else
SBUF='A'
;
while(!T
I);
TI=0;
}
void main(void)
{
unsigned int b,i;
unsigned char cmd,a;
TMOD=0x20
;
TH1=0xf4;
TL1=0XF4;
TR1=1;
SCON=0XF8
;
PCON=0X80
;
EA=1;
ES=1;
RI=0;
cmd=0x0F;
XBYTE[0X7
FF0]=cmd;
a=0xfe;
while(1)
{
XBYTE[0X7
FF3]=Bitdi
sL[i];
XBYTE[0X7
FF1]=Chard
is[i];
for(b=0;
b<500;b++)
;
i++;
if (i>6)
i=0;
}
}
【重点难点】
1.熟悉8155的端
口分配,
2.确定8155地址
,由上图可以看出,由
于当8155的IO/
M=1,CE=0时,
才能对8155设置命
令寄存器和A,B,C
口。由上图不难得出命
令寄存器的地址是0x
7ff0(该地址不唯
一,也可以是0x40
00等)
3.每位LED显示时
间为“for(b=0
;b<500;b++
);”比较合适,延时
太短了,每个LED显
示变暗,这在后一个实
验中即可出现。延时太
长了,就会出现形如C
RT刷新率不高时闪烁
现象。












