久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4868|回復: 0
打印 上一主題 下一主題
收起左側

6通道PPM轉PWM信號解碼單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:572103 發表于 2019-9-14 23:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. //PPM 解碼程序
  2. //用INT0接PPM信號
  3. //T0計數,用來測量脈寬
  4. //注意,這個不是標準的PPM信號,剛好和PPM信號相位相反
  5. //測得的PPM信號在LCD上顯示
  6. //PPM信號取自天地飛6A接收機
  7. # include <stc.h>
  8. # include <intrins.h>
  9. # define DataPort P0
  10. sbit RS=P2^4;
  11. sbit RW=P2^5;
  12. sbit EN=P2^6;
  13. unsigned char channel=0,i=0;
  14. unsigned int xdata PPM_channel1[10],PPM_channel2[10],PPM_channel3[10],PPM_channel4[10],PPM_channel5[10],PPM_channel6[10];
  15. bit Timer0_OverFlowFlag=0;//定時器0的溢出標志,如果溢出,則有問題;
  16. unsigned char qian,bai,shi,ge;
  17. # define RS_CLR RS=0;
  18. # define RS_SET RS=1;
  19. # define RW_SET RW=1;
  20. # define RW_CLR RW=0;
  21. # define EN_CLR EN=0;
  22. # define EN_SET EN=1;
  23. //和LCD顯示有關的函數定義
  24. void LCD_Check_Busy(void); //查忙函數
  25. void LCD_Clear(void);//清屏函數
  26. void LCD_Init(void);//lcd初始化函數
  27. void LCD_Write_Com(unsigned char com);//控制字寫入函數
  28. void LCD_Write_Data(unsigned char Data);//數據寫入函數
  29. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);//寫入單個字符
  30. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);//寫入字符串
  31. unsigned int filter(unsigned int *s);//中值平局濾波;
  32. void DepartNum(unsigned int temp);//用于分解要顯示的數據
  33. void DelayUs2x(unsigned char t);
  34. void DelayMs(unsigned int t);

  35. void main(void)
  36. {   
  37.     unsigned char *InitIform;
  38. unsigned int temp;
  39. InitIform="Init_is_OK";
  40. LCD_Init();
  41. DelayMs(10);
  42. LCD_Write_String(3,0,InitIform);

  43. //初始化Timer0
  44. TMOD=0x01;//timer0 方式1
  45. ET0=1;//允許timer0中斷
  46. //初始化INT0
  47. IT0=1;//負跳變觸發中斷;
  48. EX0=1;
  49. EA=1;

  50. DelayMs(10000);
  51. while(1)
  52. {
  53.      temp=filter(PPM_channel1);
  54.   DepartNum(temp);
  55.   LCD_Write_Char(0,0,'A');
  56.   LCD_Write_Char(1,0,qian);
  57.   LCD_Write_Char(2,0,bai);
  58.   LCD_Write_Char(3,0,shi);
  59.   LCD_Write_Char(4,0,ge);
  60.      temp=filter(PPM_channel2);   
  61.   DepartNum(temp);
  62.   LCD_Write_Char(5,0,'B');
  63.   LCD_Write_Char(6,0,qian);
  64.   LCD_Write_Char(7,0,bai);
  65.   LCD_Write_Char(8,0,shi);
  66.   LCD_Write_Char(9,0,ge);
  67.      temp=filter(PPM_channel3);
  68.   DepartNum(temp);
  69.   LCD_Write_Char(10,0,'C');
  70.   LCD_Write_Char(11,0,qian);
  71.   LCD_Write_Char(12,0,bai);
  72.   LCD_Write_Char(13,0,shi);
  73.   LCD_Write_Char(14,0,ge);
  74.      temp=filter(PPM_channel4);
  75.   DepartNum(temp);
  76.   LCD_Write_Char(0,1,'D');
  77.   LCD_Write_Char(1,1,qian);
  78.   LCD_Write_Char(2,1,bai);
  79.   LCD_Write_Char(3,1,shi);
  80.   LCD_Write_Char(4,1,ge);
  81.   
  82.      temp=filter(PPM_channel5);
  83.   DepartNum(temp);
  84.   LCD_Write_Char(5,1,'E');
  85.   LCD_Write_Char(6,1,qian);
  86.   LCD_Write_Char(7,1,bai);
  87.   LCD_Write_Char(8,1,shi);
  88.   LCD_Write_Char(9,1,ge);
  89.      temp=filter(PPM_channel6);
  90.   DepartNum(temp);
  91.   LCD_Write_Char(10,1,'F');
  92.   LCD_Write_Char(11,1,qian);
  93.   LCD_Write_Char(12,1,bai);
  94.   LCD_Write_Char(13,1,shi);
  95.   LCD_Write_Char(14,1,ge);
  96. //  DelayMs(1000);
  97. }
  98.       
  99. }

  100. void DelayUs2x(unsigned char t)
  101. {   
  102. while(--t);
  103. }
  104. void DelayMs(unsigned int t)
  105. {
  106.      
  107. while(t--)
  108. {
  109.      //大致延時1mS
  110.      DelayUs2x(245);
  111.   DelayUs2x(245);
  112. }
  113. }
  114. //查忙函數
  115. void LCD_Check_Busy(void)
  116. {
  117. unsigned char i=255;
  118. DataPort= 0xff;
  119. RS_CLR;
  120. RW_SET;
  121. EN_SET;
  122. while(i--&&(DataPort&0x80));
  123. EN_CLR;
  124. }
  125. //控制字寫入函數,入口參數是控制字
  126. void LCD_Write_Com(unsigned char com)
  127. {
  128. LCD_Check_Busy();
  129. RS_CLR;
  130. RW_CLR;
  131. DataPort=com;
  132. EN_SET;
  133. _nop_();
  134. EN_CLR;
  135. }
  136. //寫入數據,入口參數是要寫入的數據
  137. void LCD_Write_Data(unsigned char Data)
  138. {
  139. LCD_Check_Busy();
  140. RS_SET;
  141. RW_CLR;
  142. DataPort=Data;
  143. EN_SET;
  144. _nop_();
  145. EN_CLR;
  146. }
  147. //清屏函數
  148. void LCD_Clear(void )
  149. {
  150. LCD_Write_Com(0x01);
  151. DelayMs(5);  
  152. }
  153. //LCD顯示字符串,入口參數是 字符顯示的位置X(0-15),顯示的行數y(0,1 ),*S顯示的字符串
  154. void LCD_Write_String(unsigned char x,unsigned char y, unsigned char *s)
  155. {
  156. if(y==0) LCD_Write_Com(0x80+x);
  157. else LCD_Write_Com(0xc0+x);
  158. while(*s)
  159. {
  160.   LCD_Write_Data(*s);
  161.   s++;
  162. }
  163. }
  164. //LCD顯示字符串,入口參數是 字符顯示的位置X(0-15),顯示的行數y(0,1 ),Data顯示的字符
  165. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  166. {
  167.   if(y==0) LCD_Write_Com(0x80+x);
  168.   else LCD_Write_Com(0xc0+x);
  169.      DelayMs(1);//a little delay for simulation
  170.   LCD_Write_Data(Data);
  171. }

  172. //lcd初始化函數
  173. void LCD_Init(void)
  174. {
  175. LCD_Write_Com(0x38);// set the display model
  176. DelayMs(5);
  177. LCD_Write_Com(0x08);//turn down the display
  178. //LCD_Write_Com(0x01);//clear the display
  179. LCD_Clear();
  180. LCD_Write_Com(0x06);//set the 光標 moving model
  181. DelayMs(5);
  182. LCD_Write_Com(0x0c);//顯示開和光標設置
  183. }
  184. /****************************************
  185. 用于顯示的數位分解函數,把數據轉化為ASCII碼
  186. 入口參數是要顯示的數據
  187. ****************************************/
  188. void DepartNum(unsigned int temp)
  189. {
  190. qian=temp/1000+0x30;
  191. bai=temp%1000/100+0x30;
  192. shi=temp%100/10+0x30;
  193. ge= temp%10+0x30;
  194. }
  195. void ISIR_INT0(void) interrupt 0
  196. {
  197. unsigned int PPM_temp;
  198. if(TR0)
  199. {
  200.   TR0=0;//停止計數;
  201.   PPM_temp=TH0;
  202.   PPM_temp=(PPM_temp<<8)|TL0;
  203.   TH0=0;
  204.   TL0=0;
  205.   TR0=1;//給TH0和TL0賦初值后重新啟動定時器
  206. }
  207. else
  208. {
  209.   TH0=0;//如果是第一次啟動中斷,則啟動timer0
  210.   TL0=0;
  211.   TR0=1;
  212. }
  213. if(PPM_temp>3000|| Timer0_OverFlowFlag)//判斷引導區
  214. {
  215.   channel=0;
  216.   Timer0_OverFlowFlag=0;
  217.   i++;
  218.   if(i==10) i=0;
  219. }
  220. switch(channel)
  221. {
  222. case 1: PPM_channel1[i]=PPM_temp; break;
  223. case 2: PPM_channel2[i]=PPM_temp; break;
  224. case 3: PPM_channel3[i]=PPM_temp; break;
  225. case 4: PPM_channel4[i]=PPM_temp; break;
  226. case 5: PPM_channel5[i]=PPM_temp; break;
  227. case 6: PPM_channel6[i]=PPM_temp; break;
  228. case 7: break;
  229. case 8: break;
  230. default:break;
  231. }
  232. channel++;
  233. }
  234. void ISIR_Timer0(void) interrupt 1
  235. {
  236. Timer0_OverFlowFlag=1;
  237. }
  238. unsigned int filter(unsigned int *s)
  239. {
  240. unsigned char k,j;
  241. unsigned int sum=0;
  242. unsigned int temp;
  243. for(k=0;k<9;k++)
  244.   for(j=k+1;j<10;j++)   
  245.   if(s[k]>s[j])
  246.   {
  247.    temp=s[k];
  248.    s[k]=s[j];
  249.    s[j]=temp;
  250.   }
  251. for(k=1;k<9;k++)
  252. sum+=s[k];
  253. sum=sum/8;
  254. return sum;
  255. }
