单片机自检实验.docx

上传人:b****6 文档编号:7337921 上传时间:2023-01-23 格式:DOCX 页数:17 大小:18.05KB
下载 相关 举报
单片机自检实验.docx_第1页
第1页 / 共17页
单片机自检实验.docx_第2页
第2页 / 共17页
单片机自检实验.docx_第3页
第3页 / 共17页
单片机自检实验.docx_第4页
第4页 / 共17页
单片机自检实验.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

单片机自检实验.docx

《单片机自检实验.docx》由会员分享,可在线阅读,更多相关《单片机自检实验.docx(17页珍藏版)》请在冰豆网上搜索。

单片机自检实验.docx

单片机自检实验

/****************************************************

程序名称:

自检

功能:

自检

作者:

张俊淼

****************************************************/

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;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1