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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5995|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:409013 發(fā)表于 2019-5-27 11:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機的低頻數(shù)字式相位測量儀
2019全國電子設(shè)計大賽第一階段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        //數(shù)據(jù)信號
  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);//初始化函數(shù)   
  17. void LCD_write_command(unsigned char command);//寫指令函數(shù)         
  18. void LCD_write_data(unsigned char dat);//寫數(shù)據(jù)函數(shù)          
  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);//延時函數(shù)
  21. void timer1_init();            //中斷初始化函數(shù)  
  22. //-----------------------------延時函數(shù)---------------------------
  23. void delay_n40us(unsigned int n)                  //延時函數(shù)
  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液晶顯示函數(shù)--------------------                                    
  37. void LCD_init(void)         //液晶初始化函數(shù)
  38. {
  39.         LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
  40.         LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
  41.         LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
  42.         LCD_write_command(0x0c);//整體顯示,關(guān)光標,不閃爍
  43.         LCD_write_command(0x06);//設(shè)定輸入方式,增量不移位
  44.         LCD_write_command(0x01);//清除屏幕顯示          
  45.         delay_n40us(100);//清屏延時
  46. }
  47. void LCD_write_command(unsigned char dat)  //寫命令函數(shù)
  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)          //寫數(shù)據(jù)函數(shù)
  57. {
  58.         LCD_DB=dat;
  59.         LCD_RS=1;//數(shù)據(jù)          
  60.         LCD_RW=0;//寫入          
  61.         LCD_E=1;//使能  
  62.         LCD_E=0;
  63.         delay_n40us(1);         //寫數(shù)據(jù)延時
  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);                 //輸入數(shù)據(jù)
  74. }
  75. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數(shù)字
  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);                 //輸入數(shù)據(jù)
  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的數(shù)
  104.         {
  105.                 if(character[i]!=0)
  106.                         break;
  107.         }
  108.         k = 8-i;
  109.         for(j = 0;j<k;j++)         //顯示所有的數(shù)字
  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的數(shù)
  135.         {
  136.                 if(percentage[i]!=0)
  137.                         break;
  138.         }
  139.         k = 3-i;
  140.         for(j = 0;j<k;j++)         //顯示所有的數(shù)字
  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. //----------------主函數(shù)--------------------
  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. //-------------------定時/計數(shù)器初始化--------------
  182. void timer1_init(void)         //定時/計數(shù)器初始化
  183. {
  184.         TMOD=0xA6;                //計數(shù)器0和定時器1工作工作方式2,自動重裝初值
  185.         TH0=0;                    //計數(shù)器初值為0
  186.         TL0=0;
  187.         TR0=1;                    //計數(shù)器開始計數(shù)
  188.         ET0=1;                    //打開計數(shù)器0中斷
  189.         TH1=0;                    //定時器高位,初值設(shè)為0
  190.     TL1=0;                    //定時器低位,初值設(shè)為0
  191.         TR1=1;                    //定時器開始計數(shù)   
  192.         ET1=1;                    //打開計數(shù)器1中斷   
  193.         RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
  194.         RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產(chǎn)生時自動使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. //------------------中斷函數(shù)----------------------
  202. void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
  203. {
  204.         time++;
  205.         TF2=0;                    //定時器2的中斷標志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
  206.         if (time==16)             //定時1s時間到  
  207.         {
  208.            time=0;                //計時清0
  209.            EA=0;                  //關(guān)中斷                 
  210.            fre=(long)count*256+TL0;     //count*256強制轉(zhuǎn)換成long型
  211.            per=(long)360-(360*(count1*256+TL1)/(16*62500)); //計算相位差
  212.            TL0=0;                 //清零計數(shù)器0計數(shù)            
  213.            TL1=0;
  214.            count=0;               //清零計數(shù)器0計數(shù)          
  215.            count1=0;
  216.            EA=1;                  //開中斷            
  217.         }
  218. }
  219. //----------------------------------------------------------------
  220. void timer0(void) interrupt 1 //計數(shù)器0中斷         
  221. {
  222.         count++;
  223. }               
  224. //----------------------------------------------------------------
  225. void timer1(void) interrupt 3 //定時器1中斷
  226. {
  227.         count1++;
  228. }
復(fù)制代碼

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


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

請問這哥仿真可以運行嘛
回復(fù)

使用道具 舉報

10#
ID:918938 發(fā)表于 2021-5-12 12:42 來自手機 | 只看該作者
樓主能設(shè)計實現(xiàn)其他功能的嗎?
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品视频一区二区三区 | 国产精品久久久久久久久 | 亚洲一区二区精品视频 | 欧美国产视频 | 国产色99 | 日韩欧美高清 | 中文字幕第5页 | 日韩视频在线免费观看 | 午夜激情小视频 | 欧美爱爱视频网站 | 国产精品成人在线播放 | www.操com | 无码日韩精品一区二区免费 | 欧美电影网 | 男女羞羞视频在线免费观看 | 欧美精品在线视频 | 欧美视频1区 | 一区二区高清 | 欧美一级欧美一级在线播放 | 国产在线观看一区二区三区 | 啪一啪在线视频 | 中文一区 | 日韩中文不卡 | 天久久| 99国产精品一区二区三区 | 成人免费观看网站 | 成人av鲁丝片一区二区小说 | 欧美日韩在线成人 | 久久精品国产一区二区 | 精品国产一区久久 | 久久九九免费 | 国产精品久久久久久久久久久免费看 | av网站在线免费观看 | 2022精品国偷自产免费观看 | 欧美不卡一区二区 | 亚洲精品在线看 | 日本天堂一区 | 国精日本亚洲欧州国产中文久久 | 色婷婷国产精品综合在线观看 | 新疆少妇videos高潮 | 国产一区二区三区 |