找回密码
 立即注册

QQ登录

只需一步,快速开始

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

可以帮忙看看这个单片机仿真为什么没结果吗?

[复制链接]
跳转到指定楼层
楼主
ID:1050626 发表于 2022-11-5 16:58 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

uint dianya;   //电压

sbit CS=P1^5;                //CS定义为P1口的第3位脚,连接ADC0832CS脚
sbit CLK=P1^6;                //CLK定义为P1口的第4位脚,连接ADC0832CLK脚
sbit DODI=P1^7;                //DODI定义为P1口的第5位脚,连接ADC0832DODI脚
  
sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P1^2;         //片选信号   下降沿触发


/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
        while(q--);
}

/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602指令函数
* 输入 : 输入的指令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
         rs=0;             //写指令
        rw=0;             //对1602写操作
        P0=com;             //P0口对1602写指令数据
        delay_uint(25);
        e=1;                 //e=1使能信号
        delay_uint(100);   //延时一下等1602完成操作
        e=0;
}

/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
         rs=1;             //写数据
        rw=0;             //对1602写操作
        P0=dat;                  //P0口对1602写数据
        delay_uint(25);
        e=1;                 //e=1使能信号
        delay_uint(100);   //延时一下等1602完成操作
        e=0;        
}

/********************************************************************
* 名称 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
                  write_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);           //1602写第一行的地址
        else
                write_com(0x80+0x40+add);   //1602写第二行的地址
        while(1)                                                                                                                 
        {
                if(*p == '\0')  break;        //\0字符串的结尾标志  break结束while循环 结束写字符
                write_data(*p);            //写数据
                p++;                    //指针地址加1  
        }        
}

/***********************lcd1602上显示3位十进制数************************/
void write_lcd3_dy(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);           //1602写第一行的地址
        else
                write_com(0x80+0x40+add);  //1602写第二行的地址
        write_data(0x30+date/100%10);  //显示百位数
        write_data('.');                           //显示小数点
        write_data(0x30+date/10%10);   //显示十位数
        write_data(0x30+date%10);           //显示个位数        
}

/***********************lcd1602初始化设置************************/
void init_1602()
{
        write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口 不检测忙信号
        write_com(0x0c);  //开显示 不显示光标
        write_com(0x06);  //当写一个字符是,地址指针加 1
        write_string(1,0,"     U=0.00V     ");           //初始化1602显示
}

/***********读数模转换数据*******************/        
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
unsigned char ad0832read(bit SGL,bit ODD)
{
        unsigned char i=0,value=0;               
        CLK=0;
        DODI=1;
        CS=0;                //开始
        CLK=1;                //第一个上升沿        
        CLK=0;
        DODI=ODD;        //通道选择
        CLK=1;          //第二个上升沿
        CLK=0;
        DODI=SGL;        //通道选择
        for(i=0;i<8;i++)
        {
                CLK=1; //下降沿接收数据
                value<<=1;          //8位的数据高位在前
                CLK=0;
                if(DODI==1)          //如果DO为1  
                        value++;  //8位的数据低位置1                                                         
        }
        return value;          //返回0832采集到的数据
}

/****************主函数***************/
void main()
{        
        init_1602();                    //1602初始化
        while(1)
        {
                dianya = ad0832read(1,0);        //采集电压
                dianya = dianya * 100 / 255 * 5 * 2 ;
                write_lcd3_dy(1,7,dianya);         //显示电压
        }
}

1.jpg (204.56 KB, 下载次数: 80)

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

使用道具 举报

沙发
ID:121859 发表于 2022-11-6 08:39 | 只看该作者
上拉电阻排选错了,应该选共9个引脚的那种,一个公共端接VCC,其余八个接P0口。
回复

使用道具 举报

板凳
ID:1050626 发表于 2022-11-6 13:16 来自手机 | 只看该作者
zhxiufan 发表于 2022-11-6 08:39
上拉电阻排选错了,应该选共9个引脚的那种,一个公共端接VCC,其余八个接P0口。

对,这样就可以了
回复

使用道具 举报

地板
ID:1050626 发表于 2022-11-6 13:17 来自手机 | 只看该作者
zhxiufan 发表于 2022-11-6 08:39
上拉电阻排选错了,应该选共9个引脚的那种,一个公共端接VCC,其余八个接P0口。

可以再帮忙看看程序嘛,测量电压,一直都显示0v,测不出来
回复

使用道具 举报

5#
ID:195496 发表于 2022-11-7 15:49 | 只看该作者
仿真文件发上来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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