




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、基本示例分析:使用mega16的Port B连接8个LED,以产生流水灯的效果。连接好电路并且完成程序之后,您将可以看到8个LED依次轮流闪烁。 在这次练习中,您将学会如何使用I/O Port输出数据,以及如何使用循环实现时间延迟。 例1、LED的控制电路图/8位流水灯实验/外部晶振12M,接上J2跳线帽#include #include #define LED_ON PORTA.2=0;/主函数void main() unsigned char i=0; unsigned char led=0 x01; /led=0 xfe=11111110B,1-灭,0-亮 DDRB=0 xff; /
2、PB07,全部为输出状态 DDRA.2=1; /控制led亮灭的开关设为输出 LED_ON; /led控制打开 while(1) for(i=0;i8;i+) PORTB=led; /逐个PB口输出低电平 led=1; /led左移1位 if(0=led) led=0 x01; delay_ms(300); /适当延迟 while(1) for(i=0;i8;i+) PORTB=led; /逐个PB口输出低电平 led=1; /led左移1位 if(0=led) led=0 x01; delay_ms(300); /适当延迟 例2、4X4矩阵键盘的输入以及数码管显示 目的是使用mega16的P
3、ort B连接到1个数码管,Port D则连接到4X4矩阵键盘,当用户按动开关时,数码管就会显示相应的16进制的数值。 在这次练习中,您将学会如何使用mega16输入数据,控制共阴七段数码管的显示。 例如,您要从Port D输入数据给变量temp时,可以执行temp=PIND; 电路图#include #include LED7.h#include key16.h/全局变量:键盘结果unsigned char KeyResult; /标识所按下的按键void main() /主函数 LED7_IO_Init(); /数码管引脚初始化 while(1) Key_Scan(); /键盘扫描函数 N
4、umber_Show(KeyResult); /数码管显示函数 /4X4矩阵键盘的输入及数码管显示程序/键盘按下判断函数unsigned char Key_Press(void) unsigned char KeyRead=0 x00; DDRD=0 xf0; /PD03为带上拉输入, /P47输出低电平 PORTD=0 x0f; KeyRead=PIND; /读取PD的结果 KeyRead&=0 x0f; /屏蔽高四位 if(KeyRead!=0 x0f) /手否有按下键呢? return 1; /是 else return 0; /不是/键盘扫描函数void Key_Scan(void)
5、if(Key_Press() /如果有按下键 delay_ms(10); /消抖 C1_Scan(); /扫描列1 C2_Scan(); /扫描列2 C3_Scan(); /扫描列3 C4_Scan(); /扫描列4 while(Key_Press(); /判断是否已经释放手 /扫描列1函数void C1_Scan(void) unsigned char KeyRead; DDRD=0 xf0; /PD03为带上拉输入,/P47输出低电平 PORTD=0 xef; /PD4输出低电平,其余高四位输出高电平。低四位为带上拉输入 DDRD=0 x00; /PD口全部输入 KeyRead=PIND;
6、 /读取PD口的值 switch (KeyRead) /判断 case 0 xee: KeyResult=0; break; /(1,1) case 0 xed: KeyResult=1; break; /(2,1) case 0 xeb: KeyResult=2; break; /(3,1) case 0 xe7: KeyResult=3; break; /(4,1) 一个共阴七段数码管的外观和引脚如图所示。这个共阴七段数码管的引脚分别通过锁存器连接到mega16的Port B引脚。PB6PB5PB4PB3PB0PB1PB2PB7GND电路图通过锁存器把6个数码管连接到mega16的Port
7、 B引脚,可以控制6个数码管的显示。 共阴七段数码管有一共同接点连接到地,其余的引脚分别连到PORTB口; 因此如果要让所指定的LED发光时,就必须输出1,反之则输出0,所以我们可以用下表排列出所要显示字符和必须输出的信号。七段数码管码表#include LED7.h/数组声明并定义在存储数据区/0funsigned char const Number= 0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71 ;例2、数码管动态显示例3、步进电机步进电机
8、是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机工作原理步进电机能将脉冲信号转换成角位移,每个步距对应一个脉冲,步距角值是精确的,误差不会累积。下图所示为三相步进电机简化模型图,定子上有三对凸起磁极,定子上相对的磁极绕有
9、同一线圈。转子为磁场良导体,上有四个凸齿。当定子磁极上的线圈中通有电流时,磁极感生磁场将经由转子传导。此时磁通将根据磁阻最小的路径原则闭合,结果将导致磁场在转子上产生力矩,使其某一对凸齿尽量正对定子上通电的磁极。绕线情况A相通电时平衡位置三相步进电机单三拍方式驱动设启动时转子1、3齿在A极附近,则第一个脉冲通过A极后,由于磁通企图沿最小磁阻路径闭合,产生的磁场力导致1、3齿要转动到与A极对齐。同样,下一个脉冲经过B极,同样驱使2、4齿转动到与B极对齐,以此类推。通电顺序ABCAB时,电机正转;通电顺序ACBAC时,电机反转。三相步进电机六拍方式驱动在单三拍驱动方式下,电机运行时有3个稳定位置,
10、每改变一次通电状态,转子转动30;若按照AABBBCCCAA的顺序通电,则运行时有6个稳定位置,每改变一次通电状态,转子顺时针方向转15。若通电顺序相反,同样导致电机反转。如果A相和B相的电流按照某一规律变化,则可以在AB之间获得更多的稳定状态,同样技术施于BC和CA间,即可做到更小的步距角,实现更加精确的位移。步进电机驱动器步进电机电路图步进电机实物图: 常用的四相步进电机原理图:#include #include #define uchar unsigned charflash uchar F_Rotation4=0 x01,0 x02,0 x04,0 x08; /正转表格,换算成二进制
11、0000 0001,0000 0010,0000 0100,0000 1000flash uchar B_Rotation4=0 x08,0 x04,0 x02,0 x01; /反转表格/步进电机控制程序void main() uchar i,j; DDRB=0 xff; /PB0-PB2设置为输出状态 while(1) for(j=0;j255;j+) for(i=0;i4;i+) /4相 PORTB=F_Rotationi; /输出对应的相 ,使步进电机正转 delay_ms(5); /改变这个参数可以调整电机转速 ,数字越小,转速越大 delay_ms(1000); /暂停1s for(
12、j=0;j255;j+) for(i=0;i4;i+) /4相 PORTB=B_Rotationi; /输出对应的相 ,使步进电机反转 delay_ms(5); /改变这个参数可以调整电机转速 ,数字越小, 转速越大 delay_ms(1000); /暂停1s 例4、红外遥控以及LCD显示 本例子主要利用红外接收头TL1838解码,在液晶上显示由遥控器发来的4组编码,并且在接收到正确编码时,蜂鸣器会鸣响一下。 在这次练习中,您将学会如何使用mega16进行红外解码,定时器和外部中断的使用,LCD的显示以及蜂鸣器的使用。 红外线的光谱位于红色光之外, 波长是0.761.5m,比红光的波长还长。红
13、外遥控是利用红外线进行传递信息的一种控制方式,红外遥控具有抗干扰,电路简单,容易编码和解码,功耗小,成本低的优点。红外遥控几乎适用所有家电的控制。 红外遥控系统的主要部分为调制、发射和接收,如下左图所示:红外线接收头红外接收头TL1838 上图为一个典型的红外接收器模块图,红外信号由接收器的检波二极管接收,依次经过放大,限幅,带通滤波器,检波,积分和比较的处理。 当你对此图表模块的描述不了解时,请不要慌张,因为所有这些功能模块都集成到单一的电子器件(红外接收头)。红外遥控编码格式常用的编码格式协议格式:NEC协议格式NEC格式的特征:1:使用 38 kHz 载波频率 2:引导码间隔是 9 ms
14、 + 4.5 ms (为了方便解码) 3:使用 16位客户代码 4:使用 8位数据代码和 8位取反的数据代码 NEC 协议通过脉冲串之间的时间间隔来实现信号的调制(英文简写PPM)红外遥控编码格式NEC 协议 逻辑“0”是由0.56ms的38KHZ载波和0.560ms的无载波间隔组成;逻辑“1”是由0.56ms的38KHZ载波和1.68ms的无载波间隔组成;结束位是0.56ms的38K载波。红外遥控编码格式NEC 协议上图所示为NEC协议的典型脉冲链。 协议规定低位首先发送,每次发送的信息首先是引导码,接下来便是地址码和命令码。地址码和命令码发送两次,第二次发送的是反码,用于验证接收的信息的准
15、确性。因为每位都发送一次它的反码,所以总体的发送时间是恒定的。红外遥控编码格式NEC 协议 尽管你一直按住那个按键,一串信息只能发送一次。如果一直按着按键,发送的则是以110ms为周期的重复码,重复码是由9ms的高电平和2.25ms的低电平及一个560us的高电平组成。红外遥控系统电路图#include #include #include /包含1602液晶库函数#include /包含蜂鸣器库函数#define uchar unsigned char#define uint unsigned int#define IR PIND.2 /PD2接口与TL1838相连,定义 /IR读取数据uch
16、ar Title=IR Code:; /标题uchar LowTime,HighTime; /分别储存高、低电平的宽度uchar IrCode4; /处理后的红外码: /客户码,客户码反码,数据 /码,数据码反码/* 主函数 */*/void main(void) DDRD.2=0; /TL1838对应引脚输入状态 PORTD.2=1; /内部上拉电阻有效 lcd_init(); /液晶初始化 lcd_puts(Title); /在第一行显示标题 TIME0_Init(); /定时器0初始化 EXT0_Init(); /外部中断0初始化 #asm(sei); /使能全局中断 while(1);
17、 /等待红外编码接收/* 外部中断0初始化 */*/void EXT0_Init(void) GICR |= 0 x40; /打开外部中断0 MCUCR &= 0 xfc; /ISC01:0=10b,下降沿触发 MCUCR |= 0 x02;/*/* 外部中断0函数 */interrupt EXT_INT0 void ex0_isr (void) /外部中断0服务函数 GICR &= 0 xbf; /关闭外中断0,不再接收二次红外信号 TCNT0 = 0 x00; /定时器T0清0 TIMSK |= 0 x01; /开启定时器T0 while(IR=0); /如果是低电平就等待,给引导码低电平
18、计时 TIMSK &= 0 xfe; /关闭定时器T0 LowTime = TCNT0; /保存引导码低电平时间 TCNT0 = 0 x00; /定时器T0清0 TIMSK |= 0 x01; while(IR=1); /如果是高电平就等待,给引导码高电平计时 TIMSK &= 0 xfe; HighTime = TCNT0; /保存引导码高电平时间if(LowTime100)&(LowTime45)&(HighTime55) /如果是引导码,就开始解码,否则放弃(计算如下) if(DeCode()=1) /执行遥控解码功能 disp_code(); /解码成功,调用1602LCD显示函数 b
19、eep(); /蜂鸣器响一声 提示解码成功 GICR |= 0 x40; /开启外中断0/*uchar DeCode(void) uchar i,j; uchar temp; /储存解码出的数据 for(i=0;i4;i+) /连续读取4个用户码和键数据码 temp=0; /必须在此时对temp清零 for(j=0;j=1; /temp中的各数据位右移一位, TCNT0=0 x00; /定时器清0 TIMSK |= 0 x01; /开启定时器T0 while(IR=0); /低电平就等待(计低电平时间) TIMSK &= 0 xfe; /定时器T0停止计时 LowTime = TCNT0; /
20、保存低电平时间 TCNT0 = 0 x00; TIMSK |= 0 x01; while(IR=1); /高电平就等待(计高电平时间) TIMSK &= 0 xfe; HighTime = TCNT0; if(LowTime10) return 0; /如果低电平长度不在合理范围,则认为出错,停止解码 else if(HighTime=4)&(HighTime=16)&(HighTime4; /右移四位得到高四位码 if(temp=0 x09) /0-9则显示对应ASCII码 lcd_putchar(temp+0 x30); else /A-F则显示对应ASCII码 lcd_putchar(t
21、emp-0 x09+0 x40); temp=data&0 x0f; if(temp=0 x09) /与0 x0f相与取低四位码 lcd_putchar(temp+0 x30); else lcd_putchar(temp-0 x09+0 x40); lcd_putchar(H); /显示字符H/*/* 显示4组红外码 */*/void disp_code(void) uchar i; lcd_gotoxy(0,1); /定位液晶第二行 for(i=0;i100)&(LowTime45)&(HighTime55) /如果是引导码,就开始解码,否则放弃(计算如下) if(DeCode()=1)
22、/执行遥控解码功能 disp_code(); /解码成功,调用1602LCD显示函数 beep(); /蜂鸣器响一声 提示解码成功 GICR |= 0 x40; /开启外中断0/*例5、 DS18B20温度传感器使用 本例子主要利用mega16读取DS18B20温度传感器测得的数据,然后通过LCD来显示。 在这次练习中,您将学会如何使用mega16和温度传感器对温度进行测量并显示,学习1wire总线的使用。 DS18B20温度传感器电路图 1-wire总线是一种具有一共主机和多个从机的系统,本例中mega16为主机,DS18B20为从机。 通过1-wire对DS18B20进行初始化、写数据和读
23、数据都要有严格的时序。对DS18B20写数据时必须处在写时隙(write time slots)中,读数据时必须处在读时隙(read time slots)中。请结合程序理解时序的操作。#define DQ_0 PORTA.5=0#define DQ_1 PORTA.5=1#define DQ_OUTDDRA.5=1#define DQ_IN DDRA.5=0#define DQ PINA.5 初始化:通过1-wire从主机上发出一个复位脉冲,接着由从属器件发回存在脉冲。时序图如下: 发送复位脉冲的方法是拉低1-wire总线电平,时间至少480us。之后总线主控会释放总线并进入接收模式(Rx)
24、。当释放总线时,5K的上拉电阻会拉高电平,DS18B20检测到这个上升沿时,会等待15-60us之后发送一个存在脉冲回来。因此为了确保DS18B20能发回脉冲,我们要在程序里手动延迟60us以上。/DS18B20复位函数void DS18B20_Reset() DQ_OUT; /DQ为输出状态 DQ_0; /输出低电平 delay_us(500); / 延迟500微妙 DQ_1; /释放总线 delay_us(60); /延迟60微妙 DQ_IN; /DQ位输入状态 while(DQ); /等待从机DS18B20应答(低电平有效) while(!DQ); /等待从机DS18B20释放总线#de
25、fine DQ_0 PORTA.5=0#define DQ_1 PORTA.5=1#define DQ_OUTDDRA.5=1#define DQ_IN DDRA.5=0#define DQ PINA.5 写时隙:分为写0时隙和写1时隙,即总线使用写0时隙对DS18B20写入逻辑0,使用写1时隙对DS18B20写入逻辑1。 所有写时隙过程都至少持续60us,且在两个写时隙之间至少延迟1us。两种写时隙的初始化都由拉低电平实现。 DS18B20采集总线数据是初始化之后的15us-60us之间(如图),在这段时间内,总线电平1则采集到逻辑1,电平为0则采集到逻辑0。因此,形成一个写0时隙要拉低电平
26、,并保持低电平至少60us。而形成一个写1时隙要在拉低电平后的15us之内释放总线。void DS18B20_Write(unsigned char Data)/ DS18B20写字节函数 unsigned char i; DQ_OUT; /DQ为输出 for(i=0;i=1; 读时隙:与写时隙类似,分为读0时隙和读1时隙。 DS18B20只有在主机处于读时隙时才能传送数据,因此总线必须在写入Read Scratchpad BEh指令之后立即进入读时隙。 初始化读时隙也是通过拉低电平实现,初始化后DS18B20会向总线传送逻辑1或0,且在初始化后的15us之内是有效的,因此主机必须在这段时间内
27、拉高电平并且开始采集总线数据。/ DS18B20读字节函数unsigned char DS18B20_Read() unsigned char i,Temp=0; for(i=0;i=1; /数据右移 DQ_OUT; ; /DQ为输出状态 DQ_0; ; /拉低总线,启动输入 DQ_1; /释放总线DQ_IN; /DQ为输入状态if(DQ) Temp|=0 x80;delay_us(45); /延迟45微妙(最大45微妙)return Temp; 对DS18B20的控制通过使用1-wire写指令来实现。包括5个ROM指令和6个功能指令。本程序中,由于硬件接法,所以只用到了以下三个指令: SKI
28、P ROM CCh:主机可以通过这个指令可以同时命令总线上所有器件,而不发送任何ROM代码信息。 CONVERT T 44h:启动温度转换。产生9位数据。8位数据和最后一位校验位(CRC)。 READ SCRATCHPADBEh:读取暂存器内容,每次读一位,直到第9位(byte-8,CRC)。 其余指令可下载PDF查看详细介绍,另包括DS18B20内部流程。#include #include #include 1602LCD.h#include DS18B20.hunsigned char buff=Temperature:; / 字符串/主函数void main() lcd_init();
29、/调用IO口初始化函数while(1) Display_temperature(Read_Temperature();delay_ms(500);/稍微延迟/读温度函数unsigned int Read_Temperature()unsigned int Temp1,Temp2;DS18B20_Reset(); /DS1302复位DS18B20_Write(0 xCC); /跳过ROMDS18B20_Write(0 x44); /温度转换DS18B20_Reset(); /DS1302复位DS18B20_Write(0 xCC); /跳过ROMDS18B20_Write(0 xbe); /读取
30、RAMTemp1=DS18B20_Read(); /读低八位,LS Byte, RAM0Temp2=DS18B20_Read(); /读高八位,MS Byte, RAM1DS18B20_Reset(); /DS1302复位,表示读取结束return (Temp28)|Temp1)*6.25);/0.0625=xx, 0.625=xx.x, 6.25=xx.xxvoid Display_temperature(unsigned int Temp) /显示温度unsigned char ten,one,dat,dat1;lcd_gotoxy(0,0); lcd_puts(buff);lcd_gotoxy(5,1);/第二行第六列 ten=Temp/1000+0 x30;one=Temp%1000/100+0 x30;dat=Temp%100/10+0 x30;dat1=Temp%10+0 x30;lcd_putchar(ten); lcd_putchar(one);lcd_putchar(0 x2e); lcd_putchar(dat); lcd_putchar(dat1);例6、 DS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《病原生物学研究与实验技巧》课件
- 考勤情况统计
- 办公用品中的健康保健元素探索
- 房地产市场中的文化认同与产品共鸣
- 常年性指甲护理
- 利用区块链优化传统行业中的企业供应链融资模式
- 企业采购员上半年工作总结模版
- 个人中学教育实习总结-实习转正个人工作总结模版
- 双汇瘦肉精事件与其公关失误之危机公关
- 2025年乡镇安全生产工作总结模版
- 《妇产科学》课件-15.3绝经综合征
- 幼儿园中班彩虹泡泡龙课件
- 酒精饮料制作操作指南
- 六年级数学下册 典型例题系列之期中专项练习:解比例或解方程(苏教版)
- 2024年宅基地买卖合同参考模板(四篇)
- 城市地下管网建设项目风险评估报告
- 碳管理系统平台解决方案
- 第36讲 第二次世界大战与战后国际秩序的形成
- 教育部《中小学德育工作指南》-道德修养手册
- JGT163-2013钢筋机械连接用套筒
- DL∕T 782-2001 110kV及以上送变电工程启动及竣工验收规程
评论
0/150
提交评论