1、图2 ADC0831与单片机的接口电路图 图3 232与单片机的接口电路图(2)总体框架图(3)总流程图 四 注源程序清单(每条指令都要加释,说明其功能,入口参数,返回参数)#includeabsacc.h#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define SendAddr 0xa0 /本机地址#define TAAddr 0xb0#define COAddr 0xc0#define Send_data_buff_num 20/发送和接收缓冲区的/uchar idata h
2、;uchar idata Send_data_buffSend_data_buff_num=0;uchar idata Flag_SBUF0=0; /通讯标志位。1-通讯完成;0-无通讯信息。#define SBUF0Delay 2000sbit P0831CS=P33 ;sbit P0831CLK=P34 ;sbit P0831data=P35 ;#define P0831_Bit_Num_U8 8uchar Read0831() uchar idata m,TempData; P0831CS=0; P0831CLK=1; P0831CLK=0; for(TempData=0,m=0;mP0
3、831_Bit_Num_U8;m+) TempData0)&(RI!=1);m-) ;Send_data(uchar Saddr,uchar data_type,uchar data_num,char aver) uchar idata m,n,myCrc; SBUF=Saddr; while(TI!TI=0; /发送地址 TB8=0; SBUF=TAAddr; while(TI! SBUF=COAddr; SBUF=data_type; while(TI! /发送数据类型 SBUF=data_num; /发送数据长度 for(n=0,m=0;data_num; n+=Send_data_bu
4、ffm; Send_data_buffm=aver; /Send_data_buffm=0x0a; SBUF=Send_data_buffm;while(TI! /发送数据 myCrc=n; SBUF=myCrc; /发送校验void INT_SBUF0() interrupt 4 using 3 uchar idata SbufAddr,SbufType,SbufNum,SbufCrc,m,MyCrc; if(RI=1) RI=0;EA=0;m=0;MyCrc=0; SbufAddr = SBUF; /接收地址 for(;SbufAddr = SendAddr;) /判断是否为我的地址 SM
5、2 = 0; MyCrc += SbufAddr; /计算当前效验和 wait_RI(SBUF0Delay); /等待数据类型 if(RI=0) break; /误中断 RI=0; SbufType = SBUF; /接收数据类型 MyCrc += SbufType; /等待数据长度 SbufNum = SBUF; /接收数据长度 MyCrc += SbufNum; /计算当前效验和 for(m=0;SbufNum; wait_RI(SBUF0Delay); /等待新数据 if(RI=0) break; /误中断 RI=0; Send_data_buffm = SBUF; /接收新数据 MyC
6、rc += Send_data_buffm; /计算当前效验和 if(m != SbufNum) break; /等待效验和 SbufCrc = SBUF; /接收效验和 if(MyCrc != SbufCrc) break; /效验和错误 Flag_SBUF0 = 1; /中断标志 break; TI=0;RI=0;SM2=1;EA=1; /恢复标志位uchar average(uchar idata P0831data10) uchar idata i,max,min; uint total; max = P0831data0; min = max; for(total=0,i=0;ima
7、x) max = P0831datai; if(P0831datai1;i-) if (P0831datai=P0831datai-1) j=P0831datai-1; P0831datai-1=P0831datai; P0831datai=j; for(h=1;h8;h+) n+=P0831datah; n=n/8; return n ;*/main() uchar idata p,P0831data10,SendType,SendNum; char aver; SendType=0x0d; SendNum=1;) for(p=0;pp+) P0831datap=Read0831(); /S
8、BUF=P0831datap; /发送地址 aver=average(P0831data); init_timer_sbuf(); Send_data(SendAddr,SendType,SendNum,aver);四. 系统调试过程中出现的主要问题系统调式过程中主要有以下问题:1.硬件问题:(1)检查电源与地的连接情况。(2)单片机功能测试,用+1程序测试单片机是否能正常工作。 (3)ADC0831是否正常。2.软件问题:各个程序之间是否正常调用,程序时序等问题。五. 系统运行报告与结论1.系统特点:结构简单明了,通过软件与硬件的结合使单片机与其他器件配合实现不同的功能,有助于对单片机更好的
9、了解。2.存在问题:本系统为最基础的系统还需要不断的升级,实现更多功能。六. 总结1、设计中遇到的问题及解决过程(1) 硬件问题:系统原来设计是 ADC0831的片选端直接接地,但是实际不应接地,而是要通过程序的控制来进行对ADC0831的选择。把/CS端接到单片机的P3.3上。去掉C2,C42个电容(否则ADC0831采集不出数)。将ADC0831的VIN-端接地(采用共模形式),将VIN+与R2连接(用R2进行对ADC0831的输入)。(2) 软件问题:注意对变量数据类型的选定(即uchar与uint的范围 ),程序调用顺序和延时程序的运用。2、设计中产生的错误及原因分析(1)由于对uchar和uint数据类型范围的忽略,导致程序不能运行。(2)没有在采集后进行延时,导致采数不准确,显示不稳定。(3)调用子程序的顺序不正确,导致运行不正常。3、设计体会和收获。通过本次实验,我更好的掌握的89C51单片机的原理结构和编程方法,以及单片机与其他器件的连接和控制。同时也知道自己在系统设计上的一些不足之处和努力方向。七. 参考书目1. 马忠梅,单片机的c语言应用程序设计, 北京航空航天大学出版社2. 王福瑞,单片微机测控系统设计大全, 北京航空航天大学出版社