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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

低頻數字式相位測量儀Proteus仿真+單片機代碼設計

  [復制鏈接]
跳轉到指定樓層
樓主
基于51單片機的低頻數字式相位測量儀
2019全國電子設計大賽第一階段C題
仿真and程序文件

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機源程序如下:
  1. #include <reg52.h>
  2. unsigned long int fre;
  3. unsigned long int per;
  4. unsigned char time;
  5. unsigned int count;
  6. unsigned long int count1;
  7. sbit   LCD_RS=P1^0;          //片選信號
  8. sbit   LCD_RW=P1^1;          //讀寫信號
  9. sbit   LCD_E=P1^2;           //使能信號
  10. sbit   P20=P2^0;
  11. #define LCD_DB  P0        //數據信號
  12. unsigned char character[10]={0};//在屏幕上顯示的字符串
  13. unsigned char character_1[]={"Fre= Hz"};
  14. unsigned char percentage[10]={0};//在屏幕上顯示的字符串
  15. unsigned char percentage_1[]={"Per= Deg"};
  16. void LCD_init(void);//初始化函數   
  17. void LCD_write_command(unsigned char command);//寫指令函數         
  18. void LCD_write_data(unsigned char dat);//寫數據函數          
  19. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
  20. void delay_n40us(unsigned int n);//延時函數
  21. void timer1_init();            //中斷初始化函數  
  22. //-----------------------------延時函數---------------------------
  23. void delay_n40us(unsigned int n)                  //延時函數
  24. {
  25.         unsigned int i;
  26.         unsigned char j;            
  27.         for(i=n;i>0;i--)
  28.         for(j=0;j<2;j++);         
  29. }
  30. void delay_1s()
  31. {
  32.         unsigned int i,j;
  33.         for(i = 0;i<100;i++)
  34.                 for(j = 0;j<1000;j++);
  35. }
  36. //---------------------lcd1602液晶顯示函數--------------------                                    
  37. void LCD_init(void)         //液晶初始化函數
  38. {
  39.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  40.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  41.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  42.         LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  43.         LCD_write_command(0x06);//設定輸入方式,增量不移位
  44.         LCD_write_command(0x01);//清除屏幕顯示          
  45.         delay_n40us(100);//清屏延時
  46. }
  47. void LCD_write_command(unsigned char dat)  //寫命令函數
  48. {
  49.         LCD_DB=dat;
  50.         LCD_RS=0;//指令         
  51.         LCD_RW=0;//寫入         
  52.         LCD_E=1; //使能          
  53.         LCD_E=0;
  54.         delay_n40us(1);//寫命令延時   
  55. }         
  56. void LCD_write_data(unsigned char dat)          //寫數據函數
  57. {
  58.         LCD_DB=dat;
  59.         LCD_RS=1;//數據          
  60.         LCD_RW=0;//寫入          
  61.         LCD_E=1;//使能  
  62.         LCD_E=0;
  63.         delay_n40us(1);         //寫數據延時
  64. }
  65. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個字符
  66. {
  67.         unsigned char address;
  68.         if(y==1)
  69.                  address=0x80+x;         //顯示在第一排的時候的x的地址
  70.         else
  71.                  address=0xc0+x;         //顯示在第二排的時候的x的地址
  72.         LCD_write_command(address);         //輸入地址
  73.         LCD_write_data(dat);                 //輸入數據
  74. }
  75. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數字
  76. {
  77.         unsigned char address;
  78.         if(y==1)
  79.                  address=0x80+x;         //顯示在第一排的時候的x的地址
  80.         else
  81.                  address=0xc0+x;         //顯示在第二排的時候的x的地址
  82.         LCD_write_command(address);         //輸入地址
  83.         LCD_write_data(dat+48);                 //輸入數據
  84. }
  85. void dis_num1(void)
  86. {
  87.         unsigned char i=0,j=0,k=0;
  88.         LCD_write_command(0x01);//清除屏幕顯示
  89.         character[0] = fre/10000000;
  90.         character[1] = fre/1000000%10;
  91.         character[2] = fre/100000%10;
  92.         character[3] = fre/10000%10;
  93.         character[4] = fre/1000%10;
  94.         character[5] = fre/100%10;
  95.         character[6] = fre/10%10;
  96.         character[7] = fre%10;
  97.     character[8] = 'H';
  98.         character[9] = 'z';
  99.         for(i = 0;i<4;i++)                 //顯示“fre=”
  100.         {
  101.                  LCD_disp_char(i+0,1,character_1[i]);
  102.         }
  103.         for(i = 0;i<10;i++)         //判斷第一個不為0的數
  104.         {
  105.                 if(character[i]!=0)
  106.                         break;
  107.         }
  108.         k = 8-i;
  109.         for(j = 0;j<k;j++)         //顯示所有的數字
  110.         {
  111.                         LCD_disp_num(4+j,1,character[i++]);       
  112.         }
  113.     for(i = 5;i<7;i++)         //顯示“Hz”
  114.         {
  115.                  LCD_disp_char(j+4,1,character_1[i]);
  116.                 j++;
  117.         }
  118. }
  119. void dis_num2(void)
  120. {
  121.         unsigned char i=0,j=0,k=0;
  122.         LCD_write_command(0x10);//清除屏幕顯示       
  123.         percentage[0] = per/100;
  124.         percentage[1] = per/10%10;
  125.         percentage[2] = per%10;
  126.         percentage[3] = 'd';
  127.         percentage[4] = 'e';
  128.         percentage[5] = 'g';
  129.        
  130.         for(i = 0;i<4;i++)                 //顯示per
  131.         {
  132.                  LCD_disp_char(i+0,1,percentage_1[i]);
  133.         }
  134.         for(i = 0;i<10;i++)         //判斷第一個不為0的數
  135.         {
  136.                 if(percentage[i]!=0)
  137.                         break;
  138.         }
  139.         k = 3-i;
  140.         for(j = 0;j<k;j++)         //顯示所有的數字
  141.         {
  142.                         LCD_disp_num(4+j,1,percentage[i++]);       
  143.         }
  144.        
  145.     for(i = 5;i<8;i++)         //顯示%
  146.         {
  147.                  LCD_disp_char(j+4,1,percentage_1[i]);
  148.                 j++;
  149.         }
  150. }
  151. //----------------主函數--------------------
  152. void main()
  153. {  
  154.      int i;
  155.          if(P20==1)
  156.          i=1;
  157.          else
  158.          i=0;
  159.          while(1)
  160.      {
  161.            if(P20==1&&i==1)
  162.            timer1_init();
  163.            while(P20==1)
  164.        {
  165.              LCD_init();
  166.                  dis_num1();         //顯示
  167.                  delay_1s();
  168.                  i=0;
  169.            }
  170.            if(P20==0&&i==0)
  171.            timer1_init();
  172.        while(P20==0)
  173.        {
  174.                  LCD_init();
  175.                  dis_num2();
  176.          delay_1s();
  177.                  i=1;
  178.        }
  179.         }
  180. }
  181. //-------------------定時/計數器初始化--------------
  182. void timer1_init(void)         //定時/計數器初始化
  183. {
  184.         TMOD=0xA6;                //計數器0和定時器1工作工作方式2,自動重裝初值
  185.         TH0=0;                    //計數器初值為0
  186.         TL0=0;
  187.         TR0=1;                    //計數器開始計數
  188.         ET0=1;                    //打開計數器0中斷
  189.         TH1=0;                    //定時器高位,初值設為0
  190.     TL1=0;                    //定時器低位,初值設為0
  191.         TR1=1;                    //定時器開始計數   
  192.         ET1=1;                    //打開計數器1中斷   
  193.         RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
  194.         RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產生時自動使TH2=RCAP2H,TL2=RCAP2L。
  195.         TH2=RCAP2H;               //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)
  196.         TL2=RCAP2L;
  197.         ET2=1;                    //打開定時器2中斷         
  198.         TR2=1;                    //定時器2開始計時  
  199.         EA=1;                     //開總中斷   
  200. }
  201. //------------------中斷函數----------------------
  202. void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
  203. {
  204.         time++;
  205.         TF2=0;                    //定時器2的中斷標志位TF2不能夠由硬件清零,所以要在中斷服務程序中將其清零
  206.         if (time==16)             //定時1s時間到  
  207.         {
  208.            time=0;                //計時清0
  209.            EA=0;                  //關中斷                 
  210.            fre=(long)count*256+TL0;     //count*256強制轉換成long型
  211.            per=(long)360-(360*(count1*256+TL1)/(16*62500)); //計算相位差
  212.            TL0=0;                 //清零計數器0計數            
  213.            TL1=0;
  214.            count=0;               //清零計數器0計數          
  215.            count1=0;
  216.            EA=1;                  //開中斷            
  217.         }
  218. }
  219. //----------------------------------------------------------------
  220. void timer0(void) interrupt 1 //計數器0中斷         
  221. {
  222.         count++;
  223. }               
  224. //----------------------------------------------------------------
  225. void timer1(void) interrupt 3 //定時器1中斷
  226. {
  227.         count1++;
  228. }
