找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机实现AD电压转换到串口输出的主从机源代码以及仿真原理图

[复制链接]
ID:296720 发表于 2018-3-25 14:26 | 显示全部楼层 |阅读模式
51单片机实现AD电压转换到串口输出的主从机源代码以及原理图。
并可以通过LED数码管显示
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

主机单片机源程序如下:
  1. #include<reg51.h>

  2. #define  PDATA        P2
  3. #define         aver 2

  4. #define  uint   unsigned int
  5. #define  uchar  unsigned char

  6. sbit  Ledlow = P1^3;
  7. sbit  Ledhig = P1^4;


  8. uchar  table2 []={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  9. uchar  table1 []={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

  10. //短延时函数:ShortDelay()
  11. void nNop(uchar temp)
  12. {
  13.         uint i;
  14.         for(i=0 ;i<temp; i++) ;
  15. }


  16. //UART初始化:模式1,8位,9600Bds at 11.059MHz
  17. void InitSerial()
  18. {                                                                   // uart in mode 1 (8 bit), REN=1
  19.         TMOD = 0x20 ;       // Timer 1 in mode 2
  20.         TH1  = 0xF4;               // 9600 Bds at 11.059MHz
  21.         TL1  = 0xF4;                                              // 9600 Bds at 11.059MHz
  22.         TR1  = 1;
  23.         PCON = 0x00;                                                     // Timer 1 run
  24.         SCON = 0x50;
  25.         }

  26. //主机接受信息给从机
  27. uchar recivefromslave()
  28. {
  29.                 uchar temp;
  30.                 while(!RI);        
  31.                 temp=SBUF;
  32.                 RI=0;
  33.                 return(temp);
  34.                                 
  35. }


  36. // 显示
  37. void leddisp(uint temp )
  38. {
  39.         uint i;
  40.         uint getdata1 = 0;
  41.         uint getdata2 = 0;
  42.         temp=temp*aver;
  43.         getdata1=temp/100;
  44.         getdata2=temp/10;
  45.         getdata2=getdata2%10;

  46.         
  47.          for(i=0;i<30;i++)
  48.         {
  49.         PDATA=table1[getdata1];
  50.         Ledlow =0;
  51.          Ledhig = 1;        
  52.         nNop(1000);
  53.         Ledlow =0;
  54.          Ledhig = 0;

  55.         PDATA=table2[getdata2];
  56.         Ledlow =1;
  57.          Ledhig = 0;
  58.         nNop(1000);
  59.         Ledlow =0;
  60.          Ledhig = 0;

  61.         }
  62.                   
  63. }        



  64. void main()
  65. {
  66.         uint tab;
  67.         uint tempt;
  68.         Ledlow = 0;
  69.          Ledhig = 0;
  70.         PDATA = 0x00;

  71.         InitSerial();

  72.         while(1)
  73.         {

  74.     tempt = (uint) recivefromslave();  //接收从机采集的信息
  75.         leddisp(tempt);                                          //显示信息




  76.         if(tempt<0x60)                         //判断信息
  77.         {
  78.          tab = 0;
  79.         }
  80.         else if(tempt>0xc0)
  81.         {
  82.          tab = 2;
  83.         }
  84.         else
  85.         {
  86.         tab = 1;
  87.         }

  88.         SBUF = (uchar)tab;                         //对采集信息进行控制
  89.         while(!TI);
  90.         TI = 0;


  91.         }
  92. }
复制代码

丛机单片机源程序如下:
  1. #include <reg51.h>

  2. #define  uint   unsigned int
  3. #define  uchar  unsigned char

  4. #define  PinData   P0
  5. sbit  LED0         = P1^0;
  6. sbit  LED1  = P1^1;
  7. sbit  PinSTART         = P1^5;
  8. sbit  PinOE            = P1^6;
  9. sbit  PinEOC         = P1^7;
  10. sbit  CLK          = P3^4;



  11. //短延时函数:ShortDelay()
  12. void nNop(uchar i)
  13. {
  14.         for(;i>0;i--) ;
  15. }

  16. //长延时函数:LongDelay()
  17. void LongDelay(uint i)
  18. {
  19.         uint j;
  20.         for(;i>0;i--)
  21.                 { for(j=1000;j>0;j--);}
  22. }  

  23. //引脚初始化
  24. void InitIO()
  25. {
  26.         PinData  = 0xff;
  27.         PinSTART = 1;
  28.         PinEOC         = 1;
  29.         PinOE    = 1;
  30.         CLK         = 1;

  31.                 }

  32. //UART的初始化:模式1,8位,9600Bds
  33. void InitSerial()
  34. {        
  35.         TMOD = 0x20 ;       // Timer 1 in mode 2
  36.         TH1  = 0xF4;               // 9600 Bds at 11.059MHz
  37.         TL1  = 0xF4;                                              // 9600 Bds at 11.059MHz
  38.         TR1  = 1;                                                      // Timer 1 run
  39.         PCON = 0x00;                                                     // Timer 1 run
  40.         SCON = 0x50;                                                   // uart in mode 1 (8 bit), REN=1

  41. }


  42. //T0定时脉冲中断初始化
  43. void init_uart()
  44. {
  45.         TMOD=0x01;
  46.         TH0= (65536-4000)/256;
  47.         TL0= (65536-4000)%256;
  48.         TR0=1;
  49. //        ET0=1;
  50.         EA=1;                                                                                                                                                                                                
  51. }

  52. //等待A/D转换结束函数:WaitADCEnd()
  53. void  WaitADCEnd(void)
  54. {
  55.         while(!PinEOC) ;
  56. }

  57. //读取A/D转换后的数据函数:ReadData()
  58. uchar ReadData()
  59. {
  60.         uchar tempt;
  61.         ET0=1;
  62.         PinSTART = 0;
  63.         //nNop(1);
  64.         PinSTART = 1;
  65.         PinSTART = 0;
  66.         WaitADCEnd();
  67.         PinOE =1;
  68.         nNop(2);
  69.         tempt = PinData & 0xff;
  70.          
  71.         ET0=0;
  72.         return(tempt);


  73.         
  74.         //PinOE =0;
  75. }

  76. //子机送数据给主机
  77. void sendtomain(uchar temp)
  78. {
  79.         
  80.         
  81.         SBUF = temp;
  82.         while(!TI);
  83.         TI=0;
  84.          
  85.                
  86. }  

  87. void main()
  88. {
  89.     uchar temp, tab;
  90.         InitIO();
  91.         init_uart();
  92.         InitSerial();
  93.         while(1)
  94.         {
  95.         
  96.         temp = ReadData();        
  97.         sendtomain(temp);

  98.         while(!RI);
  99.         tab = SBUF;        
  100.         RI = 0;
  101.         if(tab == 0)
  102.         {
  103.         LED0 = 1;
  104.         LED1 = 0;
  105.         }
  106.         else if(tab == 1)
  107.         {
  108.         LED0 = 1;
  109. ……………………

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

0.png

所有资料51hei提供下载:

uart.zip (108.14 KB, 下载次数: 72)

评分

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

查看全部评分

回复

使用道具 举报

ID:95682 发表于 2018-3-25 20:11 | 显示全部楼层
楼主 数码管是共阴的还是共阳的谢谢
回复

使用道具 举报

ID:95682 发表于 2018-3-25 20:14 | 显示全部楼层
应该是共阳的
回复

使用道具 举报

ID:1 发表于 2018-3-26 03:46 | 显示全部楼层
zds789 发表于 2018-3-25 20:11
楼主 数码管是共阴的还是共阳的谢谢

根据字码可以判断
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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