单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:3806|回复:5
打印上一主题下一主题

基于51单片机的ADC0804的电压表设计

 [复制链接]
跳转到指定楼层
楼主
ID:216839发表于 2017-7-24 11:20|只看该作者|只看大图回帖奖励
最近看网上有很少的ADC0804的设计了,都由0809代替,但是有个别因为成本原因和学校课程设计要求需要ADC0804的,可以看此程序,仿真一并配齐,全套资料请打包下载:




单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit rd=P3^6; //ADC0804IO口定义
  6. sbit wr=P3^5;
  7. sbit cs=P3^7;
  8. sbit int1=P3^4;
  9. //液晶LCD1602定义
  10. sbit rs=P2^5;
  11. sbit rw=P2^6;
  12. sbit e=P2^7;
  13. //0804转换变量
  14. unsigned int date;
  15. uchar Vol;
  16. uint V;
  17. void delay_uint(uint z)             //液晶驱动延迟
  18. {
  19.        while(z--);
  20. }
  21. /********************************************************************
  22. * 名称 : write_com(uchar com)
  23. * 功能 : 1602命令函数
  24. * 输入 : 输入的命令值
  25. * 输出 : 无
  26. ***********************************************************************/
  27. void write_com(uchar com)
  28. {
  29.        e=0;
  30.        rs=0;
  31.        rw=0;
  32.        P0=com;
  33.        delay_uint(25);
  34.        e=1;
  35.        delay_uint(100);
  36.        e=0;
  37. }

  38. /********************************************************************
  39. * 名称 : write_data(uchar dat)
  40. * 功能 : 1602写数据函数
  41. * 输入 : 需要写入1602的数据
  42. * 输出 : 无
  43. ***********************************************************************/
  44. void write_data(uchar dat)
  45. {
  46.        e=0;
  47.        rs=1;
  48.        rw=0;
  49.        P0=dat;
  50.        delay_uint(25);
  51.        e=1;
  52.        delay_uint(100);
  53.        e=0;      
  54. }
  55. /***********************lcd1602上显示字符函数************************/
  56. void write_string(uchar hang,uchar add,uchar *p)
  57. {
  58.        if(hang==1)  
  59.            write_com(0x80+add);
  60.        else
  61.            write_com(0x80+0x40+add);
  62.            while(1)                                                                            
  63.            {
  64.                  if(*p == '\0')  break;
  65.                  write_data(*p);
  66.                  p++;
  67.            }      
  68. }
  69. /***********************lcd1602上显示两位十进制数************************/
  70. void write_sfm2(uchar hang,uchar add,uint date)
  71. {
  72.        if(hang==1)  
  73.            write_com(0x80+add);
  74.        else
  75.            write_com(0x80+0x40+add);
  76.        write_data(0x30+date/100);
  77.        write_string(2,8,".");  
  78.        write_data(0x30+date/10%10);
  79.        write_data(0x30+date%10);      
  80. }

  81. /***********************lcd1602初始化设置************************/
  82. void init_1602()       //lcd1602初始化
  83. {
  84.        write_com(0x38);      
  85.        write_com(0x0c);
  86.        write_com(0x06);
  87.        delay_uint(1000);
  88.        write_string(1,0,"The Voltage is: ");
  89.        write_string(2,8,".");  
  90.        write_string(2,11,"V   ");      
  91.        write_sfm2(2,7,date);
  92. }
  93. void delay(uint z)
  94. {
  95.        uint x;
  96.        while(z--)
  97.            for(x=0;x<120;x++);
  98. }
  99. uchar read_0804()
  100. {
  101.        wr=0; //在片选信号CS为低电平情况下(由于CS接地,所以始终为低电平),
  102.        _nop_(); //WR由低电平到高电平时,即上升沿时,AD开始采样转换  
  103.        wr=1;  
  104.        delay(1); //延时1ms,等待采样转换结束  
  105.        P1=0xff;   //这条语句不能少,我也还不知道为什么  
  106. ……………………

  107. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
056-ADC0804电压表.zip(2.83 MB, 下载次数: 123)



评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:337367发表于 2018-6-12 22:14|只看该作者
谢谢分享
板凳
ID:236171发表于 2018-6-27 11:28|只看该作者
   P1=0xff;   //这条语句不能少,我也还不知道为什么  

回复楼主一下,因为P1做数据线的时候要先拉高才能读取数据
地板
ID:360242发表于 2018-6-27 14:24|只看该作者
谢谢了老铁,666
5#
ID:313760发表于 2018-7-19 16:12|只看该作者
谢谢楼主
6#
ID:111875发表于 2024-5-2 07:10|只看该作者
好资料感谢分享

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

Powered by 单片机教程网