找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这是一年前弄的单片机控制的压力检测传感器源码+仿真

[复制链接]
跳转到指定楼层
楼主
电风扇是我用智能电风扇的仿真文件改的,所以其他功能没有,就只有压力传感器有用
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源码:
  1.                            
  2. #include"reg52.h"//头文件
  3. #include<intrins.h>
  4. #define DD P2
  5. sbit CS=P1^0; //定义端口
  6. sbit CLK=P1^1;
  7. sbit DO=P1^2;
  8. sbit DI=P1^3;
  9. sbit KEY=P1^7;
  10. sbit buzzer=P0^0;
  11. sbit Rs=P1^4;//LCD定义端口
  12. sbit Rw=P1^5;
  13. sbit E=P1^6;
  14. sbit busy_p=ACC^7;
  15. unsigned char CH=0x02,key_count=1;
  16. unsigned char HC[6]={0};
  17. unsigned char BZ=0;
  18. void delay_1ms(unsigned char i) //延时函数1ms
  19. {
  20. unsigned char j;
  21. while(i--)
  22. for(j=0;j<125; j++);
  23. }
  24. void delay_10ns(unsigned char i)//延时函数10ns
  25. {
  26. unsigned char j;
  27. while(i--)
  28. for(j=0;j<10; j++);
  29. }
  30. void xiezhiling(unsigned char com,bit p)//写命令函数
  31. {
  32. if(p)
  33. delay_10ns(5);
  34. E=0;
  35. Rs=0;
  36. Rw=0;
  37. DD=com;
  38. delay_10ns(50);
  39. E=1;
  40. delay_1ms(2);
  41. E=0;
  42. delay_10ns(4);
  43. }
  44. void xieshuju(unsigned char DATA)//写数据函数
  45. {
  46. delay_10ns(50);
  47. E=0;
  48. Rs=1;
  49. Rw=0;
  50. DD=DATA;
  51. delay_10ns(50);
  52. E=1;
  53. delay_10ns(50);
  54. E=0;
  55. delay_10ns(4);
  56. }

  57. void init(void)//初始化函数
  58. {
  59. delay_1ms(15);
  60. xiezhiling(0x38,0);
  61. delay_1ms(5);
  62. xiezhiling(0x38,0);
  63. delay_1ms(5);
  64. xiezhiling(0x38,0);
  65. delay_1ms(5);
  66. xiezhiling(0x38,1); //功能设定(8位,2行,5*7点矩阵)
  67. xiezhiling(0x08,1);
  68. xiezhiling(0x01,1); //清除屏幕
  69. xiezhiling(0x06,1); //加1
  70. xiezhiling(0x0c,1);//显示器ON,光标OFF,闪烁OFF
  71. }
  72. unsigned char ADconv(void)//AD转换子程序
  73. {
  74. unsigned char i;
  75. unsigned int data_f=0,data_c=0;
  76. DI=1;
  77. CS=1;
  78. _nop_();
  79. CS=0;
  80. DI=1; ;
  81. CLK=1;
  82. _nop_();
  83. _nop_();
  84. CLK=0;
  85. _nop_();
  86. _nop_();
  87. CLK=1;
  88. DI=(bit)(0x02&CH);
  89. _nop_();
  90. CLK=0;
  91. _nop_();
  92. _nop_();
  93. CLK=1;
  94. DI=(bit)(0x01&CH);
  95. _nop_();
  96. _nop_();
  97. CLK=0;
  98. DI=1;
  99. CLK=1;
  100. _nop_();
  101. _nop_();
  102. CLK=0;
  103. _nop_();
  104. CLK=1;
  105.      

  106. for(i=8;i>0;i--)
  107. {
  108.   data_f|=DO;
  109.   data_f<<=1;
  110.   CLK=1;
  111.   _nop_();
  112.   _nop_();
  113.   CLK=0;
  114.   _nop_();
  115. }
  116. for(i=8;i>0;i--)
  117. {
  118.   data_c<<=1;
  119.   data_c|=DO;
  120.   _nop_();
  121.   CLK=1;
  122.   _nop_();
  123.   _nop_();
  124.   CLK=0;
  125.   _nop_();

  126. }

  127. CLK=0;
  128. _nop_();
  129. _nop_();
  130. CLK=1;
  131. _nop_();
  132. _nop_();

  133. CLK=0;
  134. _nop_();
  135. _nop_();
  136. CLK=1;
  137. _nop_();
  138. CS=1;
  139. _nop_();
  140. _nop_();
  141. return data_f;
  142. }

  143. void xs_int(unsigned int shuju)//将一个数据各个位分开并存放在H C[]数组中
  144. {

  145. if(shuju < 10)
  146.   BZ = 1;
  147. else if(shuju < 100) BZ = 2;
  148. else if(shuju < 1000) BZ = 3;
  149. else if(shuju < 10000) BZ = 4;
  150. else if(shuju < 65535) BZ = 5;
  151. switch(BZ)
  152. {
  153.   case 5:HC[5] = shuju/10000; //百位
  154.   case 4:HC[3] = shuju%10000/1000;//十位
  155.   case 3:HC[2] = shuju%1000/100;//个位
  156.   case 2:HC[1] = shuju%100/10;//小数点后一位
  157.   case 1:HC[0] = shuju%10;
  158.   break;
  159.   default:break;
  160. }



  161. }
  162. void main(void)//主函数
  163. {
  164. unsigned int data_temp=0;
  165. init();
  166. TMOD=0x01;
  167. TH0=(65536-50000)/256;
  168. TL0=(65536-50000)%256;
  169. ET0=1;
  170. TR0=1;



  171. while(1)
  172. {
  173.   data_temp=ADconv();
  174.   if(data_temp>128)//报警数值
  175.   {
  176.    EA=1;
  177.   }
  178.   else
  179.   {
  180.    EA=0;
  181.    buzzer=0;
  182.   }
  183.   P3=~data_temp;
  184.   xs_int(196*data_temp);
  185.   if(KEY==0)
  186.   {
  187.    delay_1ms(10);
  188.    if(KEY==0)
  189.    while(!KEY);
  190.    key_count++;
  191.    if(key_count==3)
  192.    key_count=1;
  193.    xiezhiling(0x01,0);
  194.    
  195.   }

  196.   if(key_count==1)
  197.   {
  198.    xiezhiling(0x80,1);//LCD第一行
  199.    xieshuju('P');
  200.    xieshuju('R');
  201.    xieshuju('E');
  202.    xieshuju('S');
  203.    xieshuju('S');
  204.    xieshuju('U');
  205.    xieshuju('R');
  206.    xieshuju('E');
  207.    xieshuju('-');
  208.    xieshuju(HC[5]+0x30);
  209.    xieshuju(HC[3]+0x30);
  210.    xieshuju(HC[2]+0x30);
  211.    xieshuju('.');
  212.    xieshuju(HC[1]+0x30);
  213.    xieshuju('P');
  214.    xieshuju('a');
  215.   
  216.    xiezhiling(0x80+0x40,1);//LCD第二行
  217.    xieshuju('A');
  218.    xieshuju('l');
  219.    xieshuju('a');
  220.    xieshuju('r');
  221.    xieshuju('m');
  222.    xieshuju(' ');
  223.    xieshuju('S');
  224.    xieshuju('t');
  225.    xieshuju('a');
  226.    xieshuju('t');
  227.    xieshuju('u');
  228.    xieshuju('s');
  229.    xieshuju('-');
  230.    xieshuju('-');
  231.    xieshuju('O');
  232.    xieshuju('N');
  233.    
  234.   }
  235.   if(key_count==2)
  236.   {
  237.    xiezhiling(0x80,1);//LCD第一行
  238.    xieshuju('P');
  239.    xieshuju('r');
  240.    xieshuju('e');
  241.    xieshuju('s');
  242.    xieshuju('s');
  243.    xieshuju('u');
  244.    xieshuju('r');
  245.    xieshuju('e');
  246.    xieshuju(' ');
  247.    xieshuju('i');
  248.    xieshuju('s');
  249.    xieshuju(' ');
  250.    xieshuju('O');
  251.    xieshuju('K');
  252.    xieshuju(' ');
  253.    xieshuju(' ');
  254.    
  255.   
  256.    xiezhiling(0x80+0x40,1);//LCD第二行
  257.    xieshuju('m');
  258.    xieshuju('a');
  259.    xieshuju('d');
  260.    xieshuju('e');
  261.    xieshuju(' ');
  262.    xieshuju('B');
  263.    xieshuju('Y');
  264.    xieshuju(' ');
  265.    xieshuju('f');
  266.    xieshuju('u');
  267.    xieshuju('b');
  268.    xieshuju('a');
  269.    xieshuju('o');
  270.    xieshuju('j');
  271.    xieshuju('i');
  272.    xieshuju('e');
  273.    xieshuju(' ');
  274.    
  275.   }
  276.   
  277. …………
  278. …………
  279. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料51hei下载地址:
电风扇.zip (123.1 KB, 下载次数: 72)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:523790 发表于 2019-4-28 16:53 来自触屏版 | 只看该作者
unsigned char i; unsigned int data_f=0,data_c=0; DI=1; CS=1; _nop_(); CS=0; DI=1; ; CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); CLK=1; DI=(bit)(0x02&CH); _nop_(); CLK=0; _nop_(); _nop_(); CLK=1; DI=(bit)(0x01&CH); _nop_(); _nop_(); CLK=0; DI=1; CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); CLK=1;        for(i=8;i>0;i--) {   data_f|=DO;   data_f<<=1;   CLK=1;   _nop_();   _nop_();   CLK=0;   _nop_(); } for(i=8;i>0;i--) {   data_c<<=1;   data_c|=DO;   _nop_();   CLK=1;   _nop_();   _nop_();   CLK=0;   _nop_();  }  CLK=0; _nop_(); _nop_(); CLK=1; _nop_(); _nop_();  CLK=0; _nop_(); _nop_(); CLK=1; _nop_(); CS=1; _nop_(); _nop_(); return data_f; }请问这段代码各行的意思,求大神帮忙
回复

使用道具 举报

板凳
ID:523790 发表于 2019-4-28 17:20 来自触屏版 | 只看该作者
大神为什么我改了压力传感器的数值,依旧还是0.00Pa
回复

使用道具 举报

地板
ID:217347 发表于 2019-5-11 14:00 | 只看该作者
15259527920 发表于 2019-4-28 17:20
大神为什么我改了压力传感器的数值,依旧还是0.00Pa

找出为啥了吗
回复

使用道具 举报

5#
ID:736882 发表于 2020-4-28 15:27 | 只看该作者
在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。所以要接入压力传感器CH1而不是CH0
回复

使用道具 举报

6#
ID:736882 发表于 2020-4-28 15:28 | 只看该作者

较大范围之内,从而提高转换的宽度。在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。所以电源接ADC0832的CH1而不是CH0
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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