51单片机解码PPM波

上传人:m**** 文档编号:565005064 上传时间:2023-07-28 格式:DOCX 页数:14 大小:16.49KB
返回 下载 相关 举报
51单片机解码PPM波_第1页
第1页 / 共14页
51单片机解码PPM波_第2页
第2页 / 共14页
51单片机解码PPM波_第3页
第3页 / 共14页
51单片机解码PPM波_第4页
第4页 / 共14页
51单片机解码PPM波_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《51单片机解码PPM波》由会员分享,可在线阅读,更多相关《51单片机解码PPM波(14页珍藏版)》请在金锄头文库上搜索。

1、/这是主程序文件,文件名为*.C,下面的1602文件要分开保存,文件名 为 1602.h#include REG52.H#include 1602.hunsigned char channel=0,i=0;unsigned int xdataPPM_channel110,PPM_channel210,PPM_channel310,PPM_channe l410,PPM_channel510,PPM_channel610;bit Timer0_0verFlowFlag=0;/定时器0的溢出标志,如果溢出,则有 问题;unsigned char qian,bai,shi,ge;void Depar

2、tNum(unsigned int temp);unsigned int filter(unsigned int *s);void delay(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+);void main(void)unsigned char *Ini tlform;unsigned int temp;InitIform=PPM Decoding;delay(500);LCD_ini t(8);LCD_Wri te_S tring(3,0,lni tlform);delay(800);TM0D=0x01;/ti

3、mer0 方式 1ET0=1;/允许t imerO中断/初始化INTOIT0=1;/负跳变触发中断;EXO=1;/外中断0中断允许EA=1;/总中断/DelayMs(IOOOO);whilet emp=fil ter(PPM_channel1);/数组DepartNum( temp);LCD_Wri te_Char(O,O,);LCD_Wri te_Char(1,O,qian);LCD_Wri te_Char(2,0,bai);LCD_Wri te_Char(3,0,shi);LCD_Wri te_Char(4,0,ge);temp=filter(PPM_channel2);DepartNum

4、( temp);LCD_Wri te_Char(5,0,);LCD_Wri te_Char(6,O,qian);LCD_Wri te_Char(7,O,bai);LCD_Write_Char(8, O,shi);LCD_Wri te_Char(9,O,ge);temp=filter(PPM_channel3);DepartNum( temp);LCD_Wri te_Char(1O,O,);LCD_Wri te_Char(11,O,qian);LCD_Wri te_Char(12,0,bai);LCD_Wri te_Char(13,0,shi);LCD_Wri te_Char(14,0,ge);

5、temp=filter(PPM_channel4);DepartNum( temp);LCD_Wri te_Char(0,1,);LCD_Wri te_Char(1,1,qian);LCD_Wri te_Char(2,1,bai);LCD_Wri te_Char(3,1,shi);LCD_Wri te_Char(4,1,ge);temp=filter(PPM_channel5); DepartNum( temp);LCD_Wri te_Char(5,1,);LCD_Wri te_Char(6,1,qian);LCD_Wri te_Char(7,1,bai);LCD_Wri te_Char( 8

6、, 1,shi);LCD_Wri te_Char(9,1,ge);temp=filter(PPM_channel6); DepartNum( temp);LCD_Wri te_Char(10,1,);LCD_Wri te_Char(11,1,qian);LCD_Wri te_Char(12,1,bai);LCD_Wri te_Char(13,1,shi);LCD_Wri te_Char(14,1,ge);用于显示的数位分解函数,把数据转化为ASCII码 入口参数是要显示的数据 void DepartNum(unsigned int temp) qian=temp/1000+0x30;bai=t

7、emp%1000/100+0x30;shi=temp%100/10+0x30; ge= temp%10+0x30;void ISIR_INTO(void) int errupt 0/in terrup tO 指明是外部中断0;主要在中断函数这一块。unsigned int PPM_temp=0;if(TR0)TR0=0;/停止计数;/TR0置1时,T1开始工作;TR0置0时,T1停止工作PPM_temp二TH0;PPM_temp=(PPM_temp8)|TL0;while(INT0=0);/等待到高电平TH0=0;TL0=0;TR0=1;/给TH0和TL0赋初值后重新启动定时器elsewhil

