找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2816|回复: 1
收起左侧

ADS112C04 51单片机调试程序

[复制链接]
ID:511660 发表于 2019-4-14 09:55 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>


  5. #define uchar  unsigned char  
  6. #define uint  unsigned int               
  7. #define CHECK_BUSY
  8. #define ADD_ADS112C04 0x80
  9. #define START 0x08           //上电
  10. #define PowerDown 0x02         //掉电
  11. #define Rdata 0x10       
  12. #define        RESET 0x06
  13. #define WREG_0 0x40
  14. #define WREG_1 0x44
  15. #define WREG_2 0x48
  16. #define WREG_3 0x4c
  17. #define RREG_0 0x20
  18. #define RREG_1 0x24
  19. #define RREG_2 0x28
  20. #define RREG_3 0x2c


  21. sbit POWER=P1^6;
  22. sbit key1_S2=P3^0;
  23. sbit key2_S3=P3^1;
  24. sbit key3_S4=P3^2;
  25. sbit key4_S5=P3^3;
  26. sbit SDA = P1^1        ;
  27. sbit SCL = P1^0        ;
  28. sbit DRDY = P1^2;
  29. sbit RS = P3^5;       
  30. sbit RW = P3^6;
  31. sbit EN = P3^4;
  32. sbit wela=P2^7;
  33. sbit dula=P2^6;
  34. int returnn;
  35. float typic;
  36. uchar disp[4]={0};
  37. uchar dis[3]={0};
  38. uchar num;
  39. long qwe;
  40. long result;
  41. float  math;
  42. double c;
  43. double d;
  44. double R;
  45. uchar disp[];



  46. /*I2C协议*/
  47. void delay_5us()
  48. {
  49.         _nop_();
  50. }

  51. void I2C_Init()       
  52. {
  53.         SCL = 1;
  54.         delay_5us();
  55.         SDA = 1;
  56.         delay_5us();
  57. }

  58. /*I2C起始信号*/
  59. void I2C_start()  
  60. {
  61.         SDA = 1;
  62.         delay_5us();
  63.         SCL = 1;
  64.         delay_5us();
  65.         SDA = 0;
  66.         delay_5us();
  67. }

  68. /*I2C终止信号*/
  69. void I2C_Stop()
  70. {
  71.         SDA = 0;
  72.         delay_5us();
  73.         SCL = 1;
  74.         delay_5us();
  75.         SDA = 1;
  76.         delay_5us();
  77. }

  78. /*主机发送应答*/
  79. void Master_ACK(uchar ack)               
  80. {
  81.         SDA=ack;
  82.         delay_5us();
  83.         SCL=1;
  84.         delay_5us();
  85.         SDA=ack;
  86.         delay_5us();
  87.         SCL=0;
  88. }


  89. /*检测从机应答*/
  90. void Test_ACK()
  91. {
  92.         uchar i;
  93.         SCL=1;
  94.         delay_5us();
  95.         while((SDA==1)&&(i<250))i++;
  96.         SCL=0;
  97.         delay_5us();
  98. }

  99. /*发送一个字节*/
  100. void I2C_send_byte(uchar byte)
  101. {
  102. unsigned char i,temp;
  103.            temp=byte;
  104.            for (i=0;i<8;i++)
  105.    {
  106.            temp=temp<<1;
  107.            SCL =0;
  108.            delay_5us();
  109.            SDA =CY;                //temp左移时,移出的值放入了CY中
  110.            delay_5us();
  111.            SCL = 1;                //待sda线上的数据稳定后,将scl拉高
  112.            delay_5us();
  113.    }
  114.    SCL =0;
  115.    delay_5us();
  116.    SDA =1;
  117.    delay_5us();
  118. }


  119. /*I2C 读一字节*/
  120. uchar I2C_read_byte()
  121. {
  122. unsigned char i,k=0;
  123.            SCL =0;
  124.     delay_5us();
  125.         SDA =1;
  126.    for (i=0;i<8;i++)
  127.    {  
  128.                 delay_5us();
  129.                 SCL =1;
  130.                 delay_5us();
  131.               k=(k<<1)|SDA;
  132.                 SCL=0;
  133.             delay_5us();
  134.         }
  135.            delay_5us();
  136.         return k;
  137. }



  138. /*adc*/

  139. /* power-up delay*/
  140. void delay_800us()
  141. {
  142. uint i;
  143. for(i=92; i > 0 ; i--);
  144. }

  145. void Reset()
  146. {
  147.         I2C_start();
  148.         I2C_send_byte(ADD_ADS112C04);
  149.         Test_ACK();
  150.         I2C_send_byte(RESET);
  151.         delay_5us( );
  152.         Test_ACK();
  153.         I2C_Stop();
  154. }





  155. int read_volt()                                                                                                                        //读取数据:两个字节
  156. {
  157.         short int k;
  158.         uchar i,j;
  159.         I2C_start();
  160.         I2C_send_byte(0x80);
  161.         Test_ACK();
  162.         I2C_send_byte(0x10);
  163.         Test_ACK();
  164.         I2C_start();
  165.         I2C_send_byte(0x81);
  166.         Test_ACK();
  167.         i=I2C_read_byte();
  168.         Master_ACK(0);
  169.         j=I2C_read_byte();
  170.         Master_ACK(1);
  171.         I2C_Stop();
  172.         k=(i<<8)|j;
  173.         return k;
  174. }       



  175. void DelayMs(int z)
  176. {
  177. int x,y;
  178. for (x=z;x>0;x--)
  179.    for(y=110;y>0;y--);
  180. }
  181. /***********LED判忙函数***********/
  182. bit LCD_Check_Busy()
  183. {
  184. #ifdef CHECK_BUSY
  185. P0= 0xFF;
  186. RS=0;
  187. RW=1;
  188. EN=0;
  189. _nop_();
  190. EN=1;
  191. return (bit)(P0 & 0x80);
  192. #else
  193. return 0;
  194. #endif
  195. }
  196. /***********LED写入命令函数***********/
  197. void write_com(uchar com)
  198. {
  199. while(LCD_Check_Busy()); //忙则等待
  200. RS=0;
  201. RW=0;
  202. EN=1;
  203. P0= com;
  204. _nop_();
  205. EN=0;
  206. }
  207. /**********LED写入数据函数**********/
  208. void write_dat(uchar dat)
  209. {
  210. while(LCD_Check_Busy()); //忙则等待
  211. RS=1;
  212. RW=0;
  213. EN=1;
  214. P0= dat;
  215. _nop_();
  216. EN=0;
  217. }
  218. /*******LED写入字符函数***********/
  219. void LCD_Write_Char(uchar x,uchar y,uchar dat)
  220. {   
  221. if (y == 0)
  222.   {   
  223.   write_com(0x80 + x);   
  224.   }   
  225. else
  226.   {   
  227.   write_com(0xC0 + x);   
  228.   }      
  229. write_dat( dat);
  230. }
  231. /******写入字符串函数***********/
  232. void Write_String(uchar x,uchar y,uchar *s)
  233. {   
  234.       
  235. while (*s)
  236.   {   
  237.   LCD_Write_Char(x,y,*s);   
  238.   s++;
  239.   x++;   
  240.   }
  241. }
  242. /*****LED初始化函数******/
  243. void LCD_Init()
  244. {
  245.            RW=0;
  246.         dula=0;         //关闭数码管显示
  247.         wela=0;         //关闭数码管显示
  248.    write_com(0x38); /*显示模式设置*/
  249.    DelayMs(5);
  250.    write_com(0x06);/*显示光标移动设置*/
  251.    DelayMs(5);
  252.    write_com(0x0C); /*显示开及光标设置*/
  253.    write_com(0x01);  /*显示清屏*/
  254.    }

  255. void write_add(uchar add,uchar date)                                                                        //向指定寄存器发送指定数据
  256. {
  257.                 I2C_start();
  258.                 I2C_send_byte(0x80);
  259.                 Test_ACK();
  260.                 I2C_send_byte(add);
  261.                 Test_ACK();
  262.                 I2C_send_byte(date);
  263.                 Test_ACK();
  264.                 I2C_Stop();
  265. }

  266. void startAD()                                                                                                                        //发送ADC开始转换信号
  267. {
  268.         DRDY = 1;
  269.         delay_5us();
  270.         DRDY = 0;
  271.         I2C_start();
  272.         I2C_send_byte(0x80);
  273.         Test_ACK();
  274.         I2C_send_byte(0x08);
  275.         Test_ACK();
  276.         I2C_Stop();
  277.         DRDY = 1;
  278. }
  279.                                


  280. /***200MV电压测量***/
  281. void voltagemin()
  282. {

  283. while(1)
  284. {c =read_volt();
  285. POWER=0;
  286. result =(c*20480)/32767;        //transfer
  287. //if(result ==  0)
  288. //{
  289. // qwe = 0;
  290. //} else
  291. //{
  292. qwe= result*10 +140;
  293. //}


  294. disp[0]=qwe/10000;
  295. disp[1]=qwe%10000/1000;
  296. disp[2]=qwe%10000%1000/100;
  297. disp[3]=qwe%10000%1000%100/10;
  298. disp[4]=qwe%10000%1000%100%10;
  299. write_com(0x01);
  300. if(disp[0]>=2)
  301. {Write_String(0,0,"Voltage.MEASURE");  
  302. Write_String(0,1,"Beyond the range!"); }
  303. if(disp[0]<2)
  304. {Write_String(0,0,"Voltage.MEASURE");   
  305. Write_String(0,1,"value=");
  306. LCD_Write_Char(9,1,'.');
  307. if(disp[4]==0)
  308. disp[4]=0;
  309. if(disp[4]>=1&&disp[4]<=5)
  310. disp[4]=3;
  311. if(disp[4]>=6&&disp[4]<=9)
  312. disp[4]=7;
  313. LCD_Write_Char(14,1,'M');
  314. LCD_Write_Char(15,1,'V');
  315. LCD_Write_Char(6,1,disp[0]+48);
  316. LCD_Write_Char(7,1,disp[1]+48);
  317. LCD_Write_Char(8,1,disp[2]+48);
  318. LCD_Write_Char(10,1,disp[3]+48);
  319. LCD_Write_Char(11,1,disp[4]+48);
  320. DelayMs(5);
  321. }
  322. if((key2_S3==0)||(key3_S4==0)||(key4_S5==0))
  323. break;
  324. }
  325. }
  326. /***2欧姆电阻测量***/
  327. void resmin ()
  328. {
  329. while(1)
  330. {
  331. int m;
  332. POWER=1;
  333. c=read_volt();
  334. math =(c*2.048)/32767;//transfer
  335. R=(math*11.6)/(3.26-math);
  336. if(R<=0)
  337. {
  338. qwe = 0;
  339. }        else
  340. {
  341. m=(R-8.7)*1000;
  342. qwe=m;
  343. }



  344. dis[0]=qwe/1000;
  345. dis[1]=qwe%1000/100;
  346. dis[2]=qwe%1000%100/10;
  347. dis[3]=qwe%1000%100%10;
  348. write_com(0x01);
  349. if(dis[0]>=2)
  350. {Write_String(0,0,"RES.MEASURE");  
  351. Write_String(0,1,"Beyond the range!"); }
  352. if(dis[0]<2)
  353. {Write_String(0,0,"RES.MEASURE");   
  354. Write_String(0,1,"value=");
  355. LCD_Write_Char(7,1,'.');
  356. LCD_Write_Char(15,1,0xf4);
  357. LCD_Write_Char(6,1,dis[0]+48);
  358. LCD_Write_Char(8,1,dis[1]+48);
  359. LCD_Write_Char(9,1,dis[2]+48);
  360. LCD_Write_Char(10,1,dis[3]+48);
  361. DelayMs(5);
  362. }
  363. if((key2_S3==0)||(key1_S2==0)||(key4_S5==0))
  364. break;
  365. }
  366. }
  367. /***200k欧姆电阻测量***/
  368. void resmax ()
  369. {
  370. while(1)
  371. {

  372. int m;
  373. POWER=0;
  374. c=read_volt();
  375. math =(c*2.048)/32767;//transfer
  376. R=(math*2964.4)/(3.25-math);
  377. if(R == 0)
  378. {
  379. qwe = 0 ;
  380. } else
  381. {
  382. m=R-0.10078;
  383. qwe=R;
  384. }


  385. dis[0]=qwe/1000;
  386. dis[1]=qwe%1000/100;
  387. dis[2]=qwe%1000%100/10;
  388. dis[3]=qwe%1000%100%10;
  389. write_com(0x01);
  390. if(dis[0]>=2)
  391. {Write_String(0,0,"RES.MEASURE");  
  392. Write_String(0,1,"Beyond the range!"); }
  393. if(dis[0]<2)
  394. {Write_String(0,0,"RES.MEASURE");   
  395. Write_String(0,1,"value=");
  396. LCD_Write_Char(9,1,'.');
  397. if(disp[3]==0)
  398. {disp[3]=0;}
  399. if((disp[3]>=1)&&(disp[3]<=5))
  400. {disp[3]=3;        }
  401. if((disp[3]>=6)&&(disp[3]<=9))
  402. {disp[3]=7;}
  403. LCD_Write_Char(14,1,'k');
  404. LCD_Write_Char(15,1,0xf4);
  405. LCD_Write_Char(6,1,dis[0]+48);
  406. LCD_Write_Char(7,1,dis[1]+48);
  407. LCD_Write_Char(8,1,dis[2]+48);
  408. LCD_Write_Char(10,1,dis[3]+48);
  409. DelayMs(5);
  410. }
  411. if((key2_S3==0)||(key1_S2==0)||(key3_S4==0))
  412. break;
  413. }
  414. }

  415. /***2V电压测量***/
  416. void voltagemax ()
  417. {while(1)
  418. {
  419. c =read_volt();
  420. POWER = 0;
  421. result =(c*20480)/32767;        //transfer
  422. if(result == 0)
  423. {
  424. qwe = 0;
  425. }
  426. if(result < 10000 && result > 0)
  427. {
  428.   qwe=result+18;
  429. }
  430. if(result >= 10000)
  431. {
  432. qwe=result+20;
  433. }



  434. disp[0]=qwe/10000;
  435. disp[1]=qwe%10000/1000;
  436. disp[2]=qwe%10000%1000/100;
  437. disp[3]=qwe%10000%1000%100/10;
  438. disp[4]=qwe%10000%1000%100%10;
  439. write_com(0x01);
  440. if(disp[0]>=2)
  441. {Write_String(0,0,"Voltage.MEASURE");  
  442. Write_String(0,1,"Beyond the range!"); }
  443. if(disp[0]<2)
  444. {Write_String(0,0,"Voltage.MEASURE");   
  445. Write_String(0,1,"value=");
  446. LCD_Write_Char(7,1,'.');
  447. if(disp[4]==0)
  448. disp[4]=0;
  449. if(disp[4]>=1&&disp[4]<=5)
  450. disp[4]=3;
  451. if(disp[4]>=6&&disp[4]<=9)
  452. disp[4]=7;

  453. LCD_Write_Char(15,1,'V');
  454. LCD_Write_Char(6,1,disp[0]+48);
  455. LCD_Write_Char(8,1,disp[1]+48);
  456. LCD_Write_Char(9,1,disp[2]+48);
  457. LCD_Write_Char(10,1,disp[3]+48);
  458. LCD_Write_Char(11,1,disp[4]+48);

  459. DelayMs(5);
  460. }
  461. if((key1_S2==0)||(key3_S4==0)||(key4_S5==0))
  462. break;
  463. }

  464. }



  465. void keyscan()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
  466. {
  467.        
  468.         if(key1_S2==0)
  469.         {
  470.                 DelayMs(10);
  471.                 if(key1_S2==0)
  472.                 {
  473.                         voltagemin();
  474. while(!key1_S2);
  475.                 }
  476.         }
  477.         if(key2_S3==0)
  478.         {
  479.                 DelayMs(10);
  480.         if(key2_S3==0)
  481.              {
  482.                 voltagemax();
  483. while(!key2_S3);
  484.              }
  485.         }
  486.         if(key3_S4==0)
  487.         {
  488.             DelayMs(10);
  489.         if(key3_S4==0)
  490.         {  resmin();
  491. while(!key3_S4);
  492.              }
  493.         }
  494.         if(key4_S5==0)
  495.         {
  496.             DelayMs(10);
  497.         if(key4_S5==0)
  498.         {  resmax();
  499. while(!key4_S5);
  500.              }               
  501.         }

  502. }



  503. /*主函数*/
  504. void main()
  505. {
  506. delay_800us();
  507. I2C_Init();                                                                                                                                //总线初始化
  508. Reset();                                                                                                                        //重置ADC
  509. write_add(0x44,0xc8);                                                                                                //向01h寄存器发送数据0xc8
  510. I2C_start();
  511. I2C_send_byte(0x80);
  512. Test_ACK();
  513. I2C_send_byte(0x24);
  514. Test_ACK();
  515. I2C_start();
  516. I2C_send_byte(0x81);
  517. Test_ACK();
  518. Master_ACK(1);
  519. I2C_Stop();                       
  520. startAD();                                                                                                                                        //发送ADC开始转换信号
  521. LCD_Init();
  522. DelayMs(10);

  523. while(1)
  524. {
  525. keyscan();
  526. }
  527.    }
复制代码

所有资料51hei提供下载:
ADCtext.rar (44.7 KB, 下载次数: 36)
回复

使用道具 举报

ID:670155 发表于 2021-4-1 22:31 | 显示全部楼层
有电路图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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