单片机自检实验.docx
《单片机自检实验.docx》由会员分享,可在线阅读,更多相关《单片机自检实验.docx(17页珍藏版)》请在冰豆网上搜索。
单片机自检实验
/****************************************************
程序名称:
自检
功能:
自检
作者:
张俊淼
****************************************************/
ORG0000H
RESET:
AJMPINTI
ORG0003H
AJMPOINT0//外部中断0入口
ORG0013H
AJMPOINT1//外部中断1入口
ORG001BH
AJMPTINT1//计数器1入口
ORG20H
/****************************************************
初始化
****************************************************/
INTI:
MOVSP,#70H//设定堆栈段
MOVP2,#00H//关蜂鸣器
/****************************************************
数码管自检
****************************************************/
MOVDPTR,#TAB//LED显示表表头
MOVTMOD,#11H//设置定时器工作方式
MOVR1,#0//1s循环计数初始化,累积两次为100ms
CLRTR0//停止计时器工作
MOVTH0,#4CH//50ms定时的初值
MOVTL0,#00H
SETBTR0//启动定时器
MOVR0,#0//数码管10次显示循环初值
MAIN1:
ORLP2,#0FH//打开LED数码端口
MOVA,R0//装入数值
MOVCA,@A+DPTR//读出LED数码显示
MOVP0,A//显示
LP1:
JBCTF0,LP2//查询是否溢出查询方式定时一秒
AJMPLP1//没有溢出则继续查询
LP2:
MOVTH0,#4CH//50ms定时的初值
MOVTL0,#00H
INCR1//1s计数值+1
CJNER1,#20,LP1//没有达到1s则继续等待
MOVR1,#0//恢复初值
INCR0//若已到达1s,则显示值+1
CJNER0,#10,MAIN1//是否已显示10次?
/****************************************************
走马灯自检
****************************************************/
MOVP2,#0//关闭数码管
SETBP2.4//开LED显示
MOVR0,#0FEH//LED显示编码
MOVR1,#0//走马灯循环计数初始化
ZOUMA:
MOVP0,R0
MOVA,R0
RLA
MOVR0,A//走马灯右移
INCR1
MOVR4,#255
ACALLADELAY//延时一段时间
CJNER1,#8,ZOUMA
/****************************************************
串行口自检
****************************************************/
MAIN2:
MOVTMOD,#20H//设置计时器T1工作方式2
MOVSCON,#50H//设置为串行端口方式1,允许接收
MOVTH1,#0E8H//计数重装值
MOVTL1,#0E8H//计数器初值
SETBTR1//启动计时器T1
LP3:
MOVA,#55H//装入数据
MOVSBUF,A//发送数据
JNBTI,$//等待发送成功
CLRTI//软件清0
MOVR4,#2
ACALLADELAY//延时一段时间
JNBRI,ERRL//接收超时,转入错误提示
CLRRI//软件清0
MOVA,SBUF//读数据
CJNEA,#55H,ERRL//判断接收到的数据是否与发送的一致,不一致则跳转至错误提示
AJMPMAIN3//若结果正确,则跳转至AD检测
ERRL:
MOVDPTR,#ERR//LED显示表表头,以下用于显示错误信息
MOVP2,#0
MOVA,#0
MOVCA,@A+DPTR
MOVP0,A
SETBP2.0
MOVR4,#5
ACALLADELAY//延时一段时间
CLRP2.0
MOVA,#1
MOVCA,@A+DPTR
MOVP0,A
SETBP2.1
MOVR4,#5
ACALLADELAY//延时一段时间
CLRP2.1
MOVA,#2
MOVCA,@A+DPTR
MOVP0,A
SETBP2.2
MOVR4,#5
ACALLADELAY//延时一段时间
CLRP2.2
MOVA,#3
MOVCA,@A+DPTR
MOVP0,A
SETBP2.3
MOVR4,#5
ACALLADELAY//延时一段时间
CLRP2.3
AJMPLP3
/****************************************************
AD自检
****************************************************/
MAIN3:
MOVTMOD,#11H//设置定时器工作方式
MOVTCON,#05H//设置为边沿触发
MOVIE,#8DH//开启计时器1、外部中断0、外部中断1的中断
MOVP3,#0FH
SETBRS0
USING1
MOVR0,#0
USING0
MOVDPTR,#TAB//LED显示表表头
MOVR1,#0//50Ms循环计数初始化,累积两次为100ms
CLRTR0//停止计时器工作
MOVTH0,#4CH//50ms定时的初值
MOVTL0,#00H
SETBTR0//启动定时器0
MOVP2,#0
/****************************************************
若没有到达100ms,则显示采样值。
****************************************************/
MAIN4:
JBCTF0,ADC
LED:
CLRP2.3//关闭第三个LED数码管端口
MOVA,R5//读百位
MOVCA,@A+DPTR//读出LED数码显示
MOVP0,A//显示
SETBP2.1//打开第一个LED数码管端口
ACALLDALAY//延时
CLRP2.1//关闭第一个LED数码管端口
MOVA,R6//读十位
MOVCA,@A+DPTR
MOVP0,A
SETBP2.2
ACALLDALAY
CLRP2.2
MOVA,R7//读个位
MOVCA,@A+DPTR
MOVP0,A
SETBP2.3
ACALLDALAY
AJMPMAIN4
/****************************************************
检测是否100ms到达,若是则调用AD采样,并转换为BCD码
****************************************************/
ADC:
MOVTH0,#4CH//重新装人计数值
MOVTL0,#00H
INCR1//50ms循环计数+1
CJNER1,#2,LED//50ms是否已经两次?
MOVR1,#0//以下用于BCD码转换
ACALLADP
MOVA,R2
MOVB,#100
DIVAB
MOVR5,A
MOVA,B
MOVB,#10
DIVAB
MOVR6,A
MOVR7,B
AJMPLED
/****************************************************
TLC549AD转换子函数
端口:
P1.2:
CLKP1.3:
DATAOUTP1.4:
CS
****************************************************/
ADP:
CLRP1.4//CS置低,启动数据传输
MOVR0,#00//循环次数初始化
NOP//延时等待确认CS变化
NOP
NXT:
SETBP1.2//置CLK高
MOVC,P1.3//读取DATAOUT的一位数据
RLCA//装入A累加器暂存,并右移
CLRP1.2//置CLK低
INCR0//循环计数+1
CJNER0,#8,NXT//一个字节的数据需要循环读取8次位数据
SETBP1.4//CS置高,进行下一次采样
MOVR2,A//存储采样值
RET
/****************************************************
延时10ms子函数
****************************************************/
DALAY:
MOVR4,#20//延时10ms
ADELAY:
MOVR3,#250
DJNZR3,$
DJNZR4,ADELAY
RET
/****************************************************
外部中断0
****************************************************/
OINT0:
NOP
/****************************************************
外部中断0
****************************************************/
OINT1:
//ACALLDALAY//延时消抖
MOVA,P3
CJNEA,#0FH,LP4
AJMPLP5
LP4:
MOVTH1,#4CH//50ms定时的初值
MOVTL1,#00H
SETBTR1//启动定时器0
SETBP2.5//发声
LP5:
RETI
/****************************************************
计时器1中断
****************************************************/
TINT1:
USING1
INCR0
CJNER0,#10,LP6
CLRTR1
CLRP2.5
LP6:
MOVTH1,#4CH//50ms定时的初值
MOVTL1,#00H
USING0
RETI
/****************************************************
数码管显示表
****************************************************/
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
ERR:
DB86H,0AFH,0AFH,0F9H
END
自检
#include
#include
sbitP33=P3^3;
sbitP32=P3^2;
sbitP20=P2^0;
sbitP21=P2^1;
sbitP22=P2^2;
sbitP23=P2^3;
sbitP25=P2^5;
sbitCLK=P1^2;
sbitD0=P1^3;
sbitCS=P1^4;
chara,c,d,f;
charg=20;
inth=0;
unsignedintb,e;
unsignedchartable[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98,0x86,0xAF,0xAF,0xF9};
/***子函数****/
voiddelay(unsignedinttime)
{
unsignedintj=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
voidxianshi(x)
{
P0=table[x/1000%10];
P20=1;
delay(3);
P20=0;
P0=table[x/100%10];
P21=1;
delay(3);
P21=0;
P0=table[x/10%10];
P22=1;
delay(3);
P22=0;
P0=table[x%10];
P23=1;
delay(3);
P23=0;
}
charjianpan()
{
P3=0x0F;
if(P32==0||P33==0)
delay(20);
if(P32==0||P33==0)
{
return1;
}
return0;
}
unsignedchartlc549()
{
unsignedchary,i;
D0=1;
CS=1;
CLK=1;
CS=0;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
y<<=1;
if(D0==1)y=y|0x01;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
for(i=10;i>0;i--);
CS=1;returny;
}
自检
voidxianshiad(x)
{
P0=table[x/100%10];
P20=1;
delay(5);
P20=0;
P0=table[x/10%10];
P21=1;
delay(5);
P21=0;
P0=table[x%10];
P22=1;
delay(5);
P22=0;
}
/*****主函数*******/
voidmain()
{
/****流水灯********/
P2=0x10;
P0=0xFE;
for(a=8;a>0;a--)
{
delay(500);
P0=_crol_(P0,1);
}
/******数码管*******/
b=0;
c=1;
d=0;
P0=0x00;
P2=0x00;
TMOD=0x01;
TH0=(55536/256);
TL0=(55536%256);
EA=1;
ET0=1;
TR0=1;
while(c)
{
xianshi(b);
}
/*******串口*********/
d=0;
f=1;
TR0=0;
TH0=(55536/256);
TL0=(55536%256);
TMOD=0x21;
TH1=0xF3;
TL1=0xF3;
TR1=1;
SCON=0x50;
PCON=0x00;
SBUF=255;
delay(1000);
e=SBUF;
if(e==255)
{
TR0=1;
while(f)
{
xianshi(e);
}
}
else
{
TR0=1;
while(f)
{
P0=table[10];
P20=1;
delay(3);
P20=0;
P0=table[11];
P21=1;
delay(3);
P21=0;
P0=table[12];
P22=1;
delay(3);
P22=0;
自检
P0=table[13];
P23=1;
delay(3);
P23=0;
}
}
/********ad***********/
EX0=1;
EX1=1;
P2=0x00;
ET0=0;
TMOD=0x01;//T0定时方式1
TH0=(55536/256);TL0=(55536%256);
EA=1;
ET0=1;
TR0=1;
tlc549();
delay(10);while
(1)
{
xianshiad(h);
}
}
/****中断函数******/
voidtime0()interrupt1
{
if(c)
{
d++;
if(d==50)
{
d=0;
b=b+1111;
}
if(b==11110)
c=0;
}
if(!
c)
{
d++;
if(d==100)
{
f=0;
}
}
if(!
f)
{
g--;
if(g==0)
{
g=20;
h=tlc549();
_nop_();
_nop_();
_nop_();
}
}
TH0=(55536/256);
TL0=(55536%256);
if(jianpan())
{
if(jianpan())
{
P25=1;
delay(500);
P25=0;
}
}
}
voidwai0()interrupt0
{
if(jianpan())
{
if(jianpan())
{
P25=1;
delay(500);
P25=0;
}
}
}
自检
voidwai1()interrupt2
{
if(jianpan())
{
if(jianpan())
{
P25=1;
delay(500);
P25=0;
}
}
}