基于单片机报警器程序文档格式.docx
《基于单片机报警器程序文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机报警器程序文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
![基于单片机报警器程序文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/28/514fd355-5e07-445f-a6f4-66abb6586d52/514fd355-5e07-445f-a6f4-66abb6586d521.gif)
//转换结束
sbitCLK=P3^6;
//AD始终模拟
bitRecdat;
codeunsignedcharledcod[]={0x7e,0x12,0xbc,0xb6,0xd2,0xE6,0xee,0x32,0xfe,0xf6};
codeunsignedcharledcod1[]={0x7f,0x13,0xbd,0xb7,0xd3,0xE7,0xef,0x33,0xff,0xf7};
//带小数点的字形码
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer0(void)
{
TMOD|=0x02;
TH0=0xd1;
TL0=0xd1;
//定时0.05ms
EA=1;
ET0=1;
TR0=1;
}
/*------------------------------------------------
串口初始化子程序
voidInitCom(void)//初始化串口
SCON|=0x50;
//01010000B,工作方式1,8位UART,波特率可变,允许接收
TMOD|=0x20;
//T1工作于方式2自动重装
TCON|=0x40;
//定时器1开始计数TR1=1
TH1=250;
//T1计数初值波特率为4800
TL1=250;
RI=0;
TI=0;
//清发送接收标志
ES=1;
//开串口
}
/*--------------------------------------------------
显示子程序
---------------------------------------------------*/
voiddisplay(unsignedcharnum)
switch(num)
{
case0:
{
ior=foat/10000;
//3
a[0]=ior;
P1=ledcod1[ior];
P0=0x7e;
x++;
}
break;
case1:
ior=(foat-10000*a[0])/1000;
P1=ledcod[ior];
a[1]=ior;
//5
P0=0xfd;
case2:
ior=(foat-10000*a[0]-1000*a[1])/100;
a[2]=ior;
P0=0xfb;
case3:
ior=(foat-10000*a[0]-1000*a[1]-100*a[2])/10;
a[3]=ior;
//1
P0=0xf7;
case4:
ior=foat-10000*a[0]-1000*a[1]-100*a[2]-10*a[3];
//6
a[4]=ior;
P0=0xef;
case5:
P0=0xdf;
default:
}
串口发送
-------------------------------------------------*/
voidComOut(void)//向串口发送数据
{unsignedchari;
for(i=0;
i<
5;
i++)
SBUF=a[i];
//发送数据t
while(!
TI);
//等待发送完成
TI=0;
SBUF=0x0;
/*-----------------------------------------------------
延时函数
------------------------------------------------------*/
voiddelay(unsignedinti)
while(i--);
/********************主函数************************/
main()
Recdat=0;
x=0;
P2=0xff;
//P2口工作于读,所以先写1,阻断内部的cmos
EOC=1;
//
Init_Timer0();
InitCom();
while
(1)
if(i==79)//开始的时候这里没加采样时间(79*0.05=3.94ms),导致始终无法采样到信号
delay(8000);
//为了使数码管的数字让人眼能够分辨。
增加了这个延时
start=0;
start=1;
//AD在上升沿复位,在下降沿开始转换(ST端给出一个至少有100ns宽的正脉冲信号)
delay(8);
//转换时间为20us
if(EOC==1)//查询高电平的到来。
转换完毕AD0809的EOC会输出一个高电平
OE=1;
//打开--将数据发出到单片机的P2口
delay
(2);
foat=P2*196;
OE=0;
//输出数据线呈高阻状态
if(Recdat)
Recdat=0;
ComOut();
/*****************************************************/
定时器中断子程序
voidTimer0_isr(void)interrupt1using2
{
i++;
CLK=~CLK;
//为AD转换提供时钟周期0.05ms20khz
if(i==80)//每0.05ms*50=2.5ms调用一次显示
i=0;
if(x==6)
{x=0;
display(x);
/*---------------------------------------------------
串口中断接收
----------------------------------------------------*/
voidComINT()interrupt4using2//中断接收程序
if(RI)//判断是否接收完,接收完成后,由硬件置RI位
cn=SBUF;
//读入缓冲区
//清标志
Recdat=1;
//有数据,建立标志