《单片机测试程序.doc》由会员分享,可在线阅读,更多相关《单片机测试程序.doc(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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串口通信调试实现计算机与单片机之间相互通讯功能将编写的串口调试程序经过编译,下载到单片机。串口实现功能为在计算机上能显示单片机的输出。检测串口是否能正常工作,此阶段需用到串口软件与串口线。若不能正常工作,则需从软件和硬件两方面进行检查。正确功能为在电脑超级终端不停显示输出内容,与预期一样,工作正常。液晶显示调试保证液晶屏LCD能正
5、常工作,输出效果有所扩展。在编写程序前,认真阅读LCD液晶屏资料,掌握LCD1602与1602液晶模块数据手册(中文)中的液晶的使用和编程方法,了解其工作时序,与各个指令与初始化。对照电路图中LCD连接情况,编写LCD1602移动显示程序,经编译下载至单片机,检测输出,若无输出,则调整电位器,若仍无输出则从软件与硬件两方面进行检查,找出错误原因,直至液晶屏能正常工作。在程序编写时应时刻注意各个指令间的延时控制。以保证液晶屏呈现效果移动循环显示,液晶屏工作正常。之后也可用LCD做数字钟,这将在综合程序里被用到,液晶移屏显示程序见附录6数码管与键盘控制调试保证数码管能正常显示,以与按键能控制数码管
6、的显示.在编写程序前,应认真阅读LED和ZLG7289A资料,了解和掌握其工作时序,与各个指令与初始化,在程序编写时应时刻注意各个指令间的延时控制。对照电路图中ZLG7289模块的连接情况,编写程序,经过编译,然后下载到单片机,检测展现效果,是否与程序预期一样。实现效果逐个闪烁,逐个消隐,键盘控制改变数据并移动,与预期一样,工作状态正常。再利用单片机内部时钟中断,编写数码管时钟程序,使数码管能够实现计时功能,键盘能够控制时分秒。系统综合功能设计综合单片机开发板上的各个功能模块,以实现一个完整的系统功能:根据前面对各模块功能的理解和程序编写,结合各个模块实现一个整体系统,把各模块功能综合起来。设
7、计一综合系统,使数码管实现数字钟且可右移闪烁,液晶屏实现时间、日期的显示且可移屏,键盘能够控制系统,蜂鸣器与键盘且可整点报时,可实现串口通信功能。鸣器调试程序本程序根据蜂鸣器与单片机P3.3口相连设计,可以验证单片机与下载功能的正确.#include #include sbitbuz = P33;unsigned char flag;void delayms(unsigned char ms)/*延时子程序*/unsigned char i;while(ms-)for(i = 0; i 120; i+);/*主程序*/main()TMOD = 0x01;flag = 0x00;TH0 = 0x
8、00;TL0 = 0xff;TR0 = 1;IE = 0x82;while(1)flag+;delayms(1);/*中断控制*/void timer0() interrupt 1 using 1TH0 = 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 */#endif /* Stop Exection with
10、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; /* TMOD: timer 1, mode 2, 8-bit rel
11、oad */ 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 forever.-*/ while (1) printf
12、( 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 data BufferPointer=0;/串行通信接收缓冲区指
13、针,初始为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+) ReceiveBufferi=ReceiveBufferi+1;/将缓冲
14、区数据左移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 */void Send(uchar data dat) SBUF=dat;while(T
15、I=0);TI=0;void main(void) /主函数 uchar data i;LcdReset();/初始化LCDInitserialport();/初始化串口DisplayListChar(0,0,Receive Data:,13);while(1)if(OnReceive) for(i=0;i16;i+) /接收显示 DispOneChar(i,1,ReceiveBufferi);OnReceive=0;液晶移屏显示程序实现LCD1602的基本显示功能,以与使其能够实现移屏功能。#include #define uchar unsigned char#define uint un
16、signed intuchar codedispcode1=happy new year!;uchar codedispcode2=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 w() RS=0;RW=0;E=0;delay(1000);E=1;void wdata() RS=1;RW=0;E=0;delay(1000);E=1;void init() /初始化子程序/ uint i;/ for(i=0;i2
17、0;i+) P0=0x38;w(); /指令码设置162显示,8位数据接口 P0=0x0c;w(); /开显示,不显示光标,不闪烁光标 P0=0x06;w(); /读或写一个字符后地址累加器加一,光标加一 P0=0x01;w(); /清屏void main() /主函数显示 uchar i; init(); P0=0x80; w(); for(i=0;i=15;i+) P0=dispcode1i; wdata(); P0=0xC0; w(); for(i=0;i=15;i+) P0=dispcode2i; wdata(); for(i=0;i=40;i+) P0=0x1c; w(); dela
18、y(100); ZLG7289控制键盘与数码管显示程序本程序根据ZLG7289芯片资料,来实现其对数码管和键盘的控制。首先在数码管上显示0-7八位数,然后循环左右各移八次,再分别左移右移各两次,而后实现闪烁消隐功能,再是按键时可以在数码管显示按键值,如没有按键则显示时钟,而且可用键盘对时钟的时分秒进行校对。#include #include #include #define uchar unsigned char#define uint unsigned int/*端口定义*/sbit CS=P10;sbit CLK=P11;sbit DIO=P12;sbit KEY=P32; /需要在INT
19、区把KEY用跳线冒跳到INT0,其余四个跳到VCC/这样,P32就相当于直接连接到keybdata uchar _data; /定义8位数据datasbit mos_bit=_data7;sbit low_bit=_data0;/*变量定义*/uchar half_hign;uchar half_low;uchar sl,sh,ml,mh,hh,hl;uchar second=0;uchar minute=0;uchar hour=12;uint s_t,key;/*延时子程序*/void delay_8us()uchar i;for (i=0; i1; i+);void delay_50us
20、() 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 delay_5s()uchar i = 100;while(i-)delay_50ms();/*发送单字节指令*/void send(uchar sebuf)uchar i;_data=sebuf;CLK=0;CS
21、=0;delay_50us();for(i=0;i8;i+)delay_8us();DIO=mos_bit;CLK=1;delay_8us();_data=_data1;CLK=0;DIO=0;/*接收数据*/uchar receive(void)uchar i,rebuf;CLK=1;delay_50us();for(i=0;i8;i+)_data=_data1;low_bit=DIO;CLK=1;delay_8us();CLK=0;delay_8us();rebuf=_data;DIO =1;CS=1;return rebuf;/*复位*/void reset(void)DIO=1;del
22、ay_50ms();send(0xa4);CS=1;/*7289数码管显示,addr为显示位置X围07,dat为现实内容*/void display(uchar addr,uchar dat)if(addr7)return;send(0xc8 + addr);delay_50us();send(dat); CS=1;/*功能:执行ZLG7289纯指令参数:cmd:命令字*/void ZLG(uchar t)CS = 0;delay_50us();send(t);CS = 1;delay_50us();/*发送双字节命令*/void sendmand(uchar addr,uchar dat)s
23、end(addr);delay_50us();send(dat);CS=1;/*获取键盘的位置码*/uchar getkeycode(uchar dat)uchar key;switch(dat)case 0x00: key = 0x00;break;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 0
24、x07: key = 0x07;break;case 0x08: key = 0x08;break;case 0x09: key = 0x09;break;case 0x0a: key = 0x10;break;case 0x0b: 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按键指令*/ZLG72
25、89_Key()uchar key,dat;send(0x15); delay_50us();dat = receive();delay_50us();key = getkeycode(dat);/*按键设定时分加一*/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(min
26、ute=60) minute=0; ml=minute%10; mh=minute/10; if(key=0x02) /按键2,控制秒 delay_50ms(); if(key=0x02) second+; 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
27、 TH0=0x06; TL0=0x06;EA=1; ET0=1; TR0=1; /*中断控制*/void service_int0() interrupt 0EX0=0;TR0=0;key= ZLG7289_Key();Set_time();delay_1s();EX0=1;TR0=1; /*中断控制*/void time0() interrupt 1 s_t+; if(s_t=400)/1s s_t=0;second+;if(second=60) second=0; minute+; if(minute=60) minute=0; hour+; if(hour=24) hour=0; /*时
28、钟显示*/void Disp_time(void)do hh=hour/10;hl=hour%10; mh=minute/10;ml=minute%10; sh=second/10;sl=second%10; sendmand(0x81,0x0a); /显示“” sendmand(0x86,0x0a); display(3,sl);delay_50ms(); display(2,sh);delay_50ms(); display(0,ml);delay_50ms(); display(7,mh);delay_50ms(); display(5,hl);delay_50ms(); display
29、(4,hh);delay_50ms(); while(1);/*主函数*/main()uchar half_high; uchar half_low;uchar dat,key,n;reset(); send(0xbf);/* 测试指令 */CS=1;delay_5s();sendmand(0x88,0xff); /* 禁止闪烁 */*显示01234567*/display(0,0x04);display(1,0x05);display(2,0x06);display(3,0x07);display(4,0x00);display(5,0x01);display(6,0x02);display
30、(7,0x03);delay_5s();delay_2s();/*循环左移*/for ( n=0; n=7; n+ ) ZLG(0xA3);delay_2s();delay_2s();/*循环右移*/for ( n=0; n=7; n+ )ZLG(0xA2);delay_2s();/*左移2位*/for ( n=0; n=1; n+ )ZLG(0xA1);delay_5s();/*右移2位*/for ( n=0; n=1; n+ ) ZLG(0xA0);delay_5s();/*闪烁控制*/dat = 0xFE;for ( n=0; n8; n+ )/逐位闪烁sendmand(0x88,dat
31、);dat = 1;dat+;/数据0xFE循环左移delay_2s(); sendmand(0x88,0x00);/八位同时闪烁 delay_5s(); delay_5s();sendmand(0x88,0xFF);/停止闪烁delay_5s();/*消隐控制*/dat = 0xFE;for ( n=0; n8; n+ )sendmand(0x98,dat);dat 4;half_low = key & 0x0f;/* 显示键盘的位置码 */display(0,half_high);display(1,half_low);display(2,half_high);display(3,half
32、_low);display(4,half_high);display(5,half_low);display(6,half_high);display(7,half_low);delay_2s();while(!KEY); /当没有键按下后显示时钟 delay_50us(); reset(); delay_50us(); Init(); delay_50ms(); Disp_time(); 系统综合设计程序将LCD,LED,蜂鸣器,串口通信的综合程序。实现了单片机的总体功能。使数码管和液晶第一行显示年月日,并且可是实现整点报和闹钟时间到的刷屏显示,第二行显示由单片机控制的闹钟设定,并且可是显示
33、接收到的由电脑发送的数据。按键分别能对年月日,时分秒进行调整,开启串口通信,转换显示等功能;蜂鸣器在每次按键时都有提示,而且能够实现整点报时功能;串口通信使电脑超级终端。#include #include #include #include #include #include Uchar data ReceiveBuffer16=0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20;/设置16字节的串行通信接收缓冲区uchar data BufferPointer=0;/串行通信接收缓冲区
34、指针,初始为0bit data OnReceive=0; /串行通信接收事件标志位#define uint unsigned int#define uchar unsigned charsbit buz=P33;/蜂鸣器口定义uchar code dispcode1=Date :2010-00-00; /显示字符串uchar code dispcode3= zheng dian bao ;uchar sl,sh,ml,mh,hh,hl,moh,mol,dh,dl;uchar temp,t,s;uint second=0;uint minute=0;uint hour=12;uchar dat,
35、key,k;uint s_t,i;uint year=2010;uint month=0;uint day=0;void riqi();void Init();void Disp_time();void Sendy(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+) ReceiveBufferi=ReceiveBufferi+1;/将缓冲区数据左移ReceiveBuffer15=c;/将接收到的数据存入接收缓冲区RI=0;/