找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)數(shù)字電壓表,溫度檢測(cè),計(jì)算器仿真設(shè)計(jì)+代碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:430683 發(fā)表于 2018-11-21 17:55 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式






內(nèi)含4種課程設(shè)計(jì)

單片機(jī)源程序如下:
  1. /*******************************************************************************************/
  2. //   單片機(jī)原理與應(yīng)用課程設(shè)計(jì)
  3. //   題目:數(shù)字電壓表設(shè)設(shè)計(jì)
  4. //   要點(diǎn):1、用單片機(jī)內(nèi)部10位ADC對(duì)電位器上的0-5V范圍內(nèi)變化的直流電壓進(jìn)行測(cè)量,用LCD1602顯示測(cè)量結(jié)果
  5. //       2、用PROTEUS仿真
  6. //       3、焊接電路板并調(diào)試運(yùn)行
  7. //   出品:濰坊學(xué)院信息與控制工程學(xué)院
  8. //   編程:戴曰章
  9. //   日期:2014年12月
  10. //   注意:該程序1602顯示應(yīng)該沒(méi)有問(wèn)題,因?yàn)镻ROTEUS不能對(duì)STC12C5A60S2的AD進(jìn)行仿真,
  11. /*******************************************************************************************/

  12. #include<reg52.h>
  13. #include<intrins.h>
  14. #define uchar unsigned char
  15. #define uint unsigned int

  16. #define     LCDIO      P0  //1602數(shù)據(jù)口


  17. sbit rs=P2^0;  //1602數(shù)據(jù)命令選擇引腳
  18. sbit rd=P2^1;        //讀寫(xiě)選擇
  19. sbit lcden=P2^2;        //1602選通引腳

  20. uint tvalue=0;//擬輸出的值
  21.   


  22. uchar code table[]=        {"Current voltage "};    //每行顯示16個(gè)字符
  23. uchar code table1[]=        {"is:  00.00V wfu "};

  24. uchar data disdata[5];



  25. /*------------------------以下為ADC相應(yīng)寄存器初始化及端口定義-------------*/                           
  26. /***** 定義與ADC相關(guān)的特殊功能寄存器 *****/
  27.                         
  28. sfr  ADC_CONTR =  0xBC;                            //ADC控制寄存器                    
  29. sfr  ADC_RES  =  0xBD;                             //ADC hight 8-bit result register
  30. sfr  ADC_RESL  =  0xBE;                            //ADC low 2-bit result register
  31. sfr  P1ASF     =  0x9D;                            //P1口功能控制寄存器P1ASF

  32. /************定義相應(yīng)操作位***************/
  33. #define  ADC_POWER          0x80            //ADC電源控制位,0:關(guān)閉,1:打開(kāi)
  34. #define  ADC_FLAG           0x10            //ADC結(jié)束標(biāo)志位
  35. #define  ADC_START          0x08            //ADC啟動(dòng)控制位
  36. #define  ADC_SPEEDLL        0x00            //540 clocks___________選擇轉(zhuǎn)換速度

  37. /*------------------------以下為相關(guān)函數(shù)聲明------------------------------*/
  38. void InitADC();                                                                                                        //ADC初始化
  39. uint GetADCResult(uchar ch);                                                                                                                                                                        
  40. void delay(uint n);                                                                                         //延時(shí)程序


  41. /*-------------------------------- ADC 取值 ------------------------------*/
  42. uint GetADCResult(uchar ch)
  43. {
  44.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  45.           _nop_();                                        //Must wait before inquiry
  46.           _nop_();
  47.           _nop_();
  48.           _nop_();
  49.           while (!(ADC_CONTR & ADC_FLAG));                //Wait complete flag
  50.           ADC_CONTR &= ADC_FLAG;                          //Close ADC

  51.           return (ADC_RES*4 + ADC_RESL);                  //Return ADC result
  52. }
  53.                                           
  54. /*---------------------------- 初始化ADC特殊功能寄存器 -------------------*/

  55. void InitADC( )
  56. {
  57.           P1ASF = P1 | 0x3f;                //Set  P1.0 - P1.5 as analog input port
  58.           ADC_RES  = 0;                  //Clear previous result
  59.                   ADC_RESL = 0;
  60.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
  61.           delay(20);                      //ADC power-on delay and Start A/D conversion
  62. }           


  63. void delay(uint z)        //短延時(shí)
  64. {
  65.         uint x,y;
  66.         for(x=z;x>0;x--)
  67.                 for(y=110;y>0;y--);
  68. }

  69. void write_com(uchar com)        //1602寫(xiě)命令子程序
  70. {
  71.         rs=0;                //RS是數(shù)據(jù)命令選擇短,高電平寫(xiě)數(shù)據(jù),低電平寫(xiě)命令
  72.         rd=0;                //RD是讀寫(xiě)選擇短,高電平讀,低電平寫(xiě)
  73.         lcden=0;        //1602選通端,高電平選通,低電平禁止
  74.         LCDIO=com;
  75.         delay(5);
  76.         lcden=1;
  77.         delay(5);
  78.         lcden=0;        
  79. }

  80. void write_date(uchar date)        //1602寫(xiě)數(shù)據(jù)子程序
  81. {
  82.         rs=1;        //RS是數(shù)據(jù)命令選擇短,高電平寫(xiě)數(shù)據(jù),低電平寫(xiě)命令
  83.         rd=0;        //RD是讀寫(xiě)選擇短,高電平讀,低電平寫(xiě)
  84.         lcden=0;        //1602選通端,高電平選通,低電平禁止
  85.         LCDIO=date;
  86.         delay(5);
  87.         lcden=1;
  88.         delay(5);
  89.         lcden=0;        
  90. }



  91. void init()                                //1602初始化程序
  92. {
  93.         uchar num;
  94.         lcden=0;

  95.         write_com(0x38);        //0011 1000B,功能模式設(shè)置,設(shè)置為8為數(shù)據(jù)口,兩行顯示,5*7點(diǎn)陣
  96.         write_com(0x0c);        //0000 1011B,顯示開(kāi)及光標(biāo)設(shè)置,關(guān)顯示,顯示光標(biāo),光標(biāo)閃爍
  97.         write_com(0x06);        //0000 0110B,顯示光標(biāo)移動(dòng)設(shè)置,讀或?qū)懸粋(gè)字符,地址指針減一且光標(biāo)減一,寫(xiě)一個(gè)字符屏幕顯示不移動(dòng)
  98.         write_com(0x01);        //0000 0001B,顯示清屏,數(shù)據(jù)指針和所有顯示清屏
  99.         write_com(0x80);        //1000 000B,關(guān)閉顯示
  100.         delay(5);
  101.         write_com(0x80);        //1000 000B,設(shè)置為2行顯示,寫(xiě)入第一行字符的地址,第一行地址是00-2F
  102.         for(num=0;num<16;num++)
  103.                 {
  104.                         write_date(table[num]);        //寫(xiě)入第一行數(shù)據(jù)
  105.                         delay(5);
  106.                 }
  107.         write_com(0x80+0x40);        //1100 0000B,設(shè)置為2行顯示,寫(xiě)入第二行字符的地址,第而行地址是40-67
  108.         for(num=0;num<16;num++)        //寫(xiě)入第二行數(shù)據(jù)
  109.                 {
  110.                         write_date(table1[num]);//寫(xiě)入第二行數(shù)據(jù)
  111.                         delay(5);
  112.                 }      
  113.         

  114. }



  115. void convert(uint n)
  116. {

  117.         float NUM;
  118.         int xx, yy, zz;

  119.         NUM = (n * 5/ 1024.0);        //計(jì)算公式:10-bit A/D Conversion Result = 1024 x (Vin / Vcc)
  120.         xx = (int)NUM;
  121.         yy = (int)((NUM - (float)(xx)) * 10);
  122.         zz = (int)((NUM - (float)(xx)) * 100)%10;  

  123.         disdata[0] =xx / 10+0x30;                //電壓值十位
  124.         disdata[1] =xx % 10+0x30;                //電壓值個(gè)位
  125.         disdata[2] =yy+0x30;                        //電壓值小數(shù)點(diǎn)后一位
  126.         disdata[3] =zz+0x30;                        //電壓值小數(shù)點(diǎn)后兩位?



  127.      if(disdata[0]==0x30)
  128.            {disdata[0]=0x20;//如果十位為0,不顯示
  129.                
  130.                 }



  131. }








  132. void ds1602disp()//溫度值顯示
  133.         {

  134.    


  135.            write_com(0x80+0x45);
  136.            write_date(disdata[0]);//顯示百位
  137.            write_com(0x80+0x46);
  138.            write_date(disdata[1]);//顯示十位         
  139.            write_com(0x80+0x47);
  140.     write_date(0x2e);//顯示小數(shù)點(diǎn)
  141.                
  142.            write_com(0x80+0x48);
  143.         
  144.            write_date(disdata[2]);//顯示x小數(shù)
  145.            write_com(0x80+0x49);
  146.            write_date(disdata[3]);//顯示小數(shù)位
  147.            write_com(0x80+0x4a);
  148.            write_date('V');
  149.    }



  150. void main()
  151. {        
  152.         init();
  153.         convert(tvalue);
  154.         ds1602disp();//顯示
  155.         InitADC();                                      //初始化ADC特殊功能寄存器

  156.         while(1)
  157.         {
  158.                 tvalue=GetADCResult(0);      //轉(zhuǎn)換輸入電壓值(P1.0 - P1.7對(duì)應(yīng)數(shù)字0-7,當(dāng)前對(duì)應(yīng)0)
  159. //                                                  tvalue=1023;

  160.         convert(tvalue);

  161.         delay(1000);


  162.          ds1602disp();//顯示

  163.         }

  164. }
