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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的0-22V電壓表電路圖+源程序

[復制鏈接]
跳轉到指定樓層
樓主
基于單片機的0-24V電壓表 電路原理圖如下:


單片機源程序如下:
  1. #include"reg52.h"
  2. #include"intrins.h"
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. #define _Nop() _nop_()
  6. unsigned char data_char_table[]= {"0123456789ABCDEF"};                        //LCD數據
  7. unsigned char Lcd_Dis1_table[] = {"Position:No.    "};                        //第一行顯示框架
  8. unsigned char pos_char_table[] = {"             D  "};                        //      顯示位置
  9. unsigned char Lcd_Dis2_table[] = {"Voltage :      V"};                        //第二行顯示框架
  10. unsigned char num_char_table[] = {"         9A.CD V"};                        //      顯示位置
  11. sbit lcd_rs_port=P2^5; //定義 LCD控制端口,根據硬件調整
  12. sbit lcd_rw_port=P2^6;
  13. sbit lcd_en_port=P2^7;
  14. sbit X=P3^4;
  15. sbit Y=P3^3;
  16. sbit Z=P3^2;
  17. #define lcd_data_port P0
  18. void lcd_delay(uchar ms); //LCD1602延時
  19. void lcd_busy_wait(); //LCD1602忙等待
  20. void lcd_command_write(uint command); //LCD1602命令字寫入
  21. void lcd_system_reset(); //LCD1602初始化
  22. void lcd_char_write(uint x_pos,y_pos,lcd_dat); //LCD1602字符寫入
  23. void lcd_bad_check(); //LCD1602壞點檢查
  24. void Num_to_Disp(uchar i,uint Num); //顯示數據處理
  25. void LcdDisp(uchar j,uint num); //液晶顯示函數
  26. float adadverage();
  27. /*****定義與 ADC相關的特殊功能寄存器 *****/
  28. sfr ADC_CONTR= 0xBC; //ADC控制寄存器
  29. sfr ADC_RES = 0xBD; //ADChight8-bitresultregister
  30. sfr ADC_RESL = 0xBE; //ADClow2-bitresultregister
  31. sfr P1ASF = 0x9D; //P1口功能控制寄存器 P1ASF
  32. /************定義相應操作位***************/
  33. #define ADC_POWER 0x80 //ADC電源控制位,0:關閉,1:打開
  34. #define ADC_FLAG 0x10 //ADC結束標志位
  35. #define ADC_START 0x08 //ADC啟動控制位
  36. #define ADC_SPEEDLL 0x00 //540clocks__________選擇轉換速度
  37. void InitADC(); //ADC初始化
  38. uint GetADCResult(uchar ch);
  39. void Delay(uint n); //延時程序
  40. void delay_1ms(uchar x);
  41. void decide();


  42. /*--------------------------------主函數 --------------------------------*/
  43. void main()
  44. {
  45.         lcd_system_reset(); //LCD1602初始化
  46.         lcd_bad_check(); //LCD1602壞點檢查
  47.         InitADC(); //初始化 ADC特殊功能寄存器
  48.         while(1)
  49.         {
  50.                  decide();        
  51.                  Delay(1000);
  52.         }
  53. }
  54. /*--------------------------------域值判斷 ------------------------------*/
  55. void decide()
  56. {
  57.         unsigned int res;
  58.         float NUM;
  59.         NUM=0.0;
  60.         X=1;
  61.         Y=1;
  62.         Z=1;
  63.         res=GetADCResult(0);
  64.         NUM=(res*5.00/1024.0);
  65.         NUM=NUM*5;
  66. if(NUM<4.99)
  67. {
  68.         X=1;
  69.         Y=1;
  70.         Z=0;
  71.         Delay(10);
  72.         LcdDisp(4,adadverage());
  73. }
  74. else if(NUM>=4.99&&NUM<6.24)
  75. {
  76.         X=0;
  77.         Y=0;
  78.         Z=1;
  79.         Delay(10);
  80.         LcdDisp(3,adadverage());
  81. }
  82. else if(NUM>=6.24&&NUM<8.2)
  83. {
  84.         X=1;
  85.         Y=0;
  86.         Z=1;
  87.         Delay(10);
  88.         LcdDisp(2,adadverage());
  89. }
  90. else if(NUM>=8.2&&NUM<12.4)
  91. {
  92.         X=0;
  93.         Y=1;
  94.         Z=1;
  95.         Delay(10);
  96.         LcdDisp(1,GetADCResult(0));
  97. }
  98. else if(NUM>=12.4&&NUM<25.0)
  99. {
  100.         X=1;
  101.         Y=1;
  102.         Z=1;
  103.         Delay(10);
  104.         LcdDisp(0,adadverage());
  105. }
  106.         else
  107.         {
  108.         LcdDisp(8,0);
  109.         }
  110. }
  111. /*--------------------------------ADC取值 ------------------------------*/
  112. uint GetADCResult(uchar ch)
  113. {
  114.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
  115.         _nop_(); //Mustwaitbeforeinquiry
  116.         _nop_();
  117.         _nop_();
  118.         _nop_();

  119.         while(!(ADC_CONTR & ADC_FLAG)); //Waitcompleteflag
  120.         ADC_CONTR &=ADC_FLAG; //Close ADC
  121.         return(ADC_RES*4+ADC_RESL); //ReturnADCresult
  122. }
  123.         /*AD初始化*/
  124.         void InitADC()
  125. {
  126.         P1ASF=P1|0x3f; //Set P1.0-P1.5 as an alogin putport
  127.         ADC_RES =0; //Clearpreviousresult
  128.         ADC_RESL=0;
  129.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
  130.         Delay(20);
  131.         } //ADCpower-ondelayandStartA/Dconversion}
  132. ///////////////以下為 LCD顯示數據處理/////////////////
  133. void Num_to_Disp(uchar i,uint Num)
  134. {
  135.         float NUM;
  136.         int xx,yy,zz,vv;
  137.         NUM=(Num*5.00/1024.0);//計算公式:10-bitA/DConversionResult=1024x(Vin/Vcc)
  138.         switch(i)
  139.         {
  140.         case 0:NUM=NUM*5.10;break;
  141.         case 1:NUM=NUM*2.52;break;
  142.         case 2:NUM=NUM*1.69;break;
  143.         case 3:NUM=NUM*1.27;break;
  144.         case 4:NUM=NUM*1.00;break;
  145.         }
  146.         xx=(int)NUM;
  147.         yy=(int)((NUM-(float)(xx))*10);
  148.         zz=(int)((NUM-(float)(xx))*100)%10;
  149.         vv=(int)((NUM-(float)(xx))*1000)%10;
  150.         num_char_table[9]=data_char_table[xx / 10]; //電壓值十位
  151.         num_char_table[10]=data_char_table[xx % 10]; //電壓值個位
  152.         num_char_table[12]=data_char_table[yy];  //電壓值小數點后一位
  153.         num_char_table[13]=data_char_table[zz]; //電壓值小數點后兩位
  154.         num_char_table[14]=data_char_table[vv]; //電壓值小數點后三位
  155.         pos_char_table[13]=data_char_table[i]; //當前 ADC接口
  156.         }
  157. //////////////////以下為 LCD顯示////////////////////
  158. void LcdDisp(uchar j,uint num)
  159. {
  160.         uint i=0;
  161.         for(i=0;i<16;i++)
  162.         {
  163.                 lcd_char_write(i,0,Lcd_Dis1_table[i]);
  164.                 lcd_char_write(i,1,Lcd_Dis2_table[i]); //顯示框架
  165.                 }
  166.                 Num_to_Disp(j,num);
  167.                 lcd_char_write(13,0,pos_char_table[13]);
  168.                 for(i=9;i<15;i++)
  169.                      {
  170.                         lcd_char_write(i,1,num_char_table[i]); //顯示電壓
  171.                         }
  172.                         delay_1ms(100);
  173.                         }
  174. //////////////以下是 LCD1602驅動程序////////////////

  175. /*LCD1602延時*/
  176. void lcd_delay(uchar ms)
  177. {
  178.         uchar j;
  179.         while(ms--)
  180.         {
  181.                 for(j=0;j<250;j++)
  182.                 {;}
  183.         }
  184. }


  185. /*LCD1602忙等待*/
  186. void lcd_busy_wait()
  187. {
  188.         lcd_rs_port=0;
  189.         lcd_rw_port=1;
  190.         lcd_en_port=1;
  191.         lcd_data_port=0xff;
  192.         while(lcd_data_port&0x80);
  193.         lcd_en_port=0;
  194.         }

  195. /*LCD1602命令字寫入*/
  196. void lcd_command_write(uint command)
  197. {
  198.         lcd_busy_wait();
  199.         lcd_rs_port=0;
  200.         lcd_rw_port=0;
  201.         lcd_en_port=0;
  202.         lcd_data_port=command;
  203.         lcd_en_port=1;
  204.         lcd_en_port=0;
  205. }

  206. /*LCD1602初始化*/
  207. void lcd_system_reset( )
  208. {
  209.         lcd_delay(20);
  210.         lcd_command_write(0x38);
  211.         lcd_delay(100);
  212.         lcd_command_write(0x38);
  213.         lcd_delay(50);
  214.         lcd_command_write(0x38);
  215.         lcd_delay(10);
  216.         lcd_command_write(0x08);
  217.         lcd_command_write(0x01);
  218.         lcd_command_write(0x06);
  219.         lcd_command_write(0x0c);
  220. }

  221. /*LCD1602字符寫入*/
  222. void lcd_char_write(uint x_pos,y_pos,lcd_dat)

  223. {
  224.         x_pos &=0x0f;/*X位置范圍 0~15*/
  225.         y_pos &=0x01;/*Y位置范圍 0~1*/
  226.         if(y_pos==1)
  227.         x_pos +=0x40;
  228.         x_pos +=0x80;

  229.         lcd_command_write(x_pos);
  230.         lcd_busy_wait();
  231.         lcd_rs_port=1;
  232.         lcd_rw_port=0;
  233.         lcd_en_port=0;
  234.         lcd_data_port=lcd_dat;
  235.         lcd_en_port=1;
  236.         lcd_en_port=0;}

  237. /*LCD1602壞點檢查*/
  238. void lcd_bad_check()
  239. {
  240.         char i,j;
  241.         for(i=0;i<2;i++)
  242.         {
  243.                 for(j=0;j<16;j++)
  244.                 {
  245.                 lcd_char_write(j,i,0xff);
  246.                 }
  247.         }
  248.         lcd_delay(200);
  249.         lcd_delay(200);
  250.         lcd_delay(200);
  251.         lcd_delay(100);
  252.         lcd_delay(200);
  253.         lcd_command_write(0x01);/*clearlcddisp*/
  254. }
  255. //////////////////以上是 LCD1602驅動程序////////////////
  256. void Delay(uint n)
  257.         {
  258.         uint x;
  259.         while(n--)
  260.         {
  261.         x=500;
  262.         while(x--);
  263.         }
  264.         }
  265. /*1MS為單位的延時程序*/
  266. void delay_1ms(uchar x)
  267. {
  268.         uchar j;
  269.         while(x--)
  270.         {
  271.         for(j=0;j<125;j++)
  272.         {;}                           
  273.         }
  274. }


  275. float adadverage()
  276. {
  277.         float adverageval;
  278.         unsigned char i;
  279.         for(i=0;i<200;i++)
  280.         {
  281.           adverageval += GetADCResult(0);
  282.         }
  283.           adverageval=adverageval/200;
  284.           return(adverageval);
  285. }
