找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AD转换,单片机C程序现在还缺什么步骤?

[复制链接]
跳转到指定楼层
楼主


  1. #include <reg51.h>
  2. #include <intrins.h>   //空操作函数_nop_()必须的头文件
  3. #include <stdio.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #ifndef __1602_H__
  7. #define __1602_H__
  8. sbit lcdrs=P2^0; //1602:0写指令,1写数据
  9. sbit lcdwr=P2^1; //1602读写信号
  10. sbit lcden=P2^2; //1602片选信号
  11. sbit TLC549_CS = P3^1;  //TLC549片选,低电平有效
  12. sbit TLC549_DO = P3^5;  //TLC549数字量输出
  13. sbit TLC549_CLK = P3^0;  //TLC549片外独立时钟
  14. sbit sta7=P0^7;
  15. unsigned char data1_convert(unsigned char dat_temp)
  16. {
  17. unsigned char data1;  
  18. data1=(unsigned char)(((float)dat_temp/255)*5); //换算为电压值的个位值
  19. data1=data1+48; //转换为对应的ASCII码,因为0对应ASCII码的48,以此类推
  20. return data1;   
  21. }
  22. unsigned char data0_convert(unsigned char dat_temp)
  23. {  
  24. unsigned char data0,data1;  data1=(unsigned char)(((float)dat_temp/255)*5);     //换算为电压值的个位值
  25. data0=(unsigned char)((((float)dat_temp/255)*5-data1)*10);//换算为为电压值的小--  
  26.                                                         //--数点后第一位的那个?
  27. data0=data0+48;            
  28. return data0;             //转换为对应的ASCII码
  29. }
  30. void delayus(unsigned int t);  //声明 延时t个机器 周期
  31. //**********************************
  32. //AD转换
  33. //**********************************
  34. unsigned char TLC549_read()   
  35. {  
  36. unsigned char i , temp;  
  37. TLC549_CS = 1;    //关闭片选  
  38. TLC549_CLK = 0;    //时钟线拉低  
  39. TLC549_CS = 0;    //打开片选  
  40. _nop_();  //空操作等待两个机器周期待总线稳定
  41. _nop_();
  42. for( i = 0; i < 8; i++ )  //循环8次读出8位转换结果
  43. {   
  44. temp <<= 1;   
  45. temp |= TLC549_DO;  
  46. TLC549_CLK = 1;
  47. _nop_();   
  48. TLC549_CLK = 0;
  49. }
  50. TLC549_CS = 1;  
  51. delayus(14);  //TLC549转换速度小于14微秒,大致延时14微秒等待转换结束  
  52. return temp; //返回转换值
  53. }
  54. //**********************************
  55. //AD转换
  56. //**********************************
  57. /*uint n1,ad1;  
  58. uint read_549(void)
  59. {  
  60. uchar i,value;
  61. TLC549_CS=0;
  62. TLC549_CLK=0;
  63. for(i=0;i<8;i++)
  64. {
  65. value=value<<1;
  66. value|=TLC549_DO;
  67. TLC549_CLK=1;
  68. delayus(1);
  69. TLC549_CLK=0;
  70. }
  71. TLC549_CLK=1;
  72. delayus(2);  
  73. return value;
  74. }  
  75. void zhh()
  76. {
  77. uint temp,n2;
  78. n2=(n1/10)%10;
  79. temp=read_549();
  80. n1=temp*3;
  81. if((n1/10)%10-n2==1)
  82. {  
  83. ad1=800;  
  84. }   
  85. }
  86. */
  87. /***********************1ms延时函数**********************/
  88. void delayms(uint ms)
  89. {
  90. uint y;
  91. while(ms--)
  92. {
  93. for(y=0;y<125;y++);
  94. }
  95. }
  96. //******************判忙*********************
  97. void lcd_busy_check(void)   //1602忙信号检测,忙则等待
  98. {  
  99. P0=0xff;   
  100. do  
  101. {   
  102. lcdrs=0;   //读状态操作,为0   
  103. lcdwr=1;      //读操作为1   
  104. lcden=0;   
  105. lcden=1;   //读状态,需为高电平
  106. }   
  107. while (sta7==1);  //如果为1则忙,等待...直到为0   
  108. lcden=0;
  109. }
  110. /***********************LCD写指令 写数据**********************/
  111. void LCD_write_cmd(unsigned char cmd) //液晶写?
  112. {  
  113. lcd_busy_check(); //每次操作之前都要进行忙信号检测
  114. lcdrs=0;   //执行数据操作,为1  
  115. lcdwr=0;   //写操作,为0  
  116. P0=cmd;    //送数据到液晶数据端口P0,准备执行数据操?
  117. lcden=1;   //高电平,数据送入液晶液晶数据RAM  
  118. _nop_();  //保持一会儿,使显示数据可靠地送入液晶数据RAM  
  119. lcden=0;   //低电平,显示数据
  120. }
  121. void LCD_write_data(unsigned char Data) //液晶写数据函数
  122. {  
  123. lcd_busy_check(); //每次操作之前都要进行忙信号检测
  124. lcdrs=1;   //执行数据操作,为1  
  125. lcdwr=0;   //写操作,为0  
  126. P0=Data;    //送数据到液晶数据端口P0,准备执行数据操作

  127. lcden=1;   //高电平,数据送入液晶液晶数据RAM  
  128. _nop_();   //保持一会儿,使显示数据可靠地送入液晶数据RAM  
  129. lcden=0;   //低电平,显示数据
  130. }
  131. /***********************LCD初始化*********************/
  132. void LCD_init()  
  133. {  
  134. delayms(15);
  135. LCD_write_cmd(0x38);
  136. delayms(5);
  137. LCD_write_cmd(0x38);//8位总线、双行5×7点阵
  138. LCD_write_cmd(0x08);
  139. LCD_write_cmd(0x01);
  140. LCD_write_cmd(0x06);
  141. delayms(5);
  142. LCD_write_cmd(0x0c);
  143. }
  144. /**********************主函数*********************/
  145. void main()  
  146. {  
  147. unsigned char dat;   //用于接收从8591中读到的数据
  148. LCD_init();
  149. LCD_write_cmd(0x80);  
  150. LCD_write_data('C');  
  151. LCD_write_data('H');  
  152. LCD_write_data('1');  
  153. LCD_write_data(':');  
  154. LCD_write_cmd(0x85);
  155. LCD_write_data('.');
  156. LCD_write_cmd(0x87);
  157. LCD_write_data('V');
  158. while(1)  
  159. {   
  160. LCD_write_cmd(0x84);                 //将要显示的字符显示在此地址处
  161. LCD_write_data(data1_convert(dat));  //显示电压的整数部分
  162. LCD_write_cmd(0x86);                //将要显示的字符显示在此地址处
  163. LCD_write_data(data0_convert(dat));  //显示电压的小数部分
  164. }
  165. }
  166. #endif
复制代码


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

使用道具 举报

沙发
ID:276150 发表于 2018-1-17 11:53 | 只看该作者
主要是main函数怎么写
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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