单片机测试程序文档格式.docx
《单片机测试程序文档格式.docx》由会员分享,可在线阅读,更多相关《单片机测试程序文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
⑶实现效果逐个闪烁,逐个消隐,键盘控制改变数据并移动,与预期相同,工作状态正常。
﹑再利用单片机内部时钟中断,编写数码管时钟程序,使数码管能够实现计时功能,键盘能够控制时分秒。
系统综合功能设计
综合单片机开发板上的各个功能模块,以实现一个完整的系统功能:
⑴根据前面对各模块功能的理解和程序编写,结合各个模块实现一个整体系统,把各模块功能综合起来。
⑵设计一综合系统,使数码管实现数字钟且可右移﹑闪烁,液晶屏实现时间、日期的显示且可移屏,键盘能够控制系统,蜂鸣器与键盘且可整点报时,可实现串口通信功能。
鸣器调试程序
本程序根据蜂鸣器与单片机口相连设计,可以验证单片机及下载功能的正确.
#include<
>
sbitbuz=P3^3;
unsignedcharflag;
voiddelayms(unsignedcharms)
/*延时子程序*/
{
unsignedchari;
while(ms--)
{
for(i=0;
i<
120;
i++);
}
}
/*主程序*/
main()
{
TMOD=0x01;
flag=0x00;
TH0=0x00;
TL0=0xff;
TR0=1;
IE=0x82;
while
(1)
flag++;
delayms
(1);
/*中断控制*/
voidtimer0()interrupt1using1
TH0=0xfe;
TL0=frq;
buz=~buz;
串口通信调试程序(单片机到PC机)
此为串口通信程序,可在电脑上的超级终端显示相关语句,实现单片机与电脑的相互通信。
遇到的问题:
在进行单片机传信息到电脑终端时,可是利用宏文件,直接调用printf.但是在实际的运用中占用大量的空间资源,而且容易出现错误,让程序的工作不正常,因此我们改用字节的传送,利用串口一个字节一个字节的传送,这样就大大增加了程序的可读性。
/*specialfunctionregisterdeclarations*/
/*fortheintended8051derivative*/
/*prototypedeclarationsforI/Ofunctions*/
#ifdefMONITOR51/*DebuggingwithMonitor-51needs*/
charcodereserve[3]_at_0x23;
/*spaceforserialinterruptif*/
#endif/*StopExectionwithSerialIntr.isenabled*/
/*------------------------------------------------
ThemainCfunction.Programexecutionstarts
hereafterstackinitialization.
------------------------------------------------*/
voidmain(void){
Setuptheserialportfor1200baudat12MHz.
#ifndefMONITOR51
SCON=0x50;
/*SCON:
mode1,8-bitUART,enablercvr*/
TMOD|=0x20;
/*TMOD:
timer1,mode2,8-bitreload*/
TH1=0xe6;
/*TH1:
reloadvaluefor1200baud@12MHz*/
TR1=1;
/*TR1:
timer1run*/
TI=1;
/*TI:
setTItosendfirstcharofUART*/
#endif
Notethatanembeddedprogramneverexits(because
thereisnooperatingsystemtoreturnto).It
mustloopandexecuteforever.
while
(1){
printf("
liujinglong\n"
);
/*Print"
liujinglong"
*/
串口通信调试程序(PC机到单片机)
#include<
#defineucharunsignedchar
#defineuintunsignedint
UchardataReceiveBuffer[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//设置16字节的串行通信接收缓冲区
uchardataBufferPointer=0;
//串行通信接收缓冲区指针,初始为0
bitdataOnReceive=0;
//串行通信接收事件标志位
voidSend(uchardatadat);
/*以下为串行通信接收中断处理函数*/
voidserialport(void)interrupt4using2
{
uchardatac,i;
if(RI)
{
c=SBUF;
//读取接收到的数据
if(BufferPointer<
16)
{
ReceiveBuffer[BufferPointer]=c;
//将接收到的数据存入接收缓冲区
BufferPointer++;
}
else
for(i=0;
i<
15;
i++)
{
ReceiveBuffer[i]=ReceiveBuffer[i+1];
//将缓冲区数据左移
}
ReceiveBuffer[15]=c;
RI=0;
//清空接收标志
Send(c);
//发送接收到的数据,以便回显
OnReceive=1;
//接收事标志位置1
}
/*以下为串口初始化函数*/
voidInitserialport(void)
TMOD=0x20;
SCON=0x50;
reloadvaluefor1200baud@16MHz*/
ES=1;
//允许串口中断
EA=1;
/*TR1:
timer1run*/
voidSend(uchardatadat)
SBUF=dat;
while(TI==0);
TI=0;
voidmain(void)//主函数
uchardatai;
LcdReset();
//初始化LCD
Initserialport();
//初始化串口
DisplayListChar(0,0,"
ReceiveData:
"
13);
if(OnReceive)
16;
i++)//接收显示
DispOneChar(i,1,ReceiveBuffer[i]);
OnReceive=0;
液晶移屏显示程序
实现LCD1602的基本显示功能,以及使其能够实现移屏功能。
ucharcodedispcode1[]={"
happynewyear!
!
};
ucharcodedispcode2[]={"
thankseveryday!
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
voiddelay(uintt)
uintk,l;
for(k=t;
k>
0;
k--)
for(l=0;
l<
=10;
l++);
voidwcom()
RS=0;
RW=0;
E=0;
delay(1000);
E=1;
voidwdata()
RS=1;
voidinit()//初始化子程序
//uinti;
//for(i=0;
20;
P0=0x38;
wcom();
//指令码设置16×
2显示,8位数据接口
P0=0x0c;
//开显示,不显示光标,不闪烁光标
P0=0x06;
//读或写一个字符后地址累加器加一,光标加一
P0=0x01;
//清屏
voidmain()//主函数显示
uchari;
init();
P0=0x80;
wcom();
for(i=0;
=15;
P0=dispcode1[i];
wdata();
P0=0xC0;
P0=dispcode2[i];
=40;
P0=0x1c;
delay(100);
ZLG7289控制键盘及数码管显示程序
本程序根据ZLG7289芯片资料,来实现其对数码管和键盘的控制。
首先在数码管上显示0-7八位数,然后循环左右各移八次,再分别左移右移各两次,而后实现闪烁﹑消隐功能,再是按键时可以在数码管显示按键值,如没有按键则显示时钟,而且可用键盘对时钟的时分秒进行校对。
/*端口定义*/
sbitCS=P1^0;
sbitCLK=P1^1;
sbitDIO=P1^2;
sbitKEY=P3^2;
//需要在INT区把KEY用跳线冒跳到INT0,其余四个跳到VCC
//这样,P3^2就相当于直接连接到key
bdataucharcom_data;
//定义8位数据data
sbitmos_bit=com_data^7;
sbitlow_bit=com_data^0;
/*变量定义*/
ucharhalf_hign;
ucharhalf_low;
ucharsl,sh,ml,mh,hh,hl;
ucharsecond=0;
ucharminute=0;
ucharhour=12;
uints_cnt,key;
voiddelay_8us()
for(i=0;
i<
1;
i++){;
voiddelay_50us()
6;
voiddelay_50ms()
uchari,j;
for(j=0;
j<
50;
j++)
125;
i++){;
voiddelay_1s()
uchari=20;
while(i--)
delay_50ms();
voiddelay_2s()
uchari=40;
voiddelay_5s()
uchari=100;
/*发送单字节指令*/
voidsend(ucharsebuf)
com_data=sebuf;
CLK=0;
CS=0;
delay_50us();
8;
delay_8us();
DIO=mos_bit;
CLK=1;
com_data=com_data<
<
CLK=0;
DIO=0;
/*接收数据*/
ucharreceive(void)
uchari,rebuf;
CLK=1;
low_bit=DIO;
rebuf=com_data;
DIO=1;
CS=1;
returnrebuf;
/*复位*/
voidreset(void)
DIO=1;
delay_50ms();
send(0xa4);
/*7289数码管显示,addr为显示位置范围0~7,dat为现实内容*/
voiddisplay(ucharaddr,uchardat)
if(addr<
0||addr>
7)
return;
send(0xc8+addr);
send(dat);
/*功能:
执行ZLG7289纯指令参数:
cmd:
命令字*/
voidZLG(uchart)
CS=0;
send(t);
CS=1;
/*发送双字节命令*/
voidsendcommand(ucharaddr,uchardat)
send(addr);
/*获取键盘的位置码*/
uchargetkeycode(uchardat)
ucharkey;
switch(dat)
case0x00:
key=0x00;
break;
case0x01:
key=0x01;
case0x02:
key=0x02;
case0x03:
key=0x03;
case0x04:
key=0x04;
case0x05:
key=0x05;
case0x06:
key=0x06;
case0x07:
key=0x07;
case0x08:
key=0x08;
case0x09:
key=0x09;
case0x0a:
key=0x10;
case0x0b:
key=0x11;
case0x0c:
key=0x12;
case0x0d:
key=0x13;
case0x0e:
key=0x14;
case0x0f:
key=0x15;
default:
key=0xee;
returnkey;
/*7289按键指令*/
ZLG7289_Key()
ucharkey,dat;
send(0x15);
delay_50us();
dat=receive();
key=getkeycode(dat);
/*按键设定时分加一*/
voidSet_time(void)//设定时间
{if(key==0x00)//按键0,控制时
if(key==0x00)
hour++;
if(hour==24)
hour=0;
}
hl=hour%10;
hh=hour/10;
if(key==0x01)//按键1,控制分
if(key==0x01)
minute++;
if(minute==60)
minute=0;
ml=minute%10;
mh=minute/10;
if(key==0x02)//按键2,控制秒
if(key==0x02)
second++;
if(second==60)
second=0;
sl=second%10;
sh=second/10;
hh=hour/10;
ml=minute%10;
sh=second/10;
sl=second%10;
}
/*定时器中断初始化*/
voidInit(void)//初始化子程序
IP=0x02;
EX0=1;
TMOD=0x02;
//
TH0=0x06;
TL0=0x06;
ET0=1;
TR0=1;
voidservice_int0()interrupt0
EX0=0;
TR0=0;
key=ZLG7289_Key();
Set_time();
delay_1s();
voidtime0()interrupt1
s_cnt++;
if(s_cnt==400)//1s
s_cnt=0