还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验一发光二极管的移动控制
一、实验目的
1.熟悉并行接口的设置与应用;
2.进一步熟悉编译软件和下载软件的使用;
3.熟悉C语言中移位、延时、数组等指令的应用;
4.增强学习单片机的兴趣
二、实验内容
1.参考课本P128“发光二极管的移动控制”实验程序,实现发光二极管循环点亮的按键控制
2.设计一个完整程序(另建一个文档),实现8个led灯的自动顺序(加法)点亮和逆序(减法)点亮见参考程序,并在程序中添加必要的解释文字
三、实验步骤
1.以班级和姓名为文件夹名称在D盘根目录下新建一个子目录文件夹,用来保存每次实验的项目和程序(注意每次实验的位置固定,即下次实验的计算机还是上次的计算机)
2.再在这个子目录下以实验题目为名新建一个文件夹打开ICCAVR开发编程软件,新建一个工程文件项目,参照程序清单或根据实验要求自己重新修改设置并输入程序
3.保存程序,并将程序源文件添加到项目里见下图1图
14.设置项目属性,选择目标芯片等,见下图2,3图2图
35.编译程序将所输入的程序进行编译菜单Project→Make命令,或者在工具栏单击按钮,若编译时下方出现错误提示,说明程序有语法错误,此时必须根据编译器所列出的错误消息,逐条查改,重新编译,直到错误消除并生成*.hex文件
6.功能仿真利用proteus或AVRstudio的仿真功能对程序进行功能性仿真,验证程序功能是否正确
7.打开下载软件(progisp或AVRStudio里的JTAGICE),将刚刚生成的相应*.hex文件写入单片机在此之前,须将单片机实验板按要求与PC机连接正确,并接通电源
8.验证硬件实现的结果是否与功能要求一致
四、参考程序(实现8个led灯的自动顺序(加法)和逆序(减法)点亮的部分程序)/***********************系统外接8M晶振************************/unsignedchari;while1{fori=0;i8;i++{PORTB=~1i;delay_ms200;}fori=8;i0;i--{PORTB=~1i-1;delay_ms200;}}实验二0~99数字的加减控制
一、实验目的
1.熟悉并行接口的设置与应用;
2.进一步熟悉编译软件和下载软件的使用;
3.熟悉十进制数各个位在数码管上显示的编程方法;
二、实验内容
1.参照课本P131“0~99数字的加减控制”的程序,实现按键对数字的加减控制功能(因实验板上数码管与PC口的连接方式和书本中的连接不一致,须修改源程序,具体见实验电路分析部分)
2.假如需要控制0~999数字的加减控制,请重新设计一个程序实现该功能
三、实验电路本实验的电路连接如下图所示1注意本图中高位数码管连接低位PC口,低位数码管连接高位PC口,即图中第1位(最左边)数码管连接PC0第2位数码管连接PC1…第8位(最右边)数码管与课本的实验电路连接方式不一致,故在程序设计中需要修改数码管的位选端图1键控计数电路
四、实验步骤参照实验一的实验步骤过程
1.参照课本P131,通过ICCAVR编译后生成*.HEX文件,并利用proteusISIS仿真程序实现的功能
2.在不修改数码管位选端的情况下,观察程序执行结果
3.分别修改数码管的个位和十位位选端,使数码管上显示的结果正常
4.如要使数字的显示从数码管的最低位开始显示,重新设计数码管的个位和十位位选端编码
5.若要控制0~999数字的加减控制,设计数码管的BCD转换
五、部分参考程序
1.实验板上各个数码管的位选端数组为ACT
[8]={0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f}//数码管从高位到低位显示//的排列编码
2.数码管BCD转换PORTA=SEG7[counter%10];//显示counter变量的个位PORTC=ACT
[0];//选通个位数码管delay_ms1;PORTA=SEG7[counter/10%10];//显示counter变量的十位PORTC=ACT
[1];//选通十位数码管delay_ms1;PORTA=SEG7[counter/100];//显示counter变量的百位PORTC=ACT
[2];//选通百位数码管delay_ms1;实验三脉宽调制(PWM)实验
一、实验目的
1.进一步了解脉宽调制的意义,熟悉脉宽调制的原理;
2.掌握脉宽调制的设置与应用;
3.能解读程序
二、实验内容1.参照课本P234“PWM测试实验”的程序,实现按键S
1、S2对PWM的输出控制
(1)编译通过后,进行软件仿真在ProteusISIS里利用LCD1602观察显示内容是否正确,并用虚拟示波器OSCILLOSCOPE观察OC2引脚PD7输出的PWM信号是否正常见下图注意开始仿真后,必须按下S1才有PWM波输出
(2)用数字万用表检测OC2脚(PD7),观测输出电压是否与LCD指示的相符,并填入下表OCR2值LCD显示的电压值()数字万用表显示的电压值(V)
2.修改源程序(P234~P236),使输出脉宽是自动变化的部分参考程序如下while1{unsignedchari;i=255;whilei{OCR2=i;Delay_nms50;i--;}i=1;whilei{OCR2=i;Delay_nms50;i++;}}
三、附LCD1602驱动参考程序(注本驱动是在课本P182~185基础上进行修改的,目的是删除驱动程序中的检测LCD忙信号函数及与其相关语句,使仿真和显示正常)/*******LCD1602液晶驱动程序***************/#includeiom16v.h#includemacros.h#definextal8#definePB00#definePB11#definePB22//----------------------------#defineucharunsignedchar#defineuintunsignedint#defineSET_BITxyx|=1y#defineCLR_BITxyx=~1y#defineGET_BITxyx=1y//-------端口电平的宏定义------------#defineLCM_RS_1SET_BITPORTBPB0#defineLCM_RS_0CLR_BITPORTBPB0#defineLCM_RW_1SET_BITPORTBPB1#defineLCM_RW_0CLR_BITPORTBPB1#defineLCM_EN_1SET_BITPORTBPB2#defineLCM_EN_0CLR_BITPORTBPB2//------------------------------#defineDataPortPORTA#defineBusy0x80//**********函数声明********************voidDelay_1msvoid;voidDelay_nmsuintn;voidLcdWriteDataucharW;voidLcdWriteCommanducharCMD;voidInitLcdvoid;voidDisplayLine2uchardd;voidDisplayOneCharucharxucharyucharWdata;voidePutstrucharxucharyucharconst*ptr;/***********显示指定坐标的一串字符子函数************/voidePutstrucharxucharyucharconst*ptr{ucharil=0;whileptr[l]31{l++;}fori=0;il;i++{DisplayOneCharx++yptr[i];ifx==16{x=0;y^=1;}}}//**********演示第二行移动字符串子函数************voidDisplayLine2uchardd{uchari;fori=0;i16;i++{DisplayOneChari1dd++;dd=0x7f;ifdd32dd=32;}}//***********显示光标定位子函数******************voidLocateXYcharposxcharposy{uchartemp=0;temp=0x7f;temp=posx0x0f;posy=0x01;ifposytemp|=0x40;temp|=0x80;LcdWriteCommandtemp;}//**********显示光标定位的一个字符子函数***********voidDisplayOneCharucharxucharyucharWdata{LocateXYxy;LcdWriteDataWdata;}//***********LCD初始化子函数******************voidInitLcdvoid{LcdWriteCommand0x38;//显示模式设置(固定)8位数据接口Delay_nms5;LcdWriteCommand0x01;//清屏Delay_nms5;LcdWriteCommand0x0c;//开显示,不显示光标Delay_nms5;}//************写命令到LCM子函数************voidLcdWriteCommanducharCMD{LCM_RS_0;LCM_RW_0;DataPort=CMD;LCM_EN_1;Delay_nms1;LCM_EN_0;}//************写数据到LCM子函数*************voidLcdWriteDatauchardataW{LCM_RS_1;LCM_RW_0;DataPort=dataW;LCM_EN_1;Delay_nms1;LCM_EN_0;}//***********1ms延时子函数*******************voidDelay_1msvoid{uinti;fori=1;iuintxtal*143-2;i++;}//=============n*1ms延时子函数================voidDelay_nmsuintn{uinti=0;whilein{Delay_1ms;i++;}}实验四0~5V数字式直流电压表
一、实验目的
1.掌握A/D转换程序的设计;
2.掌握数据采集与显示的应用;3.掌握数据处理的方法;
二、实验内容
1.参照课本P383页“0~5V数字式直流电压表实验”程序并编译、仿真,见下图所示注意由于用proteusISIS仿真时,数码管模型显示的闪烁现象和缓存现象,需要对其进行短延时和清屏,否则,显示将出现乱码现象可在main主函数里加入两条语句Delay1;PORTA=0;
(1)修改错误比较程序第25行“ADMUX=0XC7”以及程序第71行“x=5000*longi/1023”所指参考电压不一致,导致输入模拟电压值与数码管显示电压值不一致,有哪几种修改方案如把ADMUX=0XC7改为0X07
(2)调节电位器(POT-LOG),观察数码管显示的电压值与虚拟直流电压表显示的电压是否一致
2.将编译通过后的程序烧写到单片机里,调节AD电位器,观看开发板上数码管的显示情况注意数码管的位选端排列顺序,实验板与课本电路图中数码管排序不同,故需要调整位选端
3.如果想观察ADC转换后的数字结果,则需将数码管显示改为PORTA=SEG7[adc_val%10];………依次类推
三、拓展实验把数码管显示改为LCD1602液晶显示(可参考P240“0~5V数字电压调整器”lcd部分程序内容)注意因使用PA7为输入端口,而PA口为原电路中LCD1602的数据端口,故把数据端口改为PC口,注意要把lcd1602液晶的驱动程序“lcd1602_8bit.c”中的语句“#defineDataPortPORTA”改为“#defineDataPortPORTC”ProteusISIS仿真图如下图
四、附使用LCD1602显示ADC参考程序#includeiom16v.h#includelcd1602_8bit.cucharconsttitle[]={0-5vD_voltager};#defineucharunsignedchar#defineuintunsignedintuintadc_valdis_val;ucharicnt;/************************************************/voidport_initvoid{PORTA=0x7F;DDRA=0x7F;PORTB=0xFF;DDRB=0xFF;PORTC=0xFF;DDRC=0xFF;PORTD=0xFF;DDRD=0xFF;}/************************************************/voidadc_initvoid{ADCSRA=0xE3;ADMUX=0x47;}//***************************voidtimer0_initvoid{TCNT0=0x83;TCCR0=0x03;TIMSK=0x01;}/*********************************************/voidinit_devicesvoid{port_init;timer0_init;adc_init;SREG=0x80;}//***************************#pragmainterrupt_handlertimer0_ovf_isr:10voidtimer0_ovf_isrvoid{TCNT0=0x83;cnt++;}//=========================uintADC_Convertvoid{uinttemp1temp2;adc_init;temp1=uintADCL;temp2=uintADCH;temp2=temp28+temp1;returntemp2;}/**************************/uintconvuinti{longx;uinty;x=5000*longi/1023;y=uintx;returny;}voiddelayuintk{uintij;fori=0;ik;i++{forj=0;j1141;j++;}}/***********************/voidmainvoid{init_devices;Delay_nms400;DDRA=0X7F;PORTA=0X7F;DDRC=0XFF;PORTC=0X00;DDRB=0XFF;PORTB=0X00;InitLcd;ePutstr10title;DisplayOneChar01A;DisplayOneChar11D;DisplayOneChar21C;DisplayOneChar317;DisplayOneChar41:;DisplayOneChar
111.;DisplayOneChar151V;while1{ifcnt100{adc_val=ADC_Convert;dis_val=convadc_val;cnt=0;}delay10;DisplayOneChar51adc_val/1000+0x30;DisplayOneChar61adc_val/100%10+0x30;DisplayOneChar71adc_val/10%10+0x30;DisplayOneChar81adc_val%10+0x30;DisplayOneChar101dis_val/1000+0x30;DisplayOneChar121dis_val/100%10+0x30;DisplayOneChar131dis_val/10%10+0x30;DisplayOneChar141dis_val%10+0x30;}}高位数码管低位数码管。