找回密码
 立即注册

QQ登录

只需一步,快速开始

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

深入学习STC12单片机AD多通道转

[复制链接]
跳转到指定楼层
楼主
ID:358930 发表于 2018-12-4 03:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD的用途还是很大的
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define uchar unsigned char//只有256
  4. #define uint unsigned int//有16位但占内存。
  5. sbit rs=P2^6;//
  6. sbit rw=P2^5;//
  7. sbit en=P2^7;//
  8. sbit k1=P1^4;//按键
  9. sbit k2=P1^5;//按键
  10. sbit k3=P1^6;//按键
  11. sbit k4=P1^7;//按键
  12. sbit k5=P3^5;//按键
  13. uchar th=50;//放大10 倍
  14. uchar tl=37;//放大10 倍
  15. uint tmp;//tmp电压值
  16. sbit led=P2^0;
  17. //STC12C5A60S2 特殊功能寄存器 关于AD部分的寄存器定义
  18. sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器 通道配置
  19. sfr ADC_RES     =   0xBD;           //ADC高8位数据寄存器(存AD转换的结果,共10位)
  20. sfr ADC_LOW2    =   0xBE;           //ADC低2位数据寄存器(存AD转换的结果,共10位)
  21. sfr P1ASF       =   0x9D;           //P1第二功能选择寄存器
  22. unsigned char ch ; //ADC通道选择,本例程选择P1.0为AD转换,其他P1口做普通IO用 01234567
  23. unsigned int ad_out;//ADC_CONTR寄存器的位变量定义
  24. #define ADC_POWER   0x80            //ADC power control bit
  25. #define ADC_FLAG    0x10            //ADC complete flag
  26. #define ADC_START   0x08            //ADC start control bit
  27. #define ADC_SPEEDLL 0x00            //420 clocks
  28. #define ADC_SPEEDL  0x20            //280 clocks
  29. #define ADC_SPEEDH  0x40            //140 clocks
  30. #define ADC_SPEEDHH 0x60            //70 clocks
  31. void delay(unsigned int n)
  32. {
  33.     unsigned int x;
  34.     while (n--)
  35.     {
  36.         x = 5000;
  37.         while (x--);
  38.     }
  39. }
  40. void InitADC() //10位AD数据缓存
  41. {
  42.     P1ASF = 0xff;//设置P1.0为AD脚,P1ASF = 0x01 其他P1口为普通IO功能
  43.     ADC_RES = 0;                    //清空AD输出高8位
  44. //        if(++ch>7)ch=0;        //循环显示8个通道AD采样
  45.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  46.     delay(2);                       //ADC power-on delay and Start A/D conversion
  47. }                     
  48. void write_com(uchar com)//写命令
  49. {
  50. rs=0;//
  51. rw=0;
  52. en=0;
  53. P0=com;
  54. delay(2);
  55. en=1;
  56. delay(5);
  57. en=0;
  58. delay(2);
  59. }
  60. void write_dat(uchar dat)//写数据
  61. {
  62. rs=1;//
  63. rw=0;
  64. en=0;
  65. P0=dat;
  66. delay(2);
  67. en=1;
  68. delay(5);
  69. en=0;
  70. delay(2);
  71. }
  72. void write_zfc(uchar *p)//定义一个带指针的函数?(字符串)
  73. {
  74.         while(*p!=0)//不能用";"
  75.         write_dat(*p++);
  76. }
  77. void init_1602()//1602初始化
  78. {
  79. write_com(0x38);//设置16X2显示
  80. delay(1);
  81. write_com(0x0C);//0e光标不闪//0c不显//0f闪烁显示
  82. delay(1);
  83. write_com(0x06);//光标移位加1
  84. delay(1);
  85. write_com(0x01);//清屏
  86. delay(1);
  87. write_com(0x80);
  88. write_zfc("TH:");
  89. write_com(0x80+8);
  90. write_zfc("TL:");
  91. }
  92. void write_TH(uchar th)//高温显示
  93. {
  94. uchar a,b;
  95. a=th/10;
  96. b=th%10;
  97. write_com(0x80+3);
  98. write_dat(0x30+a);
  99. write_dat('.');
  100. write_dat(0x30+b);
  101. write_dat('V');  
  102. }
  103. void write_TL(uchar tl)//低温显示
  104. {
  105. uchar a,b;
  106. a=tl/10;
  107. b=tl%10;
  108. write_com(0x80+11);
  109. write_dat(0x30+a);
  110. write_dat('.');
  111. write_dat(0x30+b);
  112. write_dat('V');  
  113. }
  114.    void display()//4位显示子函数
  115. {
  116.    uchar qian,bai,shi,ge;

  117.         tmp = (ad_out * 50) / 1024; //10位AD读取的数值是0-1024,将这个值转换成对应的0-5V电压
  118.         qian=tmp/1000;
  119.         bai=tmp%1000/100;
  120.         shi=tmp%100/10;
  121.         ge=tmp%10;
  122.         write_com(0x80+0x40);
  123.         write_zfc("ch");
  124.         write_dat(0x30+ch);
  125.         write_com(0x80+0x40+5);
  126.         write_zfc("out:");
  127.       
  128.         //write_dat(0x30+qian);
  129.    // write_dat(0x30+bai);
  130.         write_dat(0x30+shi);
  131.         write_dat('.');
  132.     write_dat(0x30+ge);
  133.         //write_dat(0xdf);//显上0标志
  134.    write_dat('V');  
  135.    }
  136.         void keyscan()
  137. {
  138. if(k1==0)
  139. {
  140. delay(5);
  141. while(!k1);
  142. th++;
  143. if(th>50)
  144. th=0;
  145. write_TH(th);
  146. }
  147. if(k3==0)
  148. {
  149. delay(5);
  150. while(!k3);
  151. th--;
  152. if(th<1)
  153. th=50;
  154. write_TH(th);
  155. }
  156. if(k2==0)
  157. {
  158. delay(5);
  159. while(!k2);
  160. tl++;
  161. if(tl>50)
  162. tl=0;
  163. write_TL(tl);
  164. }
  165. if(k4==0)
  166. {
  167. delay(5);
  168. while(!k4);
  169. tl--;
  170. if(tl<1)
  171. tl=50;
  172.   write_TL(tl);
  173. }
  174.   if(k5==0)//选择AD通道0——7
  175. {
  176. delay(5);
  177. while(!k5);
  178. ch++;
  179. if(ch>7)
  180. ch=0;  
  181. }
  182. }
  183. void main()
  184. {               
  185.      InitADC();                      //AD初始化
  186.      IE = 0xa0;                      //允许AD中断
  187.      init_1602();         
  188.          write_TH(th);
  189.          write_TL(tl);
  190.          led=1;
  191.     while (1)
  192.         {
  193.             display();
  194.                  keyscan();
  195.             EA = 1;// 打开AD中断         
  196.            if(tmp>tl)//tmp电压值放大10倍进行比较显示
  197.            {led=0;}
  198.            else led=1;                          
  199.     }
  200. }
  201. void adc_isr() interrupt 5 using 1 //通道电压整合
  202. {
  203.     ADC_CONTR &= !ADC_FLAG;                                 //Clear ADC interrupt flag
  204.     ad_out = (ADC_RES << 2) + ADC_LOW2;                     //高8位+低两位
  205.         //if(++ch>7)ch=0;//循环显示8个通道AD采样
  206.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  207.       
  208. }
复制代码









1602显STC12 8通道按键选择显示OK.zip

43.12 KB, 下载次数: 28, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:358930 发表于 2018-12-4 03:30 | 只看该作者
上个图

20181204_030839.jpg (314.2 KB, 下载次数: 33)

20181204_030839.jpg

20181204_030925.jpg (353.06 KB, 下载次数: 30)

20181204_030925.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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