找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电压表代码 lcd1602显示

[复制链接]
跳转到指定楼层
楼主
电压表代码

单片机源程序如下:
  1. /*=======================================================
  2. <<<<<<<<<<<<<<<<<<< 爱普雷德技术团队 >>>>>>>>>>>>>>>>>>>>
  3. <<<<<<<<<<<<<<<<<<< 我们一起追求卓越 >>>>>>>>>>>>>>>>>>>>
  4. ---------------------------------------------------------
  5. 官方邮箱: njaplid@163.com
  6. 技术QQ1: 535676091
  7. 技术QQ2: 1915624375
  8. 技术QQ3: 154211813
  9. ---------------------------------------------------------
  10.                All right reserved.2013.01
  11. ---------------------------------------------------------
  12. 文件名: main.c
  13. 描述: 液晶1602主程序文件
  14. 作者:
  15. =========================================================
  16. -----------------------------------------------------------------------------------------------------------*/
  17. #include "LCD1602_drv.h"
  18. #include "ads1115.h"

  19. /**********************************************
  20. 功能:
  21.     延时函数
  22. 输入参数:
  23.     n: 延时时长
  24. 输出参数:
  25.     无
  26. 返回值:
  27. **********************************************/
  28. static void Delay(uint16 n)
  29. {
  30.     uint16 i;
  31.     while(n--)
  32.     {
  33.         i=200;
  34.         while(i--);
  35.     }
  36. }

  37. /*---------------------------------------------------------------------------------------------------------*/
  38. /**********************************************
  39.     主函数,LCD1602从0显示到1000
  40. **********************************************/
  41. //void main()
  42. //{
  43. //    uint16 i;
  44. //   
  45. //    LCD1602Init();          //液晶1602初始化
  46. //    Delay(20);              //延时,保证显示更稳定
  47. //    ScreenClear();          //清屏
  48. //   
  49. //    StringPrint(0,0,"zhoudecong");
  50. //        Delay(10000);
  51. //        ScreenClear();          //清屏
  52. ////        StringDisplay(12,0,"周德聪");
  53. //        Delay(10000);
  54. //        ScreenClear();          //清屏
  55. //            
  56. //    while(1)
  57. //    {
  58. //        for(i=0;i<=1000;i++)
  59. //        {
  60. //            NumDisplay(0,0,i);
  61. //            Delay(100);
  62. //        }
  63. //    }
  64. //}


  65. int main(void)
  66. {       
  67.         u16 ADS1115_Value;
  68.                         
  69.         ADS1115_Port_Init();                // ADS1115端口初始化
  70.     LCD1602Init();          //液晶1602初始化
  71.     Delay(20);              //延时,保证显示更稳定
  72.     ScreenClear();          //清屏        
  73.     InitADS1115();
  74.        
  75.         while(1)
  76.         {
  77.                         ADS1115_Value = ADS1115(0);       
  78.             ScreenClear();          //清屏        
  79.             NumDisplay(0,0,ADS1115_Value);
  80.                         delay_ms(500);
  81. //            ADS1115_Value = ADS1115(1);       
  82. //            ScreenClear();          //清屏        
  83. //            NumDisplay(0,0,ADS1115_Value);
  84. //                        delay_ms(5000);
  85. //                        ADS1115_Value = ADS1115(3);       
  86. ……………………

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

所有资料51hei提供下载:
电压表代码.rar (99.21 KB, 下载次数: 34)


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

使用道具 举报

沙发
ID:58995 发表于 2017-8-6 18:05 | 只看该作者
O(∩_∩)O谢谢学习辛苦
回复

使用道具 举报

板凳
ID:111587 发表于 2017-9-2 18:00 | 只看该作者
请问,我从哪里设置量程?0-5V,稍微有个电压都报表了
回复

使用道具 举报

地板
ID:111587 发表于 2017-9-2 19:34 | 只看该作者
楼主帮忙看一下,我的测量的数据要么是0xffff 要么是 0x0b58
换算5V量程 4.92 和0.21V,有个很小的电压就显示0XFFFF,
keil u4 +STCI SP (v6.33)+STC12C5A60S2 (40 PIN DIP)
还有个问题,主函数中有一句 InitADS1115(); 但是在子函数中这个需要参数,不知道这一句是否在执行。先出过编译不过,后出的警告

  1. /*********************************************************************************************
  2. 函数名:通过串口发送温度与电压随时间变化
  3. 上位机软件 LABVIEW 2015
  4. 返回值:2字节数据,温度= (高8位*256+低8位)*0.25 ℃
  5.                 2字节数据 ,电压=(高8位*256+低8位)*0.00007539         V
  6. 备  注:振荡晶体为11.0592MHz,PC串口端设置 [ 9600,8,无,1,无 ]
  7. 温度传感器芯片 max6675
  8. 电压传感芯片 ADS1115
  9. /**********************************************************************************************/  

  10. #include <STC12C5A60S2.H>
  11. #include <string.h>
  12. #include<intrins.h >
  13. #include<ads1115.h>
  14. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  15.   //定义全局变量与接口
  16.           bit flag;
  17.           unsigned char LOW_1;// 存放温度低8位
  18.           unsigned char HI_1;//存放温度高8位,其中4位未用
  19.           unsigned char LOW_2;// 存放电压低8位
  20.           unsigned char HI_2;//存放电压高8位
  21.           sbit SO=P0^2;//P0.2 与SO相连 6675
  22.           sbit CS= P0^1;//P0.1 与CS相连         6675
  23.           sbit SCK=P0^0;//P0.0与SCK相连         6675
  24.           unsigned int P_Temp;

  25.          sbit SDA= P2^0; //P2.0与SDA相连 1115
  26.          sbit SCL= P2^1; //P2.1与SCL相连 1115
  27. //        ADDR 与GND相连
  28. //  ALRT  空
  29. //           
  30.         char Channel_Value;
  31.         int D_ADS;                 //转换的数字量
  32.         unsigned int Config;
  33.         unsigned char Writebuff[4],Readbuff[3];
  34.         unsigned int Result[2];


  35. /*********************************************************************************************
  36. 函数名:UART串口初始化函数
  37. 调  用:UART_init();
  38. 参  数:无
  39. 返回值:无
  40. 结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
  41. 备  注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ]
  42. /**********************************************************************************************/
  43. void UART_init (void){
  44.         EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
  45.         ES = 1; //允许UART串口的中断

  46.         TMOD = 0x20;        //定时器T/C1工作方式2
  47.         SCON = 0x50;        //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  48.         TH1 = 0xFD;        //定时器初值高8位设置
  49.         TL1 = 0xFD;        //定时器初值低8位设置
  50. //        PCON = 0x80;        //波特率倍频(屏蔽本句波特率为9600)
  51.         TR1 = 1;        //定时器启动   
  52. }
  53. /**********************************************************************************************/

  54. /*********************************************************************************************
  55. 函数名:UART串口接收中断处理函数
  56. 调  用:[SBUF收到数据后中断处理]
  57. 参  数:无
  58. 返回值:无
  59. 结  果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
  60. 备  注:过长的处理程序会影响后面数据的接收
  61. /**********************************************************************************************/
  62. void UART_R (void) interrupt 4  using 1{ //切换寄存器组到1
  63.         unsigned char UART_data; //定义串口接收数据变量
  64.         RI = 0;                        //令接收中断标志位为0(软件清零)
  65.         UART_data = SBUF;        //将接收到的数据送入变量 UART_data
  66.          flag=1;
  67.         //用户函数内容(用户可使用UART_data做数据处理)
  68.        
  69.         //SBUF = UART_data;        //将接收的数据发送回去(删除//即生效)
  70.         //while(TI == 0);        //检查发送中断标志位
  71.         //TI = 0;                //令发送中断标志位为0(软件清零)
  72. }       
  73. /**********************************************************************************************/


  74. /*********************************************************************************************
  75. 函数名:UART串口发送函数
  76. 调  用:UART_T (?);
  77. 参  数:需要UART串口发送的数据(8位/1字节)
  78. 返回值:无
  79. 结  果:将参数中的数据发送给UART串口,确认发送完成后退出
  80. 备  注:
  81. /**********************************************************************************************/
  82. void UART_T (unsigned char UART_data){ //定义串口发送数据变量
  83.         SBUF = UART_data;        //将接收的数据发送回去
  84.         while(TI == 0);                //检查发送中断标志位
  85.         TI = 0;                        //令发送中断标志位为0(软件清零)
  86. }
  87. /**********************************************************************************************/


  88. /*********************************************************************************************
  89. 函数名:毫秒级CPU延时函数
  90. 调  用:DELAY_MS (?);
  91. 参  数:1~65535(参数不可为0)
  92. 返回值:无
  93. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  94. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  95. /*********************************************************************************************/
  96. void DELAY_MS (unsigned int a){
  97.         unsigned int i;
  98.         while( a-- != 0){
  99.                 for(i = 0; i < 600; i++);
  100.         }
  101. }
  102. /*********************************************************************************************/
  103. /*********************************************************************************************
  104. 函数名:微秒级CPU延时函数
  105. 调  用:DELAY_MS (?);
  106. 参  数:1~65535(参数不可为0)
  107. 返回值:无
  108. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  109. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  110. /*********************************************************************************************/

  111. void delay_us (unsigned int a){
  112.     unsigned char i;
  113.         for(i = 0;i < a;i++)
  114.           _nop_();

  115. }
  116. /*********************************************************************************************
  117. 函数名:热电偶温度读取
  118. 调  用:?=RE_CONVERT()
  119. 参  数:无
  120. 返回值:温度
  121. 结  果:
  122. 备  注:
  123. /**********************************************************************************************/
  124. unsigned int Re_Convert() //热电偶转换
  125. {   
  126.         unsigned int i;
  127.         unsigned long Temp_2;
  128.         Temp_2=0;
  129.         CS = 0; //低电平使能,开始传送数据
  130.         delayNOP();
  131.         SCK = 1;        // 打开时钟
  132.         delayNOP();        
  133.         for(i=16;i>0;i--)// 读取16位数据
  134.                 {
  135.                         Temp_2 = Temp_2<<1; // 左移一位
  136.                         delayNOP();
  137.                         SCK=1;
  138.                         if(SO == 1){
  139.                                 Temp_2 = Temp_2|0x0001;} // 若接收到的位为1,则数据的最后一位置1
  140.                         else
  141.                         Temp_2 = Temp_2 & 0xffff; // 否则数据的最后一位保持不变,置0(前6行左移自动补0)
  142.                         delayNOP();
  143.                         SCK=0;                 //时钟滴答一次
  144.                         delayNOP();         //等待数据切换
  145.                 }
  146.                                 CS=1;// 读数完毕,关闭低电平使能
  147.                 Temp_2=Temp_2<<1;
  148.                 Temp_2=Temp_2>>4;               
  149.                 return(Temp_2);
  150. }
  151. /*********************************************************************************************
  152. 函数名:数据发送
  153. 调  用:DATA_SEND()
  154. 参  数:无
  155. 返回值:
  156. 结  果:
  157. 备  注:2字节数据
  158. /**********************************************************************************************/
  159. void DATA_SEND(){
  160.    LOW_1=P_Temp&0x000ff;// 获取温度低8位
  161.    P_Temp>>=8;                //右移位,干掉低8位
  162.    HI_1=P_Temp&0x000ff;//  获取温度高8位

  163.    LOW_2 =D_ADS&0x000ff;// 获取电压低8位
  164.    D_ADS>>=8;                //右移位,干掉低8位
  165.    HI_2=D_ADS&0x000ff;//  获取电压高8位

  166.    UART_T(HI_1);                // 发送温度高8位
  167.   UART_T(LOW_1);                // 发送温度低8位
  168.   UART_T(HI_2);                         // 发送电压高8位
  169.   UART_T(LOW_2)        ;                // 发送电压低8位
  170. }
  171. /******************************************************************************
  172.                                                                         STM32F103RCT6 Scorpio Ver5.1

  173. By:天星科技
  174. 网址:gods-star.com
  175. 技术支持:天星科技.com
  176. 淘宝网店:gods-star.taobao.com
  177. QQ:3184693939
  178. ******************************************************************************/




  179. void ADS1115_Port_Init(void)
  180. {
  181.     ;
  182. }


  183. void ADS1115_SDAPort_IN(void)
  184. {
  185.     ;
  186. }


  187. void ADS1115_SDAPort_OUT(void)
  188. {
  189.     ;
  190. }

  191. ///*******************************************
  192. //函数名称:Start
  193. //功    能:完成IIC的起始条件操作
  194. //参    数:无
  195. //返回值  :无
  196. //********************************************/
  197. void Start(void)
  198. {
  199.         SCL=1;
  200.         SDA=1;
  201.         delay_us(15);
  202.         SDA=0;
  203.         delay_us(15);
  204.         SCL=0;
  205.         delay_us(15);
  206. }
  207. //
  208. ///*******************************************
  209. //函数名称:Stop
  210. //功    能:完成IIC的终止条件操作
  211. //参    数:无
  212. //返回值  :无
  213. //********************************************/
  214. void Stop(void)
  215. {
  216.     SDA=0;
  217.     delay_us(15);
  218.     SCL=1;
  219.     delay_us(15);
  220.                 SDA=1;
  221.     delay_us(15);
  222. }
  223. ///*******************************************
  224. //函数名称:ACK
  225. //功    能:完成IIC的主机应答操作
  226. //参    数:无
  227. //返回值  :无
  228. //********************************************/
  229. void ACK(void)
  230. {
  231.     SDA=0;
  232.                 delay_us(1);
  233.     SCL=1;
  234.     delay_us(15);
  235.     SCL=0;
  236.                 delay_us(1);
  237.                 SDA=1;
  238.     delay_us(15);
  239. }
  240. //*******************************************
  241. //函数名称:NACK
  242. //功    能:完成IIC的主机无应答操作
  243. //参    数:无
  244. //返回值  :无
  245. //********************************************/
  246. void NACK(void)
  247. {
  248.         SDA=1;
  249.         delay_us(1);
  250.         SCL=1;
  251.         delay_us(15);
  252.         SCL=0;
  253.         delay_us(1);
  254.         SDA=0;   
  255.         delay_us(15);
  256. }
  257. //**********检查应答信号函数******************/
  258. ///*如果返回值为1则证明有应答信号,反之没有*/
  259. ///*******************************************
  260. //函数名称:Check
  261. //功    能:检查从机的应答操作
  262. //参    数:无
  263. //返回值  :从机是否有应答:1--有,0--无
  264. //********************************************/
  265. unsigned char Check(void)
  266. {
  267.     unsigned char slaveack;
  268.    
  269.     SDA=1;
  270.     delay_us(1);
  271.     SCL=1;
  272.                 ADS1115_SDAPort_IN();        // SDA设置为输入
  273.     delay_us(15);
  274.     slaveack = SDA_IN;                   //读入SDA数值
  275.     SCL=0;
  276.     delay_us(15);
  277.                 ADS1115_SDAPort_OUT();        // SDA设置为输出
  278.        
  279.     if(slaveack)    return FALSE;
  280.     else            return TRUE;
  281. }

  282. /***************Write a Byte****************/
  283. void Write_1_Byte(unsigned char DataByte)
  284. {
  285.         int i;

  286.         for(i=0;i<8;i++)
  287.         {
  288.                 if(DataByte&0x80)  //if((DataByte<<i)&0x80)
  289.                   SDA=1;
  290.                 else
  291.                   SDA=0;
  292.         delay_us(15);
  293.                 SCL=1;
  294.         delay_us(15);
  295.         SCL=0;
  296.         delay_us(15);
  297.         DataByte <<= 1;
  298.         }
  299.     SDA=1;
  300.     delay_us(1);
  301. }
  302. /***************Write N Byte****************/
  303. unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n)
  304. {
  305.         int i;

  306.         for(i=0;i<n;i++)
  307.         {
  308.                 Write_1_Byte(*writebuffer);
  309.                 if(Check())
  310.                 {
  311.                         writebuffer ++;
  312.                 }
  313.                 else
  314.                 {
  315.                         Stop();
  316.                     return FALSE;
  317.                 }
  318.         }
  319.         Stop();
  320.         return TRUE;
  321. }

  322. //***************Read a Byte****************/
  323. unsigned char Read_1_Byte(void)
  324. {
  325.     unsigned char data_Value = 0, FLAG, i;
  326.        
  327.     for(i=0;i<8;i++)
  328.     {
  329.         
  330.         SDA=1;
  331.         delay_us(15);
  332.     SCL=1;
  333.         ADS1115_SDAPort_IN();        // SDA设置为输入
  334.         delay_us(15);
  335.         FLAG=SDA_IN;
  336.         data_Value <<= 1;
  337.         if( FLAG)
  338.            data_Value |= 0x01;

  339.     SCL=0;
  340.     delay_us(15);
  341.         ADS1115_SDAPort_OUT();        // SDA设置为输出
  342.     }
  343.     return data_Value;
  344. }

  345. //***************Read N Byte****************/
  346. void Read_N_Byte(unsigned int*readbuff, unsigned char n)
  347. {
  348.         unsigned char i;
  349.        
  350.         for(i=0;i<n;i++)
  351.         {
  352.                 readbuff[i]=Read_1_Byte();
  353.                 if(i==n-1)
  354.                         NACK();  //不连续读字节
  355.                 else
  356.                         ACK(); //连续读字节
  357.         }
  358.         Stop();

  359. }
  360. //*****************初始化******************/
  361. void InitADS1115(unsigned char S_MUX_0, unsigned char S_MUX_1)
  362. {

  363.        
  364.         if (S_MUX_0 == 0 && S_MUX_1 == 0)
  365.         Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;
  366.         if (S_MUX_0 == 0 && S_MUX_1 == 1)
  367.         Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;
  368.         if (S_MUX_0 == 1 && S_MUX_1 == 0)
  369.         Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;
  370.         if (S_MUX_0 == 1 && S_MUX_1 == 1)
  371.         Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;
  372.    
  373.     Writebuff[0]=ADDRESS_W;
  374.     Writebuff[1]=Pointer_1;
  375.     Writebuff[2]=Config/256;
  376.     Writebuff[3]=Config%256;
  377.         
  378.     Readbuff[0]=ADDRESS_W;
  379.     Readbuff[1]=Pointer_0;
  380.         
  381.     Readbuff[2]=ADDRESS_R;
  382. }

  383. //***************Write a Word***********************/
  384. void WriteWord(void)
  385. {
  386.      int t;
  387.      Start();   //写入4个字节
  388.      do
  389.      {
  390.           t=Write_N_Byte(Writebuff,4);
  391.      }while(t==0);
  392. }
  393. //***************Read Word***********************/
  394. void ReadWord(void)
  395. {
  396.     int t;
  397.     Start();  //写入2个字节
  398.     do
  399.     {
  400.       t=Write_N_Byte(Readbuff,2);
  401.     }while(t==0);

  402.     Start();   //写入2个字节
  403.     do
  404.     {
  405.       t=Write_N_Byte(&Readbuff[2],1);
  406.     }while(t==0);
  407.    
  408.     Read_N_Byte(Result,2);  //读出2个字节

  409. }

  410. //***************ADS1115********************/
  411. unsigned int ADS1115(unsigned char Channel)
  412. {
  413.         unsigned char S_MUX_0, S_MUX_1;

  414.         switch(Channel)
  415.         {
  416.                 case 0:
  417.                         S_MUX_0 = 0;
  418.                         S_MUX_1 = 0;
  419.                         Channel_Value = Channel + '0';
  420.                         break;
  421.                 case 1:
  422.                         S_MUX_0 = 0;
  423.                         S_MUX_1 = 1;
  424.                         Channel_Value = Channel + '0';
  425.                         break;
  426.                 case 2:
  427.                         S_MUX_0 = 1;
  428.                         S_MUX_1 = 0;
  429.                         Channel_Value = Channel + '0';
  430.                         break;
  431.                 case 3:
  432.                         S_MUX_0 = 1;
  433.                         S_MUX_1 = 1;
  434.                         Channel_Value = Channel + '0';
  435.                         break;
  436.                 default :
  437.                         break;
  438.         }

  439.     InitADS1115(S_MUX_0, S_MUX_1);
  440.     WriteWord();
  441.     DELAY_MS(1);
  442.     ReadWord();
  443.        
  444.     D_ADS=Result[0]*256+Result[1];  //转换的数字量

  445.           return D_ADS;
  446. }

  447.   main(void)
  448. {       
  449.         unsigned int ADS1115_Value;
  450.         ADS1115_Port_Init();                // ADS1115端口初始化
  451.         InitADS1115();
  452.         UART_init();// 串口初始化
  453.         CS=1;
  454.         while(1)
  455.         {
  456.                         ADS1115_Value = ADS1115(0);        //通道0的数值
  457.                    P_Temp=Re_Convert();  //获取温度ADC值
  458.                           DATA_SEND();// 将数据发送出去
  459.             
  460.                         DELAY_MS(1000);

  461.         }
  462. }



复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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