




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机控制系统及其应用课程实验报告实验一 代码转换1、 实验时间及地点电信学院西1楼,2011年11月13日2、 实验目的熟悉c8051单片机常用代码之间的转换方法。三、实验任务1. 设计并调试一个程序,将片内20h单元中8位无符号二进制数转化为bcd码,结果存入以30h开始的单元中。2. 设计并调试一个程序,将片内以20h开始的单元中的4字节无符号二进制数转化为bcd码,结果存入以30h开始的单元中,低位字节在低地址端。3. 设计并调试一个程序,将累加器a中的二进制数(0f)转化为asc码,结果仍放在a中。四、实验原理二进制数转换bcd码将无符号二进制数转换为bcd码,实质是将二进制数转换为十进制数,但是这里的十进制数中的每一位用bcd码来表示,进制转换的原理实质是按权展开。设需转换的二进制数为a,a%10即得到所需要的十进制数的最低位数,(a/10)%10得到十进制数的高一位数,依次类推,可以进行多位无符号二进制数到bcd码的转换。本次实验是将8位无符号数转换为转化为bcd码,即0255。二进制数(0f)转化为asc码0f的二进制数转换为asc码,关系可表示如下:五、实验内容及步骤1、启动计算机,进入仿真环境,完成进行初始化设置。2、编译无误后,运行程序,打开数据窗口(data),点击暂停按钮,观察地址30h、31h、32h的数据变化,30h更新为01,31h更新为02,32h更新为03。用键盘输入改变地址30h、31h、32h的值,点击复位按钮后,可再次运行程序,观察其实验效果。修改源程序中给累加器a的赋值,重复实验,观察实验效果。六、实验运行及结果18位无符号二进制数转化程序流程图将二进制数给指定指针变量将数除以100,得百位数保存百位数将余数再除以10,得十位数保存十位数余数为个位数,将其保存到指定指针变量中结束c语言源程序void main() unsigned char *a,*b; wdtcn = 0xde; wdtcn = 0xad; sysclk_init(); port_init(); a=0x20;b=0x30; *a=0xa8h; *b=*a/100; b+; *b=(*a-(*a/100)*100)/10; b+; *b=*a%10; while(1);编译结果片内20h单元中8位无符号二进制数#a8h,转换为十进制数为168,其bcd码为168,将其存入30h开始的单元中,从低位到高位分别为#01h,#06h,#08h;结果如下图所示:24字节无符号二进制数转化为bcd码程序流程图定义一个地址指针设定一个待转换的初始值,将其放入指定指针变量除10得到除数和余数将余数存入30h开头的地址内否除数为0是除数除10得到新的除数和余数将余数存入地址加一的新地址内除数除10得到除数和余数结束c语言源程序void main() unsigned char i;unsigned long tempp; ori=0x20; *ori=0x00000400;tempp=*ori;temp=0x30;for(i=10;i-;i0) *temp=tempp%10; tempp=tempp/10; temp+;while(1);编译结果片内以20h开始的单元中的4字节无符号二进制数为0xfeefffffh,其bcd码为141503,将其存入30h开始的单元中,从低位到高位分别为#03h,#00h,#05h,#01h,#04h,#01h,结果如下图所示:3ascii码转换将累加器a中的二进制数(0f)转化为asc码,结果仍放在a中,从ascii编码表中可知,若4位二进制数小于10,则在此二进制数上加30h即变为相应的ascii码;若10,则应加37h方可。本次实验取ch进行转换。程序流程图将预转换二进制数存入aa10ny加30h加37h将转换后的值存入a中结束c语言源程序#include void main (void) char y; acc=0x0b; y=acc; if (y0x0c) y=y+0x30; else y=y+0x37; acc=y; while(1);编译结果程序运行后,转换后结果存放入a中。本例中a中预转换的二进制数为0bh,转化为asc码后a寄存器中为43h,结果如下图所示:七、注意事项及结果分析1 8位无符号二进制表示的十进制范围是0255,检验结果时应检查32h,31h,30h对应的结果是否正确。4字节无符号二进制数示的十进制范围:04,294,967,295(即232-1)。转换为bcd码形式需设置10个字节进行存储。2二进制数为4字节无符号数故需设置为unsigned long 型,指针需分别设成unsigned long和unsigned char 型,否则会出错。实验二 液晶显示程序设计一、实验时间及地点电信学院西1楼,2011年11月20日二、实验目的掌握c8051单片机液晶显示程序设计方法。三、实验任务1. 设计并调试一个显示程序,利用所提供液晶显示器滚动显示123456这六个数字,并以每字符500毫秒的速度向右移动循环。2. 实现秒表计时功能。用键盘产生中断控制秒表的开始和停止。3. 实现日历功能,并将日历显示在液晶屏上。四、编程原理及实验运行结果1. 滚动数字显示程序流程图:开始确定好显示数字位置,定义坐标横坐标设为初始值进行定时,定时间隔500ms横坐标超液晶横向点数上限是否液晶显示坐标变换,横坐标增加特定值子程序描述数字的显示函数:void lcdc_dispword (unsigned char x, y, unsigned char code *p, unsigned char line, length, flag),其中x、y表示显示字符的坐标,*p表示显示字符的代码。 延时函数:实际中起到定时作用。void delay_ms(unsigned int times),其中times表示延时的毫秒数。利用lcdc_dispword()函数显示数据,利用delay_ms()延时500ms,将数字循环移位。c语言源程序#include main.hunsigned char key;/定义键值变量void main (void) int i;/禁止看门狗定时器wdtcn = 0xde; wdtcn = 0xad;/初始化 sysclk_init (); port_init (); key_init();lcdc_init();lcdc_disfull(full);delay_ms(500);lcdc_disfull(clr);delay_ms(500);/dis_start0();while(1) for(j=0;j=20) j=0; 编译结果经编译调试后,液晶显示器滚动显示123456这六个数字。2. 秒表计时功能键盘控制实现设置按键0,1,2的功能为开始、停止与暂停,设标志位flag,并初始化flag=0;当flag=1时(开始),进行计时变量的加1操作;当flag=2时(停止),将所有的计时变量清零,实现即时停止;当flag=3时(暂停),空操作,计时时间保持不变,从而实现暂停的功能。程序开始确定好显示数字位置,定义坐标流程图根据按键进入秒表开始、停止计数以及清零子程序结束扫描按键c语言主程序计时开始程序:void time_start(void)while (1)dis_time(ti+);delay_ms(2);key=getkey();if (key=0x0e)to=ti;break;计时暂停程序:void time_pause(void)while (1)dis_time(to);key=getkey();if (key=0x0e)ti=to;break;if (key=0x0d) ti=0;break; 时间显示程序:void dis_time(unsigned int times)unsigned int tm,ts,tms;tm=times/6000;ts=(times/100)%60;tms=times%100;dis_minute(tm);lcdc_dispword (12, 2, wlib_ddot_3x8, 1, 3, 1);dis_second(ts);lcdc_dispword (30, 2, wlib_ddot_3x8, 1, 3, 1);dis_milisecond(tms);主程序void main (void)/禁止看门狗定时器wdtcn = 0xde; wdtcn = 0xad;/初始化sysclk_init (); port_init (); key_init();lcdc_init();lcdc_disfull(full);delay_ms(500);lcdc_disfull(clr);delay_ms(500);/dis_start0();dis_time(ti); while(1) key=getkey();/调用键盘扫描函数,返回的键值送变量keyif(key!=0xff)/键值有效 执行按键程序alarm(1);/响铃delay_ms(50);alarm(0);/关闭铃声switch (key)case 0x0a:time_start();break;case 0x0e:time_pause();break;case 0x0d:ti=0;dis_time(ti);break;default: break;编译结果经编译后,液晶显示器上可以显示秒表时间,并通过按下按键“0x0a”后开始计数,按下按键“0x0e”后计数暂停,按下按键“0x0e”后计数值进行清零。五、实验结果分析及注意事项1. c语言中利用键盘扫描可以较简单的实现中断的功能。2. 液晶屏对应的显示函数等编程要按一定的规范。实验三 串行通讯程序设计一、实验时间及地点电信学院西1楼,2011年11月27日二、实验目的掌握c8051单片机串行通讯程序设计方法。三、实验任务设计并调试一个串行通讯程序,利用单片串行端口将片外ram中以3000h为起始地址的1024个字节通过串行发送端口a输出,并以自闭环的形式由串行接收口b接收,并存储到以4000h为起始地址的空间中。四、实验原理1串行口硬件介绍c8051f020有2个增强型串行口,uart 0/1(universal asynchronous-receiver and transmitter)用于串行通信。它主要由发送缓冲器sbuf、接收缓冲器sbuf和移位寄存器、控制逻辑等部分组成。单片机串行口传送的字符格式及波特率等可由软件编程决定,其功能由送入串行口中相关的控制寄存器的控制字格式而定。uart 0/1有4种工作方式,通过设置串行口控制寄存器scon0的sm0(d7)、sm1(d6)来进行选用。uart 0使用定时器1时,波特率为:波特率= 式中:t1m为定时器1时钟选择位(ckon.4);th1为定时器1的8位重载寄存器。uart 1使用定时器4时,波特率为: 波特率= 式中:为定时器4的重载寄存器。串行传输的速率(波特率)与主振频率和cpu内的定时器有关。此外,波特率的选择还与距离相关,距离越近,可选择的最大波特率越大。在本实验中以自闭环形式传送,故选择最大波特率11520hz。2功能子函数介绍发送功能子函数1) 串口初始化; 2) 等待发送1个字节数据完成;3) 写入sbuf下一个要发送的数据;4) 清除中断标志ti。void uart0_sendbyte (unsigned char value)while (!ti0); / 等待发送1个字节数据完成 sbuf0=value; / 发送数据到uart0ti0=0; / 清除中断标志串行口每发送完一帧数据后会自动置位中断请求标志位ti,这里利用此特点进行程序设计,即利用查询方式来查探传送过程,由于硬件不会自动清除中断请求标志位ti,故每次需要人为清零。 接收功能子函数 1) 串口初始化;2) 若接收完毕,从sbuf读出数据,否则返回0xff。 unsigned char uart0_receivedata (void)if (ri0)scon0&=0x01; / 清除ri1标志位return sbuf0; return 0xff;串行口每接收完一帧数据后会自动置位中断请求标志位ri,这里利用此特点进行程序设计,即利用查询方式来查探传送过程,由于硬件不会自动清除中断请求标志位ri,故每次需要人为清零。接收子函数中设置返回值便于程序检验,简单明了。3实现串口发送和接受要实现片外数据的传送与接受,可以通过两个外部数字指针,指向需要发送数据的位置和接收数据的位置,调用发送和接收函数,将1024个字节通过串行发送端口a输出,并以自闭环的形式由串行接收口b接收。为了保证发送和接收数据的准确性,发送或数据后延迟5ms。五、实验运行结果主程序流程图:系统初始化设置收发波特率发送(重发)数据接收数据延时延时设置存储器初始值(以便检测)yn开始是否接收到准备发送下一位结束束c语言源程序串口0发送程序void uart0_sendbyte (unsigned char value)while (!ti0); / 等待发送1个字节数据完成 sbuf0=value; / 发送数据到uart0ti0=0; / 清除中断标志串口1接收程序unsigned char uart1_receivedata (void)if (ri0)scon1&=0x02; / 清除ri1标志位return sbuf0;return 0xff;主程序void main (void) unsigned char xdata *p1; unsigned char xdata *p2; unsigned char i,k,temp; wdtcn=0xde; /禁止看门狗定时器 wdtcn=0xad; sysclk_init(); port_init(); k=0; p1=0x3000; p2=0x4000; for (i=0;i1024;i+) *p1=0x09; p1+; uart0_init(baudrate_115200);uart1_init(baudrate_115200); while(1) uart0_sendbyte(*p1); /p1的数据通过串口0发送出去 delay_ms(5);temp=uart1_receivedata();/串口1接收的数据 delay_ms(5);if (temp!=0xff&k1024) /串口1接收的数据是否有效 *p2=temp; p2+; p1+; k+; 编译结果通过编写程序,在以3000h为起始地址的1024个字节中都写入09h。程序运行后,查看3000h33ffh中写入的都是09h, 4000h43ffh中接受到的从3000h33ffh传来的数据都是09h,实现程序要求的功能。 部分运行结果数据如下图所示:六、实验结果分析及注意事项1. 试验预期达到的效果应该是从3000h开始循环存放00hfeh,程序运行结束后以3000h为起始地址的1024个字节和以4000h为起始地址的1024个字节存放的结果同为00hfeh。经试验检验,结果正确。2. 注意事项1) 由于传送的数据量大,程序的执行需要一定时间,如提前终止程序,会使得到的结果不正确,即:4000hk开始的地址单元只有前一部分数据是正确的,高地址内的数据是随机的。2) 程序中,当串口没有接收到数据时,默认的接受的返回值为0xff,因此传送的数据不能等于0xff,否则出错。传送的数据在程序中为单字节数据,故设置为unsigned char型,范围0x000xfe。实验四 a/d转换实验一、实验时间及地点电信学院西1楼,2011年12月4日二、实验目的掌握c8051单片机a/d转换和时钟中断的程序设计方法。三、实验任务设计并调试一个a/d采样程序,使用外部22.1184mhz 晶振。利用定时器中断,每1秒钟中断一次并采样。采样ain0,1和温度通道信号,并在lcd 上显示其电压和温度值。通过手动调节vr2电位器,观察电压值的变化。四、编程原理及实验运行结果本实验用ain0对输入电压进行转换,并由lcd显示,同时显示通道1的电压值和温度值。设置adc0使用定时器timer3溢出作为转换源,转换完成后产生中断,使用左对齐输出模式。进行通道顺次转换时,对通道号i进行判断,i为0或1时进行相应转换并由lcd显示,i为8时对温度进行检测及显示。若为其他通道,则不响应。流程图c语言源程序 #include main.hvoid main (void)unsigned long voltage; / 电压值(毫伏)unsigned long tp;int i; / 循环计数器 wdtcn = 0xde; wdtcn = 0xad;sysclk_init(); / 系统时钟初始化 port_init(); / 系统端口初始化lcdc_init(); / lcd初始化 timer3_init(sysclk/samplerate0); / 初始化timer3溢出的值 adc0_init (); / adc初始化lcdc_disfull(full); /满屏lcdc_disfull(clr); /清屏adc0_enable(1); /adc0使能lcdc_disfull(clr); /清屏while (1)delay_ms(500);for (i=0;i 16;if(voltage 0x0004e2)voltage =8*(voltage-0x0004e2);lcdc_dispword(48,48,&wlib_num_8x160,2,8,1); lcdc_dispword(56,48,&wlib_num_8x16voltage/10000*16,2,8,1);lcdc_dispword(64,48,&wlib_num_8x16voltage/1000*16,2,8,1);lcdc_dispword(72,48,wlib_dian_8x16,2,8,1); lcdc_dispword(80,48,&wlib_num_8x16voltage%1000/100*16,2,8,1); lcdc_dispword(88,48,&wlib_num_8x16voltage%100%100/10*16,2,8,1); lcdc_dispword(96,48,&wlib_num_8x16voltage%100%100%10*16,2,8,1);elsevoltage =8*(0x0004e2 - voltage);lcdc_dispword(48,48,&wlib_num_8x16160,2,8,1); lcdc_dispword(56,48,&wlib_num_8x16voltage/10000*16,2,8,1); lcdc_dispword(64,48,&wlib_num_8x16voltage/1000*16,2,8,1); lcdc_dispword(72,48,wlib_dian_8x16,2,8,1); lcdc_dispword(80,48,&wlib_num_8x16voltage%1000/100*16,2,8,1); lcdc_dispword(88,48,&wlib_num_8x16voltage%100%100/10*16,2,8,1); lcdc_dispword(96,48,&wlib_num_8x16voltage%100%100%10*16,2,8,1);break;case 1:/ 通道1显示lcdc_dispword(0,32,wlib_tong_16x16,2,16,1);lcdc_dispword(16,32,wlib_dao_16x16,2,16,1);lcdc_dispword(32,32,&wlib_num_8x16i*16,2,8,1);lcdc_dispword(40,32,wlib_maohao_8x16,2,8,1);lcdc_dispword(112,32,wlib_fu_16x16,2,16,1);voltage = voltage 16;if(voltage 0x0004e2)voltage =8*(voltage-0x0004e2);lcdc_dispword(48,32,&wlib_num_8x160,2,8,1);lcdc_dispword(56,32,&wlib_num_8x16voltage/10000*16,2,8,1);lcdc_dispword(64,32,&wlib_num_8x16voltage/1000*16,2,8,1);lcdc_dispword(72,32,wlib_dian_8x16,2,8,1);lcdc_dispword(80,32,&wlib_num_8x16voltage%1000/100*16,2,8,1);lcdc_dispword(88,32,&wlib_num_8x16voltage%100%100/10*16,2,8,1);lcdc_dispword(96,32,&wlib_num_8x16voltage%100%100%10*16,2,8,1);elsevoltage =8*(0x0004e2 - voltage);lcdc_dispword(48,32,&wlib_num_8x16160,2,8,1);lcdc_dispword(56,32,&wlib_num_8x16voltage/10000*16,2,8,1);lcdc_dispword(64,32,&wlib_num_8x16voltage/1000*16,2,8,1);lcdc_dispword(72,32,wlib_dian_8x16,2,8,1);lcdc_dispword(80,32,&wlib_num_8x16voltage%1000/100*16,2,8,1);lcdc_dispword(88,32,&wlib_num_8x16voltage%100%100/10*16,2,8,1);lcdc_dispword(96,32,&wlib_num_8x16voltage%100%100%10*16,2,8,1);break;case 2:/ 通道2显示 voltage = voltage 16;if(voltage 0x0004e2)voltage =8*(voltage-0x0004e2);elsevoltage =8*(0x0004e2 - voltage);break; case 8:/ 芯片温度显示 voltage = adc_valud_return (8);tp=(voltage/16-1324)*839/4096;lcdc_dispword(0,16,wlib_wen_16x16,2,16,1);lcdc_dispword(16,16,wlib_du_16x16,2,16,1);lcdc_dispword(32,16,wlib_maohao_8x16,2,8,1);lcdc_dispword(112,16,wlib_du_16x16,2,16,1);lcdc_dispword(64,16,&wlib_num_8x16tp/10*16,2,8,1);lcdc_dispword(80,16,&wlib_num_8x16tp%10*16,2,8,1);break;default:break; enable_interrupts;/显示完毕,开中断 编译结果通过编写程序,编译后在lcd 上显示出了电压和温度值,并且通过调节电位器能够看到电压值变化。包括:定时器中断、a/d转换及中断和lcd显示。五、实验结果分析通过调节电位器,改变输入的模拟电压值,可以看到显示的通道0的电压随之发生变化,温度也随之发生微小变化。当电压升高时,温度随之变大。这里只对adc0的通道0进行实验,通道1没有进行硬件连接,因而通道1的示数几乎不随电位器发生改变。可显示的电压为范围为:03v。程序中还使其可显示微小负电压。因此,程序完成了实验任务的要求。通过本实验,掌握了c8051单片机a/d转换和时钟中断的程序设计方法。实验五 d/a转换实验一、实验时间及地点电信学院西1楼,2011年12月4日二、实验目的 掌握c8051单片机d/a转换程序设计方法三、实验任务设计并调试一个d/a采样程序,使用外部22.1184mhz 晶振。开机显示西安交通大学信息,为待机界面。定义a-f为功能键。按a 键,输出250hz 的方波,按b 键,输出250hz 的正弦波形,按c 键,输出250hz 的三角波,按d 键,输出250hz 的锯齿波。按”e”键调整输出波形的频率,每按一次输出波形的频率增加50hz。波形最大频率为400hz。当达到400hz后,再按一次“e”键,波形频率减少50hz。“f”键返回开机显示界面。用示波器在j6(dac0)观测结果,使用串口观测按键信息。四、实验原理c8051f020有2个片内12位电压输出的数/模转换器(dac)模块。每个dac的输出百富均为0v(vref-1lsb),对应的输入范围是0x0000xfff。dac可设置为12位或8位方式。在12位分辨率时,应在写入dac0l之后,再写dac0h。在8为方式,将dac0l初始化为一个所期望的数值(同常为0x00),只将数据写入dac0h。1. 波形输出由各个子函数完成对应波形任一时刻输出电压值的计算。如计算正弦波的子函数为:void sine(void)unsigned int data y;unsigned int data i;for(i=0;i4095)y=4095;tablei=y; 在本实验中,使用timer4作为更新调度程序,即timer4中断时调用da转换,输出某一时刻的电压值。连续输出各个时刻的电压值就出现了波形。2. 频率调节由上述可知,调节timer4的定时时间常数,即改变定时中断的频率,波形输出的频率就会对应地发生改变。通过计算50hz对应的是计时时间常数约为69。判断键值为”e”,则调整频率,程序如下: case 0x0e: i=65536-691+j*691/10; j+;if(j5)j=j-2;timer4_init(i);break;3. 实现串口da转换设计并调试一个a/d采样程序,使用外部22.1184mhz 晶振。利用定时器中断,每1秒钟中断一次并采样。采样ain0,1和温度通道信号,并在lcd 上显示其电压和温度值。通过手动调节vr2电位器,观察电压值的变化。五、实验内容运行结果流程图c语言主程序void main (void) unsigned int i,j=1;unsigned char key; wdtcn = 0xde; wdt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品质部主管工作总结
- 颅脑外伤急诊抢救护理
- 山东省淄博市2025-2026学年高三上学期开学考试语文试题及参考答案
- 数学教师培训交流
- 代理记账工作总结
- 2026届重庆市荣昌区化学九上期中教学质量检测模拟试题含解析
- 数学建模博弈论析
- 2026届湖北省荆州市松滋市化学九年级第一学期期中综合测试模拟试题含解析
- 建筑行业个人工作总结
- 2026届山东省青岛市崂山区化学九年级第一学期期中复习检测模拟试题含解析
- 制鞋工岗前考核试卷及答案
- (2025年标准)课时合同转让协议书
- 郑州市突发应急预案
- 2025广东肇庆市怀集县卫生事业单位招聘102人考试备考试题及答案解析
- 原发性胆汁性胆管炎的诊断和治疗课件
- 中医医疗技术相关性感染防控考试卷(附答案)
- 2025强制执行申请书(范文模板)
- 风力发电机自动消防系统
- 公益性岗位业务培训课件
- 时光老人与流浪汉课件
- 政务中心面试常见问题与答案详解
评论
0/150
提交评论