找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1982|回复: 1
打印 上一主题 下一主题
收起左侧

单片机ADC0809 A\D转换 数码管显示实验

[复制链接]
跳转到指定楼层
楼主
已知有ADC0809模数转换器,实验箱51单片机工作在总线模式,有一模拟电压,电压高低由旋钮电位器控制
要求:
1、通过接线令ADC0809的起始地址为0A000H
2、使用0809上的IN0采集模拟电压值
3、将0809转换的结果的二进制数值用8位LED显示
4、将转换结果的16进制数值用2位数码管显示
5、将采集到的电压值用3位数码管显示,整数位占1位,显示小数点,小数占2位


单片机源程序如下:
  1.                                                           /*************************************************************************************

  2. *
  3.                                                                        

  4.                                                                                   
  5. **************************************************************************************

  6. */
  7. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  8. #include"temp.h"

  9. typedef unsigned int u16;          //对数据类型进行声明定义
  10. typedef unsigned char u8;

  11. sbit led1=P2^0;
  12. sbit led2=P2^1;
  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;



  16. #define GPIO_DIG P0
  17. #define GPIO_KEY P1


  18. char num=0;
  19. u8 DisplayData[8];


  20. u8 KeyValue;        //用来存放读取到的键值


  21. u8 code smgduan[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xc0,0xf9,0xa4};//显示0~F的值

  22. /*******************************************************************************
  23. * 函 数 名         : delay
  24. * 函数功能                   : 延时函数,i=1时,大约延时10us
  25. *******************************************************************************/
  26. void delay(u16 i)
  27. {
  28.         while(i--);       
  29. }

  30. /*******************************************************************************
  31. * 函 数 名         : KeyDown
  32. * 函数功能                   : 检测有按键按下并读取键值
  33. * 输    入         : 无
  34. * 输    出         : 无
  35. *******************************************************************************/
  36. void KeyDown(void)
  37. {                                                                                                                                                                      
  38.         char a=0;
  39.         GPIO_KEY=0x0f;
  40.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  41.         {
  42.                
  43.                 {       
  44.                         //测试列
  45.                         GPIO_KEY=0X0F;
  46.                         switch(GPIO_KEY)
  47.                         {
  48.                         case(0X07):        KeyValue=11;break;
  49.                                 case(0X0b):        KeyValue=12;break;
  50.                                 case(0X0d): KeyValue=10;break;
  51.                                 case(0X0e):        KeyValue=3;break;
  52.                         }
  53.                         //测试行
  54.                         GPIO_KEY=0XF0;
  55.                         switch(GPIO_KEY)
  56.                         {
  57.                                 case(0X70):        KeyValue=KeyValue;break;
  58.                                 case(0Xb0):        KeyValue=10;break;
  59.                                 case(0Xd0): KeyValue=10;break;
  60.                                 case(0Xe0):        KeyValue=10;break;
  61.                         }
  62.                        
  63.                 }
  64.         }
  65.          }


  66.         void LED(void)
  67.         {
  68.         switch(KeyValue)
  69.         {
  70.         case(1):LSA=1;LSB=1;LSC=1;break;
  71.         case(2):LSA=1;LSB=1;LSC=1;break;
  72.         case(0):LSA=1;LSB=1;LSC=1;break;
  73.         }
  74.         }




  75. /*******************************************************************************
  76. * 函 数 名         : datapros()
  77. * 函数功能                   : 温度读取处理转换函数
  78. * 输    入         : temp
  79. * 输    出         : 无
  80. *******************************************************************************/

  81. void datapros(int temp)          
  82. {
  83.            float tp;  
  84.         if(temp< 0)                                //当温度值为负数
  85.           {
  86.                 DisplayData[0] = 0x40;           //   -
  87.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  88.                 temp=temp-1;
  89.                 temp=~temp;
  90.                 tp=temp;
  91.                 temp=tp*0.0625*100+0.5;       
  92.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  93.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  94.                 //算加上0.5,还是在小数点后面。

  95.           }
  96.         else
  97.           {                       
  98.                 DisplayData[0] = 0x00;
  99.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  100.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  101.                 temp=tp*0.0625*100+0.5;       
  102.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  103.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  104.                 //算加上0.5,还是在小数点后面。
  105.         }
  106.         DisplayData[1] = smgduan[temp % 10000 / 1000];
  107.         DisplayData[2] = smgduan[temp % 1000 / 100]|0x80;
  108.         DisplayData[3] = smgduan[temp %  100 / 10];
  109.         DisplayData[4] = smgduan[temp %  10 / 1];

  110. }


  111. /*******************************************************************************
  112. * 函数名         :DigDisplay()
  113. * 函数功能                 :数码管显示函数
  114. * 输入           : 无
  115. * 输出                  : 无
  116. *******************************************************************************/
  117. void DigDisplay()
  118. {
  119.         u8 i;
  120.         for(i=1;i<6;i++)
  121.         {
  122.                 switch(i)         //位选,选择点亮的数码管,
  123.                 {
  124.                        
  125.                         case(1):
  126.                                 LSA=1;LSB=1;LSC=1; break;//显示第1位
  127.                         case(2):
  128.                                 LSA=0;LSB=1;LSC=1; break;//显示第2位
  129.                         case(3):
  130.                                 LSA=1;LSB=0;LSC=1; break;//显示第3位
  131.                         case(4):
  132.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  133.                         case(5):
  134.                                 LSA=1;LSB=1;LSC=1; break;//显示第1位
  135.                                
  136.                 }       
  137.                 P0=DisplayData[i];//发送数据
  138.                 delay(100); //间隔一段时间扫描       
  139.                 P0=0x00;//消隐
  140.         }               
  141. }


  142.                    void        end(){
  143.                                    KeyDown();                   //按键判断函数
  144.                    if(KeyValue==3){
  145.             datapros(Ds18b20ReadTemp());         //数据处理函数
  146.                 DigDisplay();//数码管显示函数       
  147.         }
  148.         else{
  149.                 GPIO_DIG=~smgduan[KeyValue];          //
  150.                 LED();}         }


  151. /*******************************************************************************
  152. * 函 数 名       : main
  153. * 函数功能                 : 主函数
  154. * 输    入       : 无
  155. * 输    出             : 无
  156. *******************************************************************************/
  157. void main()
  158. {       
  159.         while(1)
  160.         {                       
  161.         end();
  162.         }               
  163. }
  164. void sheding()
  165. {
  166.                 DisplayData[5] = smgduan[3];
  167.         DisplayData[6] = smgduan[0];
  168. }
复制代码


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2021-7-1 18:18 | 只看该作者
楼主你好 缺少头文件 无法编译啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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