找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机酒精检测 AD转换 程序

[复制链接]
ID:971870 发表于 2021-10-22 16:43 | 显示全部楼层 |阅读模式
1.png

  1. #include<intrins.h>
  2. #include<reg51.h>
  3. #define uchar unsigned char
  4. #define nop  _nop_()

  5. code uchar seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90};
  6. uchar cp1,cp2,dat_ad;
  7. sbit CS = P3^0;
  8. sbit CLK = P3^1;
  9. sbit DIDO = P3^2;
  10. /*对ADC0832初始化处理*/
  11. void adc0832_init(void)
  12. {
  13. CS = 1;nop;                              
  14. CLK = 1;
  15. CS = 0;
  16. }
  17. /*对转换ch0通道的模拟信号*/
  18. uchar adc0832_ch0(void)
  19. {
  20. uchar dat1,i;
  21. adc0832_init();
  22. DIDO = 1;CLK = 0;nop;CLK = 1;nop;    //第一个下降沿,DI必须为高电平,表示启始信号
  23. DIDO = 1;CLK = 0;/*这里是第二个下降沿*/nop;CLK = 1;nop;    //第二个下降沿
  24. DIDO = 0;CLK = 0;/*这里是第三个下降沿*/nop;CLK = 1;nop;       //第三个下降沿,发送1,0;选择通道ch0
  25. DIDO = 1;          //释放总线
  26. /*上面都是配置位,达到了启动并选择通道0的作用*/




  27. for(i = 0;i<8;i++)        //第4个下降沿到第11个下降沿
  28. {           
  29.   CLK = 0;nop;        //
  30.   if(DIDO)dat1 = dat1|0x01;     //最低位置1(与特定数字按位或的作用,可以达到控制指定位而其他位不变)
  31.   //注意dat1是MCU中的数据嗷,ADC发送的是DIDO
  32.   CLK = 1;nop;        //这个CLK是单片机发给ADC的,因此在一个上升沿之间还可以处理一些程序。注意上面的这个IF语句是由MCU处理的啊!
  33.   dat1 = dat1<<1;        //左移,低位填充0,依次输出最高位
  34.   //DIDO每发送一位,MCU中的dat1变化一位。8位完成后即dat1返回
  35. }
  36. return(dat1);      //返回的是数模转换的值
  37. CS = 1;

  38. }


  39. void timer0_init()     //中断初始化函数
  40. {
  41. TMOD = 0x01;     
  42. TL0 = 0x78;
  43. TH0 = 0xec;
  44. EA = 1;
  45. TR0 = 1;
  46. ET0 = 1;
  47. }

  48. void timer0_isr()interrupt 1     //中断服务函数
  49. {
  50. TL0 = 0x78;
  51. TH0 = 0xec;
  52. cp1++;
  53. if(cp1>100)      //0.5s
  54. {
  55.   cp1 = 0;
  56.   dat_ad=adc0832_ch0();  //adc0832转换一次
  57. }
  58. P0 = 0xff;      //消隐
  59. switch(cp2)
  60. {
  61.   case 0:P0 = seven_seg[dat_ad%10];P2 = 0x01;break;
  62.      case 1:P0 = seven_seg[dat_ad%100/10];P2 = 0x02;break;
  63.   case 2:P0 = seven_seg[dat_ad/100];P2 = 0x04;break;
  64. }
  65. cp2++;
  66. if(cp2>=3)
  67. cp2 = 0;
  68. }
  69. void main()
  70. {
  71. timer0_init();
  72. adc0832_init();
  73. while(1);
  74. }
复制代码


回复

使用道具 举报

ID:1103924 发表于 2023-12-14 15:15 | 显示全部楼层
为什么改变滑动变阻器的阻值,数码管显示的数值不变呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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