找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Stc15f2k60s2单片机模拟量使用源程序

[复制链接]
跳转到指定楼层
楼主
感言:用了两天时间,哎,不过弄出来真爽。


//硬件介绍:1.使用0~100N的压力传感器,模拟电压输出范围是:1V~4.3V,P1.1是一个继电器,设置成强推了,不用在意。
//功能介绍:1.获取P1.0口模拟电压值;2.转换成浮点发送给上位机,上位机显示“电压值与压力值”。
//接线介绍:将压力传感器与P1.0口相连接。
//注释:程序使用的是查询A/D方式,发送给上位机使用了两种方式,选其中一种即可,程序都已经调通,可直接使用。
//感谢“wulin”大神。
#include <stc15f2k60s2.H>                        
#include <intrins.H>     
#include <stdio.h>
#define uint unsigned int               
#define uchar unsigned char            
#define ulint unsigned long int
     
#define FOSC 11059200L          //系统频率
#define BAUD 9600            //串口波特率

#define ADC_POWER   0x80                //ADC power control dit (宏定义ADC电源控制位)1000 0000
#define ADC_FLAG    0x10                //ADC complete flag (宏定义ADC完成标志位)    0001 0000
#define ADC_START   0x08                //ADC start control dit (宏定义ADC启动控制位)0000 1000
#define ADC_SPEEDLL 0x00                //420 clocks (宏定义420时钟)速度控制         0000 0000
#define ADC_SPEEDL  0x20                //280 clocks (宏定义280时钟)速度控制         0001 0000
#define ADC_SPEEDH  0x40                //140 clocks (宏定义140时钟)速度控制         0010 0000
#define ADC_SPEEDHH 0x60                //070 clocks (宏定义70时钟)速度控制          0011 0000

sbit Q1=P1^1;                                //驱动继电器端口定义
uchar num1,num2;
uint  adcnum;
/*--------------------------------
   ms延时子程序 11.0592MHz时钟
---------------------------------*/
void delayms(uint k)
{
    uint i,j;            
    for(i=k;i>0;i--)   
        for(j=1150;j>0;j--);
}
/*----------------------------
串口初始化
-----------------------------*/
void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xE0;                        //设定定时初值
        T2H = 0xFE;                        //设定定时初值
        AUXR |= 0x10;                //启动定时器2
}
/*----------------------------
   初始化ADC
-----------------------------*/
void InitADC()
{
        P1ASF=0x01;                            //设置P1.0端口作为模拟输入
        ADC_RES=0;                            //Clear previous result (清除以前的结果)
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL;    //开启ACD电源、设置转换速度
        delayms(1);                                                //上电延时1ms                                       
}
/*----------------------------
   GET ADC
-----------------------------*/
uchar GetADCResult(uchar CHA)                                //获取ADC结果
{
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//启动转换1000 1000
        _nop_();                        //延时确保正确读到ADC_CONTR寄存器的值
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR & ADC_FLAG));        //等待ADC转换完成标志置位 1001 1000
        ADC_CONTR &=~ADC_FLAG;                        //关闭ADC
        return ADC_RES ;                                //返回八位ADC结果
}
//第一种方法:数组
void Uartsend_1(unsigned char send)
{
    SBUF=send;                        //发送数据
    while(!TI);                        //等待前一帧数据发送完毕
    TI=0;                            //复位标志位
}
void U1_TX_C(char *send)
{
    unsigned char a=0;
    while(send[a])
    {
     Uartsend_1(send[a]);
     a++;
    }
}
void Uartsend_adc_1(unsigned long send) //我也不懂啥意思,照搬
{

    unsigned char a[4],b;
    send=GetADCResult(0);
      send=send*504/256;    //电压计算
       a[0]=send%10+'0';        
       a[1]=send/10%10+'0';
    a[2]='.';                    
       a[3]=send/100+'0';        
   for(b=4;b>0;b--)            //发送
   Uartsend_1(a[b-1]);        //
}
//第二种方法:串口打印
void Uartsend_adc()
{
    float esp,esp1;
    num1=GetADCResult(0);
    esp=(num1*5.035/256)-0.002;    //电压计算,最后这个0.002是我自己补偿的
    TI=1;
    printf("电压: %4.3f", esp); //保留小数点后两位输出
    printf("V \n");      
    while(!TI);//判断是否发送完成  发送完成出循环
    TI = 0;   
    delayms(1000);
    TI=1;
    esp1=(esp-1.000)/0.033;
    printf("压力: %2.1f", esp1); //保留小数点后两位输出
    printf("N \n");      
    while(!TI);//判断是否发送完成  发送完成出循环
    TI = 0;   
}
/*--------------------------------------------------
主函数
---------------------------------------------------*/
void main()
{
        P1M1 = 0x01;                         //P1.0高阻 P1.1强推挽:0000 0001 ADC输入高阻、继电器强上拉
        P1M0 = 0x02;                         //P1.0高阻 P1.1强推挽:0000 0010 ADC输入高阻、继电器强上拉
        P_SW1= 0x40;                         //P3.6/P3.7串口1 RXD/TXD
        delayms(1000);
        Q1=0;                                //驱动继电器端口初始化0        
        InitADC();                            //Init ADC sfr (初始化ADC SFR)
        UartInit();   
        while(1)
        {      
            
                SBUF=GetADCResult(0);//发送数据,发送的是ADC_RES值
                while(!TI);                                //等待发送完毕
                TI=0;                                                //发送中断请求标志位清0
                delayms(2000);                        //延时2s发送一次
                adcnum=GetADCResult(0);                 //读取一次
                Uartsend_adc_1(adcnum);
                U1_TX_C("V");
                delayms(2000);
                Uartsend_adc();
                delayms(2000);
               
        }
}

模拟量.rar

41.26 KB, 下载次数: 23, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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