1、单片机测试程序实习步骤本单片机最小系统是以AT89S51单片机为控制核心,由驱动芯片ZLG7289与16键的键盘矩阵实现对两个4位一体共阴数码管LED的驱动显示,由LCD1602实现液晶显示,再通过电平转换芯片MAX232并连接到232接口实现串口通信,系统还包含有蜂鸣器,USB及适配器供电接口,JTAG程序下载接口,总线扩展等。首先,用protel99se软件制作硬件电路原理图及绘制PCB板;其次,安装焊接单片机最小系统开发板及下载线,并且进行电路调试;再次,在Keil uVision2软件环境下调试单片机汇编程序或C语言程序,用单片机下载软件ISPLAY或STC-ISP V31实现程序下载
2、,从而用编程实现最小系统的基本功能;最后,编写综合程序以实现系统功能的综合以及拓展功能,其中串口通信用到电脑自带的超级终端或AccessPort软件。单片机最小系统板焊接首先对照元件清单和电路图,检查器件是否完整,型号规格安装是否正确。然后将各器件根据焊接规则焊接到电路板上,其中对于器件的摆放方向和位置需十分注意。先焊发热器件电阻和较低的电容,再焊较大的器件,焊接JTAG线,JTAG线里面的芯片电阻,电阻电容均为贴片封装,焊接时需小心谨慎,对于各条线引的焊接也需谨慎,按照其对应的顺序进行焊接,焊接结束后,自行组装。检查已经焊好的电路板和JTAG下载线是否无误:先用万用表检查电路板焊接是否都正确
3、。当检查没有短路,断路,虚焊,漏焊等错误后,给电路板供电,看二极管是否亮,是否有器件过热,有可能二极管或三极管会在焊接的过程中被烧坏,那样的话就要重新焊器件。再用Keil软件给板子拷正确的程序,检查是否能按功能正常工作。单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。软件设计在Keil软件环境下对照相关资料编写单片机最小系统开发板的有用程序,使设计好的程序编译无误,得到hex格式文件,用程序下载软件加载到单片机芯片中,实现仿真电路,在板上得出效果。设计工具:电脑,Keil软件,Isplay软件,STC-ISP V31软件蜂鸣器调试主要是检验程序能否下载到芯
4、片,蜂鸣器能正常工作,掌握程序的编译下载到芯片的方法。在Keil环境中用C语言编写简单是蜂鸣器程序或音乐播放程序。对Keil软件和程序下载软件进行相关配置设置。将编译产生的hex文件下载到芯片,检测其工作是否正常,若工作不正常,则从软件及硬件两方面进行检查。 有用的报警声程序见附录4串口通信调试实现计算机与单片机之间相互通讯功能将编写的串口调试程序经过编译,下载到单片机。串口实现功能为在计算机上能显示单片机的输出。检测串口是否能正常工作,此阶段需用到串口软件及串口线。若不能正常工作,则需从软件和硬件两方面进行检查。正确功能为在电脑超级终端不停显示输出内容,与预期相同,工作正常。液晶显示调试保证
5、液晶屏LCD能正常工作,输出效果有所扩展。在编写程序前,认真阅读LCD液晶屏资料,掌握LCD1602及1602液晶模块数据手册(中文)中的液晶的使用和编程方法,了解其工作时序,及各个指令及初始化。对照电路图中LCD连接情况,编写LCD1602移动显示程序,经编译下载至单片机,检测输出,若无输出,则调整电位器,若仍无输出则从软件及硬件两方面进行检查,找出错误原因,直至液晶屏能正常工作。在程序编写时应时刻注意各个指令间的延时控制。以保证液晶屏呈现效果移动循环显示,液晶屏工作正常。之后也可用LCD做数字钟,这将在综合程序里被用到,液晶移屏显示程序见附录6数码管及键盘控制调试保证数码管能正常显示,以及
6、按键能控制数码管的显示.在编写程序前,应认真阅读LED和ZLG7289A资料,了解和掌握其工作时序,及各个指令及初始化,在程序编写时应时刻注意各个指令间的延时控制。对照电路图中ZLG7289模块的连接情况,编写程序,经过编译,然后下载到单片机,检测展现效果,是否与程序预期相同。实现效果逐个闪烁,逐个消隐,键盘控制改变数据并移动,与预期相同,工作状态正常。再利用单片机内部时钟中断,编写数码管时钟程序,使数码管能够实现计时功能,键盘能够控制时分秒。系统综合功能设计综合单片机开发板上的各个功能模块,以实现一个完整的系统功能:根据前面对各模块功能的理解和程序编写,结合各个模块实现一个整体系统,把各模块
7、功能综合起来。设计一综合系统,使数码管实现数字钟且可右移闪烁,液晶屏实现时间、日期的显示且可移屏,键盘能够控制系统,蜂鸣器与键盘且可整点报时,可实现串口通信功能。鸣器调试程序 本程序根据蜂鸣器与单片机P3.3口相连设计,可以验证单片机及下载功能的正确.#include #include sbit buz = P33;unsigned char flag; void delayms(unsigned char ms) /*延时子程序*/ unsigned char i; while(ms-) for(i = 0; i 120; i+); /*主程序*/main() TMOD = 0x01; fl
8、ag = 0x00; TH0 = 0x00; TL0 = 0xff; TR0 = 1; IE = 0x82; while(1) flag+; delayms(1); /*中断控制*/void timer0() interrupt 1 using 1 TH0 = 0xfe; TL0 = frq; buz= buz; 串口通信调试程序(单片机到PC机)此为串口通信程序,可在电脑上的超级终端显示相关语句,实现单片机与电脑的相互通信。遇到的问题:在进行单片机传信息到电脑终端时,可是利用宏文件,直接调用printf.但是在实际的运用中占用大量的空间资源,而且容易出现错误,让程序的工作不正常,因此我们改用
9、字节的传送,利用串口一个字节一个字节的传送,这样就大大增加了程序的可读性。#include /* special function register declarations */ /* for the intended 8051 derivative*/#include /* prototype declarations for I/O functions*/#ifdef MONITOR51 /* Debugging with Monitor-51 needs*/char code reserve 3 _at_ 0x23; /* space for serial interrupt if *
10、/#endif /* Stop Exection with Serial Intr. is enabled */*-The main C function. Program execution startshere after stack initialization.-*/void main (void) /*-Setup the serial port for 1200 baud at 12MHz.-*/#ifndef MONITOR51 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TM
11、OD: timer 1, mode 2, 8-bit reload */ TH1 = 0xe6; /* TH1: reload value for 1200 baud 12MHz */ TR1 = 1; /* TR1: timer 1 run*/ TI = 1; /* TI: set TI to send first char of UART*/#endif/*-Note that an embedded program never exits (becausethere is no operating system to return to). Itmust loop and execute
12、 forever.-*/ while (1) printf ( liu jing longn); /* Print liu jing long */ 串口通信调试程序(PC机到单片机)#include#include#include#define uchar unsigned char#define uint unsigned intUchar data ReceiveBuffer16=0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20;/设置16字节的串行通信接收缓冲区uchar da
13、ta BufferPointer=0;/串行通信接收缓冲区指针,初始为0bit data OnReceive=0;/串行通信接收事件标志位void Send(uchar data dat);/*以下为串行通信接收中断处理函数*/void serialport(void) interrupt 4 using 2 uchar data c,i; if(RI) c=SBUF;/读取接收到的数据 if(BufferPointer16) ReceiveBufferBufferPointer=c;/将接收到的数据存入接收缓冲区 BufferPointer+; else for(i=0;i15;i+) Re
14、ceiveBufferi=ReceiveBufferi+1;/将缓冲区数据左移 ReceiveBuffer15=c;/将接收到的数据存入接收缓冲区 RI=0;/清空接收标志 Send(c);/发送接收到的数据,以便回显 OnReceive=1;/接收事标志位置1 /*以下为串口初始化函数*/void Initserialport(void) TMOD=0x20; SCON=0x50; TH1 = 0xe6; /* TH1: reload value for 1200 baud 16MHz */ ES=1; /允许串口中断 EA=1; TR1 = 1; /* TR1: timer 1 run *
15、/void Send(uchar data dat) SBUF=dat; while(TI=0); TI=0;void main(void) /主函数 uchar data i; LcdReset();/初始化LCD Initserialport();/初始化串口 DisplayListChar(0,0,Receive Data:,13); while(1) if(OnReceive) for(i=0;i16;i+) /接收显示 DispOneChar(i,1,ReceiveBufferi); OnReceive=0; 液晶移屏显示程序实现LCD1602的基本显示功能,以及使其能够实现移屏功能
16、。#include #define uchar unsigned char#define uint unsigned intuchar code dispcode1=happy new year!;uchar code dispcode2=thanks everyday!;sbit RS=P20;sbit RW=P21;sbit E=P22;void delay(uint t) uint k,l; for(k=t;k0;k-) for(l=0;l=10;l+); void wcom() RS=0;RW=0;E=0;delay(1000);E=1;void wdata() RS=1;RW=0;E
17、=0;delay(1000);E=1;void init() /初始化子程序/ uint i;/ for(i=0;i20;i+) P0=0x38;wcom(); /指令码设置162显示,8位数据接口 P0=0x0c;wcom(); /开显示,不显示光标,不闪烁光标 P0=0x06;wcom(); /读或写一个字符后地址累加器加一,光标加一 P0=0x01;wcom(); /清屏void main() /主函数显示 uchar i; init(); P0=0x80; wcom(); for(i=0;i=15;i+) P0=dispcode1i; wdata(); P0=0xC0; wcom();
18、 for(i=0;i=15;i+) P0=dispcode2i; wdata(); for(i=0;i=40;i+) P0=0x1c; wcom(); delay(100); ZLG7289控制键盘及数码管显示程序本程序根据ZLG7289芯片资料,来实现其对数码管和键盘的控制。首先在数码管上显示0-7八位数,然后循环左右各移八次,再分别左移右移各两次,而后实现闪烁消隐功能,再是按键时可以在数码管显示按键值,如没有按键则显示时钟,而且可用键盘对时钟的时分秒进行校对。#include #include #include #define uchar unsigned char#define uint
19、 unsigned int/*端口定义*/sbit CS=P10;sbit CLK=P11;sbit DIO=P12;sbit KEY=P32; /需要在INT区把KEY用跳线冒跳到INT0,其余四个跳到VCC/这样,P32就相当于直接连接到keybdata uchar com_data; /定义8位数据datasbit mos_bit=com_data7;sbit low_bit=com_data0;/*变量定义*/uchar half_hign;uchar half_low;uchar sl,sh,ml,mh,hh,hl;uchar second=0;uchar minute=0;ucha
20、r hour=12;uint s_cnt,key;/*延时子程序*/void delay_8us() uchar i; for (i=0; i1; i+);void delay_50us() uchar i; for (i=0; i6; i+);void delay_50ms() uchar i,j; for(j=0;j50;j+) for(i=0;i125;i+);void delay_1s() uchar i = 20; while(i-) delay_50ms();void delay_2s() uchar i = 40; while(i-) delay_50ms();void dela
21、y_5s() uchar i = 100; while(i-) delay_50ms();/*发送单字节指令*/void send(uchar sebuf) uchar i; com_data=sebuf; CLK=0; CS=0; delay_50us(); for(i=0;i8;i+) delay_8us(); DIO=mos_bit; CLK=1; delay_8us(); com_data=com_data1; CLK=0; DIO=0;/*接收数据*/uchar receive(void) uchar i,rebuf; CLK=1; delay_50us(); for(i=0;i8;
22、i+) com_data=com_data1; low_bit=DIO; CLK=1; delay_8us(); CLK=0; delay_8us(); rebuf=com_data; DIO =1; CS=1; return rebuf;/*复位*/void reset(void) DIO=1; delay_50ms(); send(0xa4); CS=1;/*7289数码管显示,addr为显示位置 范围07,dat为现实内容*/void display(uchar addr,uchar dat) if(addr7) return; send(0xc8 + addr); delay_50us
23、(); send(dat); CS=1;/*功能:执行ZLG7289纯指令参数:cmd:命令字*/void ZLG(uchar t) CS = 0; delay_50us(); send(t); CS = 1; delay_50us();/*发送双字节命令*/void sendcommand(uchar addr,uchar dat) send(addr); delay_50us(); send(dat); CS=1;/*获取键盘的位置码*/uchar getkeycode(uchar dat) uchar key; switch(dat) case 0x00: key = 0x00;brea
24、k; case 0x01: key = 0x01;break; case 0x02: key = 0x02;break; case 0x03: key = 0x03;break; case 0x04: key = 0x04;break; case 0x05: key = 0x05;break; case 0x06: key = 0x06;break; case 0x07: key = 0x07;break; case 0x08: key = 0x08;break; case 0x09: key = 0x09;break; case 0x0a: key = 0x10;break; case 0x
25、0b: key = 0x11;break; case 0x0c: key = 0x12;break; case 0x0d: key = 0x13;break; case 0x0e: key = 0x14;break; case 0x0f: key = 0x15;break; default: key = 0xee;break; return key;/*7289按键指令*/ZLG7289_Key() uchar key,dat; send(0x15); delay_50us(); dat = receive(); delay_50us(); key = getkeycode(dat);/*按键
26、设定时分加一*/void Set_time(void) /设定时间 if(key=0x00) /按键0,控制时 delay_50ms(); if(key=0x00) hour+; if(hour=24) hour=0; hl=hour%10; hh=hour/10; if(key=0x01) /按键1,控制分 delay_50ms(); if(key=0x01) minute+; if(minute=60) minute=0; ml=minute%10; mh=minute/10; if(key=0x02) /按键2,控制秒 delay_50ms(); if(key=0x02) second+
27、; if(second=60) second=0; sl=second%10; sh=second/10; hh=hour/10; hl=hour%10; mh=minute/10;ml=minute%10; sh=second/10;sl=second%10; /*定时器中断初始化*/void Init(void) /初始化子程序 IP=0x02; EX0=1; TMOD=0x02; /0.25ms TH0=0x06; TL0=0x06; EA=1; ET0=1; TR0=1; /*中断控制*/void service_int0() interrupt 0 EX0=0; TR0=0; key= ZLG7289_Key(); Set_time(); delay_1s(); EX0=1; TR0=1; /*中断控
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1