復制代碼

所有資料51hei提供下載:
低頻數字式相位測量儀.zip (243.98 KB, 下載次數: 160)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:328014 發表于 2019-5-30 18:37 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:324446 發表于 2019-9-5 10:22 | 只看該作者
非常好
回復

使用道具 舉報

地板
ID:208271 發表于 2019-12-2 11:19 | 只看該作者
感謝樓主分享,仿真文件是Proteus 8.0版本嗎,一直找不開,能再發一下仿真原文件嗎?萬分感謝!
回復

使用道具 舉報

5#
ID:727525 發表于 2020-4-12 14:30 | 只看該作者
好資料,謝謝樓主,幫到很多
回復

使用道具 舉報

6#
ID:737014 發表于 2020-4-24 14:52 | 只看該作者
感謝樓主,很有幫助
回復

使用道具 舉報

7#
ID:718181 發表于 2020-4-25 22:29 | 只看該作者
這個的測量原理是什么呢
回復

使用道具 舉報

8#
ID:440960 發表于 2020-5-4 10:06 | 只看該作者
wifingtta 發表于 2019-12-2 11:19
感謝樓主分享,仿真文件是Proteus 8.0版本嗎,一直找不開,能再發一下仿真原文件嗎?萬分感謝!

你好 請問你有仿真源文件了嗎 我也打不開
回復