復制代碼

所有資料51hei提供下載:
程序.rar (33.74 KB, 下載次數: 20)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲一区二区三区在线观看 | 精品成人免费一区二区在线播放 | 在线一区二区三区 | 久久免费视频1 | 99re6在线视频 | 亚洲va在线va天堂va狼色在线 | 免费黄色在线观看 | 午夜在线观看视频 | 国产精品高潮呻吟久久 | 欧美日韩在线免费观看 | 亚洲三区在线 | 日韩资源 | 看a网站 | 成人午夜视频在线观看 | 成人免费网站www网站高清 | 日韩一级精品视频在线观看 | 伊人久久麻豆 | 欧美一区二| 亚洲一区二区视频在线播放 | 久久免费大片 | 成人小视频在线观看 | 免费观看一级视频 | 亚洲一区视频在线播放 | 在线视频91 | 2018中文字幕第一页 | 日本免费一区二区三区四区 | 国产精品久久久久999 | 在线一区| 国产精品亚洲一区二区三区在线观看 | 亚洲精品电影网在线观看 | 羞羞视频在线观看免费观看 | 婷婷开心激情综合五月天 | 亚洲一区二区精品视频 | 日韩不卡一区二区 | 最新中文字幕在线 | 亚洲综合首页 | 毛片一区二区三区 | 欧美午夜精品 | 欧美日韩国产精品激情在线播放 | 国产精品视频一二三 | 日韩午夜网站 |