一、课程设计的目的和要求1、目的运用单片机原理及其应用等课程知识,根据题目要求进行进行软件仿真的设计和调试,从而加深对本课程知识的理解,把学过的比较零碎的知识系统化,比较系统的学习开发单片机应用系统的基本步骤和基本方法,使学生应用知识能力、设计能力、调试能力以及报告撰写能力等有一定的提高。2、要求用8051单片机设计数据采集控制系统,基本要求如下:1、可实现8路数据的采集,假设8路信号均为0-5V的电压信号;2、采集数据可通过LCD显示,显示格式为:[通道号]电压值,如[01]:4.5V3、可通过键盘设置采集方式;(单点采集、多路巡测、采集时间间隔)4、具有异常数据声音报警功能:对第一路数据可设置正常数据的上限值和下限值,当采集的数据出现异常,发出报警信号。选做功能:1、异常数据音乐报警2、可输出8路顺序控制信号,设每路顺序控制信号为一位,顺序控制的流程为:二、总体设计图1原理框图分析:选择AT89C52单片机、ADC0809和LCD1602显示器作为主要器件来实现本次设计。图2电路仿真图图3AT89C52单片机部分分析:通过单片机的I/O口来控制AD转换和显示器。因为AT89C52的P0是漏极开路,因此要有排阻接电源,形成弱上拉结构,增强控制能力。图4AD转换部分分析:ADC0808AD转换芯片通过IN口采集模拟量,转换后通过out口输出数字量数据。具体介绍见图5和图6.图5ADC0808引脚图图6ADC0808采集通道选择方式图7LCD1602显示器部分分析:LCD1602详细介绍见图8和图9图8LCD1602引脚功能图9LCD1602引脚功能图10按键部分分析:检测单片机引脚是否为低电平来判断是否按键按下。图11警报部分分析:通过检测IN2口电压来警报,当电压大于上限制或者低于下限值会LED亮和蜂鸣器报警。三、程序设计1、程序框图:2、程序代码:#includereg52.h#includeintrins.h#includestdio.h#defineuintunsignedint#defineucharunsignedcharvoidinit();voidwrite_com(uchar);voidwrite_data(uchar);开始按键扫描显示设定的通道电压k0快速依次显示八通道各电压间隔一定时间显示各通道电压选择要显示的通道对IN2口进行报警控制K1K2K3K4voiddelay(uint);voidwrite_sfm(uchar,uchar);voidread(uinti);voiddisplay(uinti);voidkey();ucharnum,shuju;uinti=0,ii=0,b1,b2,t=3,tt,fre,flag;floatb;ucharcodetable[]=***Welcome!***;ucharcodetable1[]=[00]:0.0v;ucharcodetab[8]={0x00,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0};sbitRW=P1^7;sbitRS=P1^6;sbitEN=P1^5;sbitSTART=P3^6;sbitAD_INT=P3^2;sbitAD_ENA=P3^7;sbitk0=P1^0;sbitk1=P1^1;sbitk2=P1^2;sbitk3=P1^3;sbitk4=P1^4;sbitLED1=P3^5;sbitSPEAK=P3^4;/*****************主程序*****************/voidmain(){init();while(1){key();}}/*****************初始化LCD1602和中断服务*****************/voidinit(){RW=0;//进入写操作write_com(0x38);//显示十六位液晶write_com(0x0c);//打开十六位液晶,不显示光标write_com(0x06);//写下一个数右移以为write_com(0x01);//清屏write_com(0x80);//第一行写for(num=0;num15;num++){write_data(table[num]);//第一行写数据delay(5);}write_com(0x80+0x40);for(num=0;num12;num++)//第二行写数据{write_data(table1[num]);delay(5);}fre=50000;SPEAK=1;TMOD=0x11;TH0=(65536-fre)/256;TL0=(65536-fre)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR1=0;TR0=0;}/*****************中断服务子程序*****************/voidtimer0()interrupt1{TR0=0;TH0=(65536-fre)/256;TL0=(65536-fre)%256;tt++;if(flag40){if(tt==0){tt=0;tt=50000;SPEAK=~SPEAK;}}if(flag=40&&flag80){tt=0;fre=50000;SPEAK=~SPEAK;}if(flag=80&&flag120){tt=0;fre=10000;SPEAK=~SPEAK;}if(flag=120&&flag160){tt=0;fre=5000;SPEAK=~SPEAK;}if(flag=160&&flag200){tt=0;fre=2500;SPEAK=~SPEAK;}if(flag=200&&flag240){tt=0;fre=1250;SPEAK=~SPEAK;}if(flag=240&&flag280){tt=0;fre=625;SPEAK=~SPEAK;}if(flag=280&&flag320){tt=0;fre=312;SPEAK=~SPEAK;}if(flag=320&&flag360){tt=0;fre=156;SPEAK=~SPEAK;}TR0=1;}voidtimer1()interrupt3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;flag++;if(flag==360){flag=0;fre=50000;}}/*****************LCD1602设置*****************/voidwrite_com(ucharcom){RS=0;//写指令EN=0;//使能端拉低delay(5);P0=com;//输入地址,就是命令EN=1;//使能端拉高,工作delay(5);EN=0;//使能端拉低停止工作delay(5);}voidwrite_data(uchardate){RS=1;EN=0;//使能端拉低delay(5);P0=date;//输入数据,就是你要在液晶上显示什么EN=1;//使能端拉高,开始输入数据delay(5);EN=0;//拉低使能端,停止工作delay(5);}voiddelay(uintz)//延时函数{uintj,k;for(j=0;jz;j++)/延时zmsfor(k=0;k124;k++);//大约一毫秒}voidwrite_sfm(ucharadd,uchardate){write_com(0x80+0x40+add);//写完光标自动到下一位write_data(0x30+date);}/*****************ADC转换和数据采集****************/voidread(uinta){START=0;P2=0x00;P2=tab[a];_nop_();_nop_();_nop_();_nop_();START=1;_nop_();START=0;_nop_();delay(5);while(!AD_INT);P2=0xff;_nop_();_nop_();AD_ENA=1;_nop_();shuju=P2;_nop_();AD_ENA=0;_nop_();P2=0xff;b1=shuju/51;//整数部分b2=(shuju%51)*10/51;//小数部分}/*****************显示数据*****************/voiddisplay(uinta){write_sfm(0x04,a);write_sfm(0x07,b1);write_sfm(0x09,b2);}/*****************按键扫描*****************/voidkey(){if(k0!=1){read(ii);display(ii);delay(5);}if(k1!=1){for(i=0;i8;i++){read(i);display(i);delay(500);}}if(k2!=1){for(i=0;i8;i++){read(i);display(i);delay((t+t*(i%2))*1000);}}if(k3!=1){ii++;delay(500);if(ii=8){ii=0;}write_sfm(0x04,ii);}if(k4!=1){while(1){read(2);display(2);b=b1+0.1*b2;delay(5);if(b=1.8||b=2.2){LED1=0;TR0=1;TR1=1;}else{flag=0;fre=50000;LED1=1;TR0=0;TR1=0;}}}}四、调试及结果1、可以单点采集、多路巡测、采集时间间隔:图12运行显示结果图2、可以实现IN2通道采集电压报警功能:图13IN2通道电压大于等于2.2V报警图14IN2通道电压小于等于1.8V报警五、结束语通过这次课程设计巩固了自己的单片机编程能力,扎实了自己的专业能力。在程序设计中由于自己不够细心,在一些很细小的错误中耗费了很多时间,使得在完成课程设计时很赶。因此,在以后程序编写时应该更加认真,做到高效率完成任务。另外,感觉自己的专业十分强大,如果好好学以后会有很好的发展。六、参考文献百度文库