找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9091|回复: 7
收起左侧

单片机数字电压表,温度检测,计算器仿真设计+代码

  [复制链接]
ID:430683 发表于 2018-11-21 17:55 | 显示全部楼层 |阅读模式
2.png

1.png

程序

程序


内含4种课程设计
0.png
单片机源程序如下:
  1. /*******************************************************************************************/
  2. //   单片机原理与应用课程设计
  3. //   题目:数字电压表设设计
  4. //   要点:1、用单片机内部10位ADC对电位器上的0-5V范围内变化的直流电压进行测量,用LCD1602显示测量结果
  5. //       2、用PROTEUS仿真
  6. //       3、焊接电路板并调试运行
  7. //   出品:潍坊学院信息与控制工程学院
  8. //   编程:戴曰章
  9. //   日期:2014年12月
  10. //   注意:该程序1602显示应该没有问题,因为PROTEUS不能对STC12C5A60S2的AD进行仿真,
  11. /*******************************************************************************************/

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

  16. #define     LCDIO      P0  //1602数据口


  17. sbit rs=P2^0;  //1602数据命令选择引脚
  18. sbit rd=P2^1;        //读写选择
  19. sbit lcden=P2^2;        //1602选通引脚

  20. uint tvalue=0;//拟输出的值
  21.   


  22. uchar code table[]=        {"Current voltage "};    //每行显示16个字符
  23. uchar code table1[]=        {"is:  00.00V wfu "};

  24. uchar data disdata[5];



  25. /*------------------------以下为ADC相应寄存器初始化及端口定义-------------*/                           
  26. /***** 定义与ADC相关的特殊功能寄存器 *****/
  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. /************定义相应操作位***************/
  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            //540 clocks___________选择转换速度

  37. /*------------------------以下为相关函数声明------------------------------*/
  38. void InitADC();                                                                                                        //ADC初始化
  39. uint GetADCResult(uchar ch);                                                                                                                                                                        
  40. void delay(uint n);                                                                                         //延时程序


  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)        //短延时
  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写命令子程序
  70. {
  71.         rs=0;                //RS是数据命令选择短,高电平写数据,低电平写命令
  72.         rd=0;                //RD是读写选择短,高电平读,低电平写
  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写数据子程序
  81. {
  82.         rs=1;        //RS是数据命令选择短,高电平写数据,低电平写命令
  83.         rd=0;        //RD是读写选择短,高电平读,低电平写
  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,功能模式设置,设置为8为数据口,两行显示,5*7点阵
  96.         write_com(0x0c);        //0000 1011B,显示开及光标设置,关显示,显示光标,光标闪烁
  97.         write_com(0x06);        //0000 0110B,显示光标移动设置,读或写一个字符,地址指针减一且光标减一,写一个字符屏幕显示不移动
  98.         write_com(0x01);        //0000 0001B,显示清屏,数据指针和所有显示清屏
  99.         write_com(0x80);        //1000 000B,关闭显示
  100.         delay(5);
  101.         write_com(0x80);        //1000 000B,设置为2行显示,写入第一行字符的地址,第一行地址是00-2F
  102.         for(num=0;num<16;num++)
  103.                 {
  104.                         write_date(table[num]);        //写入第一行数据
  105.                         delay(5);
  106.                 }
  107.         write_com(0x80+0x40);        //1100 0000B,设置为2行显示,写入第二行字符的地址,第而行地址是40-67
  108.         for(num=0;num<16;num++)        //写入第二行数据
  109.                 {
  110.                         write_date(table1[num]);//写入第二行数据
  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);        //计算公式: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;                //电压值个位
  125.         disdata[2] =yy+0x30;                        //电压值小数点后一位
  126.         disdata[3] =zz+0x30;                        //电压值小数点后两位?



  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);//显示小数点
  141.                
  142.            write_com(0x80+0x48);
  143.         
  144.            write_date(disdata[2]);//显示x小数
  145.            write_com(0x80+0x49);
  146.            write_date(disdata[3]);//显示小数位
  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);      //转换输入电压值(P1.0 - P1.7对应数字0-7,当前对应0)
  159. //                                                  tvalue=1023;

  160.         convert(tvalue);

  161.         delay(1000);


  162.          ds1602disp();//显示

  163.         }

  164. }
复制代码

所有资料51hei提供下载:
原理图-仿真-程序-参考资料.7z (961.18 KB, 下载次数: 795)
回复

使用道具 举报

ID:316073 发表于 2018-11-26 21:17 | 显示全部楼层
太谢谢了
回复

使用道具 举报

ID:435796 发表于 2018-11-29 16:33 | 显示全部楼层
太谢谢了
回复

使用道具 举报

ID:57433 发表于 2019-3-4 19:12 | 显示全部楼层
谢谢,都是些好程序
回复

使用道具 举报

ID:866713 发表于 2020-12-23 22:43 | 显示全部楼层
很不错  可以换成at89c52吗,
回复

使用道具 举报

ID:994772 发表于 2021-12-21 08:14 | 显示全部楼层
谢谢,这个程序很好
回复

使用道具 举报

ID:487266 发表于 2022-3-12 18:57 | 显示全部楼层
温度测量的不准啊,是不是我版本的问题
回复

使用道具 举报

ID:1057652 发表于 2022-12-15 09:04 | 显示全部楼层
太棒了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表