找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3180|回复: 0
收起左侧

单片机学习笔记(十)模数转换

[复制链接]
ID:108531 发表于 2016-3-12 16:45 | 显示全部楼层 |阅读模式
单片机模数转换实验,运行程序后,调节电位器,数据变化。
C语言源程序:
#include <reg52.h> //52单片机头文件包含
#include <intrins.h> //_nop()_函数头文件包含
#define uchar unsigned char //宏定义uchar 为 unsigned char
sbit SCL2=P1^3;//SCL2定义为P1口的第3位脚,连接ADC0831SCL脚
sbit SDA2=P1^4;//SDA2定义为P1口的第4位脚,连接ADC0831SDA脚
sbit CS2=P2^6;//CS2定义为P1口的第4位脚,连接ADC0831CS脚
sbit RST=P2^5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突
sbit wei1=P2^0;//数码管第一位
sbit wei2=P2^1;//数码管第二位
sbit wei3=P2^2;//数码管第三位
sbit wei4=P2^3;//数码管第四位
uchar code table[]={0xC0,0xF9,0xA4,0xB0,
                        0x99,0x92,0x82,0xF8,
                        0x80,0x90,0x88,0x83,
                        0xC6,0xA1,0x86,0x8E};//共阳数码管码表
uchar l_tmpdate[]={0,0,0};//定义无符号字符数组并赋初值0
void Delay_xuS(unsinged int x);//延时函数声明
void led_display(unsigned char *temp) //数码管显示函数声明
uchar ad0831read(void);//读取ADC0831数据函数声明
void main(void)//入口函数
{
    uchar i=254,tmp; //定义无符号字符变量i并赋值254和tmp
    RST=0;//关闭DS1302片选
    while(1){ //主循环
        i++;//i自加
        if(i==255){
            tmp=ad0831read();//这里为循环255个周期读取一次0831,因CPU运行比较快,没必要每次循环都去读取        i=0;i赋值为0
            l_tempdate[0]=tmp/100;//取百位上的数
            tmp=tmp % 100;//除100取余 取十位和个位上的数
            l_tmpdate[1]=tmp/10;//取十位上的数;
            l_tmpdate[2]=tmp%10;//取个位上的数
            //因读到的数据为8位的二进制数,即0~255,我们将其分开放入l_tmpdate数组中
        }
        led_display(l_tmpdate);//输出显示
    }
}
void Delay_xuS(unsigned int x) //延时函数
{
    unsigned int j,j; //定义无符号整型变量i,j   
    for(i=0;i<x;i++)//for循环循环x次
    {
        for(j=0;j<50;j++);//for循环循环50次
    }
}
void led_display(unsinged char *temp) //数码管显示子程序
{
    wei1=0;//打开数码管第1位显示
    P0=table[temp[0]];//数组第一位数据送P0
    Delay_xuS(5);//延时500uS
    wei1=1;//关闭数码管第1位显示
    wei2=0;//打开数码管第2位显示
    P0=table[temp[1]];//数组第二位数据送P0
    Delay_xuS(5);//延时500uS
    wei2=1;//打开数码管第2位显示
    wei3=0;//打开数码管第3位显示
    P0=table[temp[2]];//数组第三位数据送P0
    Delay_xuS(5));//延时500uS
    wei3=1;//关闭数码管第3位显示
}
uchar ad0831read(void) //读取ADC0831数据函数
{
    uchar i=0,tmp=0;//定义无符号字符变量i和tmp
    SDA=1;CS2=0;
    _nop_();_nop_();//延时
    CSL2=0;
    _nop_();_nop_();//延时
    CSL2=1;
    _nop_();_nop_();//延时
    SCL2=0;
    _nop_();_nop_();//延时
    SCL2=1;
    _nop_();_nop_();//延时
    SCL2=0;
    _nop_();_nop_();//延时
    for(i=0;i<8;i++){ //for循环循环8次
        tmp<<=1;//tmp左移1位赋值给tmp
        if(SDA2) //如果SDA2为真
            tmp++;//tmp值加1
        SCL2=1;
        _nop_();_nop_();//延时
        SCL2=0;
        _nop_();_nop_();//延时
    }
    CS2=1;
return tmp;//返回结果
}
//实验现象 调节电位器改变电压数码管值随之变化。

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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