找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2707|回复: 2
收起左侧

单片机数字电压表用adc0804及lcd1602显示程序

[复制链接]
ID:780666 发表于 2020-6-23 16:14 | 显示全部楼层 |阅读模式
OZ``SWEVE@LG(38I{SM79]T.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define lcd_data P2
  6. #define ad  P0
  7. int ad_data;
  8. sbit rd=P3^7;
  9. sbit wr=P3^6;
  10. sbit cs=P1^3;
  11. sbit tr=P3^2;

  12. sbit lcd_RS=P1^0;
  13. sbit lcd_RW=P1^1;
  14. sbit lcd_EN=P1^2;

  15. uchar sys_time1[]="voltage";          //显示voltage
  16. uchar sys_time2[]="       ";
  17. uchar sys_dianya[]="0123456789";
  18. void Delay(unsigned int Delay)
  19. {
  20.         unsigned int i;
  21.         for(;Delay>0;Delay--)
  22.         {
  23.                 for(i=0;i<114;i++)
  24.                 {
  25.                         ;
  26.                 }
  27.         }
  28. }
  29. void delay_20ms(void)
  30. {
  31.         uchar i,temp;
  32.         for(i=20;i>0;i--)
  33.         {
  34.                 temp=248;
  35.                 while(--temp);
  36.                 temp=248;
  37.                 while(--temp);
  38.         }
  39. }
  40. void delay_38us(void)
  41. {
  42.         uchar temp;
  43.         temp=18;
  44.         while(--temp);
  45. }
  46. void delay_1520us(void)
  47. {
  48.         uchar i,temp;
  49.         for(i=3;i>0;i--)
  50.         {
  51.                 temp=252;
  52.                 while(--temp);
  53.         }
  54. }
  55. void delay_50us(uint i)
  56. {
  57.         uchar j;
  58.         for(;i>0;i--)
  59.         for(j=19;j>0;j--);
  60. }
  61. uchar lcd_rd_status()                         //读取lcd1602状态,判断忙
  62. {
  63.         uchar tmp_sts;
  64.           lcd_data=0xff;
  65.           lcd_RW=1;
  66.           lcd_RS=0;
  67.           lcd_EN=1;

  68.           tmp_sts=lcd_data;
  69.           lcd_EN=0;
  70.           lcd_RW=0;
  71.           return tmp_sts;
  72. }
  73. void lcd_wr_com(uint command)           //写一个命令到lcd1602
  74. {
  75.         while(0x80&lcd_rd_status());   //写之前判断lcd1602是否忙
  76.           lcd_RW=0;                                          
  77.           lcd_RS=0;                                            //写命令
  78.           lcd_data=command;                           //把命令写到数据线上
  79.           lcd_EN=1;
  80.           lcd_EN=0;                                           //命令写入
  81. }
  82. void lcd_wr_data(uint sjdata)           //写一个显示数据到lcd1602
  83. {
  84.         while(0x80&lcd_rd_status());   //判断忙
  85.           lcd_RW=0;
  86.           lcd_RS=1;                                           //写显示数据
  87.           lcd_data=sjdata;                           //把要写的显示数据写到数据线上
  88.           lcd_EN=1;
  89.           lcd_EN=0;
  90.           lcd_RS=0;                                           //命令写入
  91. }
  92. void Init_lcd(void)                                   //初始化
  93. {
  94.         uchar i;
  95.         delay_20ms();
  96.           lcd_wr_com(0x38);                           //设置16*2格式,5*8点阵,8位数据接口
  97.           delay_38us();
  98.           lcd_wr_com(0x0c);                           //开显示,不显示光标
  99.           delay_38us();
  100.           lcd_wr_com(0x01);                           //清屏
  101.           delay_1520us();
  102.           lcd_wr_com(0x06);                           //显示一个数据后光标自动加1
  103.         
  104.         for(i=0;i<16;i++)
  105.         {
  106.                 lcd_wr_com(0x80+i);
  107.                 if( sys_time1[i]==0x00)
  108.                 break;
  109.                 lcd_wr_data( sys_time1[i]);
  110.         }
  111.         for(i=0;i<16;i++)
  112.         {
  113.                 lcd_wr_com(0xC4+i);
  114.                 if( sys_time2[i]==0x00)
  115.                 break;
  116.                 lcd_wr_data( sys_time2[i]);
  117.         }
  118. }
  119. void start_adc0804(void)                        //启动ad转换子程序
  120. {
  121.         cs=0;
  122.         wr=0;
  123.         delay_50us(10);
  124.     while(tr==0);
  125.         tr=1;
  126.         wr=1;
  127.         cs=1;         
  128. }
  129. uint  read_ad()                                                                                //0804读操作
  130. {
  131.         uchar ad_data;
  132.         P0=0XFF;
  133.         cs=0;
  134.         rd=0;
  135.         delay_50us(10);
  136.         ad_data=P0;
  137.         cs=1;
  138.         rd=1;
  139.         return(ad_data);
  140. }
  141. void display(uint ge,uint houyi,uint houer)                        //显示电压数
  142. {
  143.         
  144.         lcd_wr_com(0x80+0x40+5);
  145.         lcd_wr_data(sys_dianya[ge]);

  146.         lcd_wr_com(0x80+0x40+6);
  147.         lcd_wr_data('.');

  148.         lcd_wr_com(0x80+0x40+7);
  149.         lcd_wr_data(sys_dianya[houyi]);

  150.         lcd_wr_com(0x80+0x40+8);
  151.         lcd_wr_data(sys_dianya[houer]);

  152.         lcd_wr_data('v');
  153. }
  154. void main()
  155. {
  156.         uint a,i;
  157.         
  158.         uint ge,houyi,houer;
  159.         Init_lcd();
  160.         while(1)
  161.         {
  162.                 lcd_wr_com(0x80);
  163.                  start_adc0804();
  164.                 Delay(10);
  165.                 a=read_ad();
  166.                
  167.                 a=(uint)((a*5.0*100)/255);                   //计算
  168.         
  169.                 ge=(a/100);
  170.                 houyi=((a/10)%10);                                   //小数点后一位
  171.                 houer=((a/1)%10);                                   //小数点后二位
  172.         
  173.                 for(i=0;i<10;i++)
  174.                 {
  175.                         display(ge,houyi,houer);
  176.                 }
  177.         }
  178. }
复制代码


回复

使用道具 举报

ID:791076 发表于 2021-5-16 17:24 来自手机 | 显示全部楼层
真的太难了,泪目!
回复

使用道具 举报

ID:791076 发表于 2021-5-17 16:32 来自手机 | 显示全部楼层
鱼摆摆是鱼 发表于 2021-5-16 17:24
真的太难了,泪目!

可以向楼主请教些问题吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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