8、e(INT0=0);/等待到高电平TH0=0;/如果是第一次启动中断,则启动t imer0TL0=0;TR0=1;/启动计时器if(PPM_ temp3000| Timer0_0verFlowFlag)/判断引导区channel=0;Timer0_0verFlowFlag=0;i+;if(i=10) i=0;switch(channel)channe I的值为0 ;case 1: PPM_channel1i二PPM_temp; break; case 2: PPM_channeI2i=PPM_temp; break; case 3: PPM_channeI3i=PPM_temp; break;

9、 case 4: PPM_channeI4i=PPM_temp; break; case 5: PPM_channeI5i=PPM_temp; break; case 6: PPM_channeI6i=PPM_temp; break; case 7: break;case 8: break; defauIt:break;channel+; void ISIR_Timer0(void) interrupt 1明是定时器中断0 ; Timer0_0verFlowFlag=1;是65536us,理论上不会溢出,如果溢出则出错, unsigned int filter(unsigned int *s)

10、 序后进行求平均值(直接求平均值即可)。 unsigned char k,j;unsigned int sum=0;/* unsigned int temp;for(k=0;k9;k+)/当第一次启动里,/interrupt 1 指/t imer0最大值重新从通道1开始/这个函数是先排for(j=k+1;j10;j+)t emp=sk; sk=sj; sj二t emp; */到这里是形成一个从小到在的数组for(k=1;k9;k+)/这里既然求平均值,为何还要排列大小呢?sum+=sk;/我觉得这个方法完全没有必要。sum=sum/8;return sum;/*LCD1602 驱动,兼容 LC

11、D2402*/ sbit LCD_DB0= POO; sbit LCD_DB1= PO; sbit LCD_DB2= PO八2; sbit LCD_DB3= PO八3;sbit LCD_DB4二 P04;sbit LCD_DB5= PO八5;sbit LCD_DB6= PO6;sbit LCD_DB7= PO八7;sbit LCD1602_RS二P24;sbit LCD1602_RW=P25;sbit LCD1602_EN=P26;void LCD_Wri te_Char( unsigned x,unsigned char y,unsigned char da t); /在指定位置显示字符vo

12、id LCD_Wri te_String(unsigned char X,unsigned char Y,unsigned char *s);/在指定位置显示字符串void LCD_cls(void);/清屏void LCD_en_command(unsigned char command);void LCD_en_dat(unsigned char temp);void LCD_set_xy( unsigned char x, unsigned char y );void LCD_ini t(unsigned char bw);void SET_LCD(unsigned char IO_te

13、mp);void delayms(unsigned char ms);void lcddelay(void);unsigned char LCDIO;unsigned char BitWidth;void LCD_cls(void)/这不函数是否需要调用?LCD_en_command(0x01); /0x01 清屏 delayms(2);void LCD_en_command(unsigned char command) -LCD1602_RS=0;LCD1602_RW=0;LCD1602_EN=0;switch(BitWidth)case 4:LCDIO=(command & OxfO);

14、/取高 4 位 break;case 8:LCDIO二command; break;SET_LCD(LCDIO);LCD1602_EN=1;IcddelayO;LCD1602_EN=0;if (Bi tWid th=4)LCDIO=(command & 0x0f)4;/取低 4 位SET_LCD(LCDIO);LCD1602_EN=1;IcddelayO;LCD1602_EN=0;void SET_LCD(unsigned char IO_temp) - -/高4位LCD_DB7=IO_temp&0x80;LCD_DB6=IO_temp&0x40;LCD_DB5=IO_temp&0x20;LCD_DB4=IO_temp&0x10;/低4位if (Bi tWid th=8)LCD_DB3=IO_temp&0x08;LCD_DB2=IO_temp&0x04;LCD_DB1=IO_temp&0x02;LCD_DB0=IO_temp&OxO1;-void LCD_en_dat(unsigned char dat) -LCD1602

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号