復制代碼

評分

參與人數 2黑幣 +65 收起 理由
騰飛的龍 + 15
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区三区在线 | 亚洲天天干 | 成人网在线观看 | 久久久久黄色 | 亚洲国产精品激情在线观看 | 91在线看| 久久综合婷婷 | 在线资源视频 | 亚洲在线一区 | 亚洲欧美日韩精品久久亚洲区 | 人人九九精 | 午夜寂寞影院列表 | 99久久精品国产一区二区三区 | 亚洲男人天堂av | 蜜月aⅴ国产精品 | www.com久久久 | 亚洲一区二区精品 | 久久久网| 欧美激情综合色综合啪啪五月 | 成人免费精品视频 | 男人av的天堂 | 精品日韩一区二区 | 99精品免费在线观看 | 国产精品99久久久久久www | 成人av在线网站 | 黑人巨大精品欧美一区二区免费 | 日韩精品av一区二区三区 | 欧美日韩精品亚洲 | 欧美四虎 | 青草视频在线 | 久久se精品一区精品二区 | 久久不卡视频 | 成人不卡 | 日本午夜免费福利视频 | 久久久精品 | 黄色毛片一级 | av男人的天堂在线 | 国产成人高清视频 | 99国产视频| 欧美精品v国产精品v日韩精品 | 中文字幕亚洲一区二区三区 |