找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3167|回复: 3
收起左侧

基于单片机+ADC0809芯片的电压表Proteus仿真程序 注释很详细

[复制链接]
ID:949836 发表于 2021-7-8 15:56 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

单片机源程序如下:
  1. //*********************************************************************************
  2. //程序:AD0809LED.c
  3. //功能:AT89C51+ADC0809电压测量显示程序(Keil uVision5+Proteus 7.8仿真通过)
  4. //*********************************************************************************
  5. #include<reg51.h>                                              /*包含头文件reg51.h */
  6. #define uchar unsigned char                         /*宏定义后方便书写*/
  7. #define uint unsigned int                                /*宏定义后方便书写*/
  8. uchar code DigitSTARTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //LED码表
  9. uchar DisplayBuffer[4];                                //显示码数据缓冲区
  10. uchar AD_Data;                                        //AD0809原始数据
  11. uint Temp;                                                   //处理后的数据
  12. sbit START=P3^0;                                 //定义P3.0引脚位名称为START
  13. sbit OE=P3^1;                                         //定义P3.1引脚位名称为OE
  14. sbit EOC=P3^2;                                        //定义P3.2引脚位名称为EOC
  15. sbit CLK=P3^3;                                        //定义P3.3引脚位名称为CLK
  16. sbit ADDA=P3^4;                                        //定义P3.4引脚位名称为ADDA
  17. sbit ADDB=P3^5;                                        //定义P3.5引脚位名称为ADDB
  18. sbit ADDC=P3^6;                                        //定义P3.6引脚位名称为ADDC
  19. sbit LED0=P2^0;                                        //定义P2.0引脚位名称为LED0,选择LED的0位
  20. sbit LED1=P2^1;                                        //定义P2.1引脚位名称为LED1,选择LED的1位
  21. sbit LED2=P2^2;                                        //定义P2.2引脚位名称为LED2,选择LED的2位
  22. sbit LED3=P2^3;                                        //定义P2.3引脚位名称为LED3,选择LED的3位
  23. sbit LED_DP=P1^7;                                //定义P1.7引脚位名称为LED_DP,选择LED的DP位

  24. //*********************************************************************************
  25. //函数名:Delay
  26. //函数功能:软件延时函数
  27. //形式参数:uint i
  28. //*********************************************************************************
  29. void Delay(uint i)
  30. {  uint j;
  31.   for(;i>0;i--)
  32.    { for(j=0;j<50;j++)
  33.      ;
  34.    }
  35. }

  36. //*********************************************************************************
  37. //函数名:TimeInitial
  38. //函数功能:定时器初始化函数 T0方式2,自动重装初值:10,定时:10us,
  39. //信号周期T:20us 信号频率f:f=1/T=1000000/20=50 000HZ=50KHZ
  40. //*********************************************************************************
  41. void TimeInitial()                 //定时器初始化
  42. { TMOD=0x02;                                          //定时器工作模式
  43. TH0=246;                                       //定时器初值高8位
  44. TL0=246;                                //定时器初值低8位
  45. EA=1;                                                     //开总中断
  46. ET0=1;                                                 //开定时器中断
  47. TR0=1;                                                 //启动定时器
  48. }

  49. //*********************************************************************************
  50. //函数名:Time0
  51. //函数功能:定时器0中断服务子程序函数
  52. //*********************************************************************************
  53. void Time0(void) interrupt 1 using 0          //定时器中断服务子程序
  54. {
  55.   CLK=~CLK;                                           //产生AD0809工作脉冲:50KHZ
  56.     }

  57. //*********************************************************************************
  58. //函数名:Display
  59. //函数功能:LED数码管显示函数
  60. //*********************************************************************************
  61. void Display()
  62. {
  63. P1=DigitSTARTable[DisplayBuffer[3]];        //取数据送P1端口显示(十位)
  64. LED0=0;                                                   // LED0管子开
  65. Delay(5);                                                 // 延时显示
  66. LED0=1;                                                  // LED0管子关
  67. P1=DigitSTARTable[DisplayBuffer[2]];//取数据送P1端口显示(个位)
  68. LED_DP=1;                                        // 小数点显示
  69. LED1=0;                                           // LED1管子开
  70. Delay(5);                                                 // 延时显示
  71. LED1=1;                                                  // LED1管子关
  72. P1=DigitSTARTable[DisplayBuffer[1]];//取数据送P1端口显示 (小数1位)
  73. LED2=0;                                                  // LED2管子开
  74. Delay(5);                                                // 延时显示
  75. LED2=1;                                                   // LED2管子关
  76. P1=DigitSTARTable[DisplayBuffer[0]];//取数据送P1端口显示(小数2位)
  77. LED3=0;                                                // LED3管子开
  78. Delay(5);                                                // 延时显示
  79. LED3=1;                                                  // LED3管子关
  80. }

  81. //*********************************************************************************
  82. //函数名:main
  83. //函数功能:主函数
  84. //*********************************************************************************
  85. void main()
  86. {
  87. TimeInitial();                                         //启动定时器初化
  88. while(1)
  89. {
  90. ADDA=0;                                                //ADC0809通道选择
  91. ADDB=0;
  92. ADDC=0;
  93. OE=0;                                                 //输出关闭
  94. START=0;
  95. START=1;                                                 //START由低到高跳变(上跳沿),寄存器清零
  96. START=0;                                          //START由高到低跳变(下跳沿),启动AD转换
  97. while(EOC==0)    ;        //等待转换结束
  98. OE=1;                                                           //输出允许
  99. AD_Data=P0;                                  //读ADC0809原始数据
  100. OE=0;                                                          //输出关闭
  101. Temp=(AD_Data*1.0/255*5)*100; //数据处理:输出值=输入值*5/255  参数5是基准电压5V
  102. DisplayBuffer[0]=Temp%10;                  //取处理后的数据个位,对应显示温度值的小数2位
  103. DisplayBuffer[1]=Temp/10%10;         //取处理后的数据十位,对应显示温度值的小数1位
  104. DisplayBuffer[2]=Temp/100%10;        //取处理后的数据百位,对应显示温度值的个位
  105. DisplayBuffer[3]=Temp/1000;          //取处理后的数据千位,对应显示温度值的十位
  106. Display();                                        //调用显示函数
  107. }
  108. }
复制代码

所有资料51hei提供下载:
ad0809.rar (135.06 KB, 下载次数: 124)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1011865 发表于 2022-4-1 15:35 | 显示全部楼层
楼主
ADC0809要不要编程?
回复

使用道具 举报

ID:1026955 发表于 2022-5-16 11:40 | 显示全部楼层
记忆犹新 发表于 2022-4-1 15:35
楼主
ADC0809要不要编程?

不用啊啊
回复

使用道具 举报

ID:114240 发表于 2022-5-20 23:11 | 显示全部楼层
LCD压缩包里程序和hex文件不匹配,只有单独的hex文件能用,通过程序编译之后生成的hex文件放进没显示!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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