使用道具 舉報

9#
ID:589800 發表于 2020-6-7 21:16 | 只看該作者
51hei團團 發表于 2019-5-30 18:37
好資料,51黑有你更精彩!!!

請問這哥仿真可以運行嘛
回復

使用道具 舉報

10#
ID:918938 發表于 2021-5-12 12:42 來自觸屏版 | 只看該作者
樓主能設計實現其他功能的嗎?
回復

使用道具 舉報

11#
ID:1124709 發表于 2024-6-11 18:59 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 999精品视频 | 久久久久国产精品午夜一区 | 精品综合久久 | 日本精品一区二区三区视频 | 黑人中文字幕一区二区三区 | www.久久久 | 久久这里有精品 | 99中文字幕 | 日本a视频 | 国产在线一区二 | 亚洲一区精品在线 | 精品久久国产 | 91免费在线视频 | 国产精品久久久久久久久久 | 日本一二三区在线观看 | 欧美成人a| 成人在线精品视频 | 国产成人免费 | 青草久久免费视频 | 成人久久久久 | 三a毛片 | 久久国产精品久久国产精品 | 91久久电影| 亚洲激情在线观看 | 岛国av免费看 | 亚洲欧美在线视频 | 精品欧美一区二区精品久久久 | 天天色综| 国产伦精品一区二区三毛 | 日本特黄a级高清免费大片 特黄色一级毛片 | 免费看国产一级特黄aaaa大片 | 欧美激情欧美激情在线五月 | 免费av电影网站 | 午夜精品网站 | 久草在线青青草 | 国产一区二区在线免费观看 | 免费在线观看成人av | 欧美日韩综合视频 | 亚洲视频免费在线播放 | 欧美日韩成人 | 婷婷综合五月天 |