復(fù)制代碼

所有資料51hei提供下載:
原理圖-仿真-程序-參考資料.7z (961.18 KB, 下載次數(shù): 796)


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

使用道具 舉報(bào)

沙發(fā)
ID:316073 發(fā)表于 2018-11-26 21:17 | 只看該作者
太謝謝了
回復(fù)

使用道具 舉報(bào)

板凳
ID:435796 發(fā)表于 2018-11-29 16:33 | 只看該作者
太謝謝了
回復(fù)

使用道具 舉報(bào)

地板
ID:57433 發(fā)表于 2019-3-4 19:12 | 只看該作者
謝謝,都是些好程序
回復(fù)

使用道具 舉報(bào)

5#
ID:866713 發(fā)表于 2020-12-23 22:43 | 只看該作者
很不錯(cuò)  可以換成at89c52嗎,
回復(fù)

使用道具 舉報(bào)

6#
ID:994772 發(fā)表于 2021-12-21 08:14 | 只看該作者
謝謝,這個(gè)程序很好
回復(fù)

使用道具 舉報(bào)

7#
ID:487266 發(fā)表于 2022-3-12 18:57 | 只看該作者
溫度測(cè)量的不準(zhǔn)啊,是不是我版本的問(wèn)題
回復(fù)

使用道具 舉報(bào)

8#
ID:1057652 發(fā)表于 2022-12-15 09:04 | 只看該作者
太棒了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表