找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5302|回复: 2
收起左侧

STC15W408AS单片机电压采集次数不带掉电保存

[复制链接]
ID:330749 发表于 2018-11-14 11:37 | 显示全部楼层 |阅读模式
STC15W408AS  运用P1.4引脚进行电压采集并且进行电压压降几次,串口发送,文本模式

单片机源程序如下:
  1. #include "STC15F2K60S2.H"
  2. #include<intrins.h>
  3. /**********************************************
  4. 此程序为电压下降沿采集程序,串口发送电压及次数,不带掉电保存
  5. 采用单片机型号为STC15W408AS    采集引脚为P1.4
  6. 注:更改引脚需要更改ADC初始化引脚,对应数值需参考P1ASF介绍
  7.     还需更改ADC_CONTR的值,进行引脚变换频率的设定。
  8.         **********************************************************/
  9. void Delay_ms(unsigned int ms)            ///////////延时1000MS对应1S
  10. {
  11.         unsigned int a,b;
  12.         for(a=ms;a>0;)
  13.         {
  14.                 for(b=1000;b>0;)
  15.                 {
  16.                 b=b-1;
  17.                 }
  18.                 a--;
  19.         }
  20. }
  21. void TxChar(unsigned char send)
  22. {
  23. TI = 0;
  24. SBUF =send;
  25. while(!TI);
  26. TI = 0;
  27. }

  28. void SendFourData(unsigned char send)          
  29. {
  30. unsigned char a=0,b=0,c=0;
  31. a= (send/100)+0x30;               //对照ASCII表,0的编码"十进制"48--"十六进制"0x30
  32. b= (send/10%10)+0x30;             //接收方式为文本
  33. c= (send%10)+0x30;
  34. TxChar(a);
  35. TxChar(b);
  36. TxChar(c);
  37. }
  38. void ADC_int()                //ADc初始化
  39. {
  40.         P1ASF=0X10;                        //吧P1.4设置为ADC引脚
  41.         CLK_DIV=0X20;                //ADC结果设置       
  42.         ADC_CONTR=0X80;                //打开ADC 电源
  43.         ADC_RESL=0;                         /////ADC高位存储                                               
  44.         ADC_RES=0;                         /////ADC低位存储
  45.         Delay_ms(10);
  46. }
  47. unsigned int ADC_Read()                //读ADCCH6
  48. {
  49.         unsigned int a=0;
  50.         ADC_CONTR = 0X8c;                //启动ADC电源和设置P1.4口为ADC转换并且540个时钟转换一次
  51.         Delay_ms(1);               
  52.         while(!(ADC_CONTR&0X10));        //等待转换完成
  53.         a=ADC_RES*256+ADC_RESL;                //获取ADC结果
  54.         ADC_CONTR&=~0x10;
  55.         return a;
  56. }
  57. void UartInit()                                //9600bps@11.0592MHz
  58. {
  59.         SCON = 0x50;                //8位数据,可变波特率
  60.         AUXR = 0x14;
  61.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  62.         T2L = 65536-(11059200/4/9600);                //设定定时初值
  63.         T2H = (65536-(11059200/4/9600))>>8;                //设定定时初值
  64. }
  65. void Uartsend_1(unsigned char send)
  66. {
  67.         SBUF=send;                                                //发送数据
  68.         while(!TI);                                                //等待前一帧数据发送完毕
  69.         TI=0;                                                        //复位标志位
  70. }
  71. void U1_TX_C(char *send)
  72. {
  73.         unsigned char a=0;
  74.         while(send[a])
  75.         {
  76.          Uartsend_1(send[a]);
  77.          a++;
  78.         }
  79. }

  80. void Uartsend_adc(unsigned long send)
  81. {
  82.     unsigned char a[4],b,c[4];
  83.         int x=0,s=0,j=5;
  84.         send=send*500/1024;        //电压计算
  85.         a[0]=send%10+'0';               
  86.         a[1]=send/10%10+'0';               
  87.         a[2]='.';                                       
  88.            a[3]=send/100+'0';       
  89.         a[3]=a[3]-1;   
  90.        

  91.    for(b=4;b>0;b--)                        //发送
  92.    Uartsend_1(a[b-1]);                //
  93.    
  94. }

  95. void main()
  96. {                   int j=0;
  97.     int x=0,s=0,lj=0;
  98.         unsigned int adcnum;
  99.          unsigned char a=0;
  100.         ADC_int();                //ADc初始化
  101.         UartInit();                                //9600bps@11.0592MHz
  102.   while(1)
  103.         {
  104.             U1_TX_C("电压");
  105.                 Uartsend_1(0X22);//' “ '的十六进制数
  106.                 adcnum=ADC_Read();                //读取一次
  107.                 a= (adcnum/100)+0x30;        //对照ASCII表,0的编码"十进制"48--"十六进制"0x30
  108.                 if(a>56) s=1;
  109.             else if(a<=56)         x=1;  
  110.             if(s==1&&x==1)                             //电压下降沿检测
  111.              {j++;  //下降次数累加
  112.               s=0;}                  
  113.             Uartsend_adc(adcnum);   
  114.                 U1_TX_C("V");               
  115.                 Uartsend_1(0X22);                 //' “ '的十六进制数
  116.              Uartsend_1(0Xff);                 //空格
  117.                 U1_TX_C("次");
  118.                 SendFourData(j);
  119.                 x=0;
  120.                 if(j>=255)
  121.                 {lj++;
  122.                 j=0;}
  123.                 Uartsend_1(0Xff);
  124.                 U1_TX_C("累加");       
  125.                 SendFourData(lj);                                            
  126.                 Uartsend_1(0Xff);
  127.                 Uartsend_1(0Xff);
  128.                 Uartsend_1(0Xff);
  129.                 Uartsend_1(0Xff);
  130.                 Uartsend_1(0Xff);
  131.                 Uartsend_1(0Xff);
  132.                 Uartsend_1(0Xff);
  133.                 Uartsend_1(0Xff);
  134.                 Delay_ms(500);
  135.         }
  136. }
复制代码

所有资料51hei提供下载:
电压采集次数不带掉电保存.rar (45.5 KB, 下载次数: 49)

评分

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

查看全部评分

回复

使用道具 举报

ID:24685 发表于 2019-12-22 21:06 | 显示全部楼层
呵呵不错谢谢
回复

使用道具 举报

ID:1051901 发表于 2022-12-14 10:34 | 显示全部楼层
不错哦,可以试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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