找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 880|回复: 8
收起左侧

关于单片机实验仿真的问题

[复制链接]
ID:1137320 发表于 2024-11-23 10:34 | 显示全部楼层 |阅读模式

这个仿真实验代码调试了很久也没有做出来,大佬能否提供一些具体思路
626573587c0cca2bc26a55a94a90d808.png
回复

使用道具 举报

ID:161164 发表于 2024-11-24 09:14 | 显示全部楼层
有问题请描述问题,预计表现,实际表现,提供代码,报错信息
回复

使用道具 举报

ID:420836 发表于 2024-11-24 09:28 | 显示全部楼层
您有可供验证的测试代码吗?
回复

使用道具 举报

ID:1137320 发表于 2024-11-24 10:57 | 显示全部楼层
#include <reg51.h>

sbit CLK= P3^1;
sbit EOC = P3^0;
sbit CS = P2^7;
sbit WRR = P3^6;
sbit RDD = P3^7;

unsigned char code SegmentTable[] =
{
    0xC0, // 0
    0xf9, // 1
    0xa4, // 2
    0xb0, // 3
    0x99, // 4
    0x92, // 5
    0x82, // 6
    0xf8, // 7
    0x80, // 8
    0x90  // 9
};
void delay(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 120; j++);  // 调整 120 的值以改变延时长度
    }
}

void Timer0_Init() {
    TMOD = 0x01;     // 定时器0,模式1(16位定时模式)
    TH0 = 0xFC;      // 设置初值高位
    TL0 = 0x18;      // 设置初值低位
    ET0 = 1;         // 允许定时器0中断
    EA = 1;          // 开启总中断
    TR0 = 1;         // 启动定时器0
}

void Timer0_ISR() interrupt 1 {
    TH0 = 0xFC;      // 重置初值高位
    TL0 = 0x18;      // 重置初值低位
    P3 ^= 0x02;   // 翻转P3.1电平(高->低或低->高)
}

void ADC_START()
{   
         CS = 0;
         WRR = 0;
         delay(1);    // 稳定信号
         CS = 0;   
     WRR = 1;    //与非让START为低电平,不触发
         delay(1);  
}

unsigned char ADC_GET()
{
        while (EOC == 0); // 等待 EOC = 1,表示转换完成
        delay(5);
        RDD = 0;
        CS = 0;
        delay(5);
        return P0;       // 返回采样结果
}

void main()
{
        unsigned int Result;
        unsigned char digits[3];
        unsigned char i;
        unsigned char position[]={0x02,0x04,0x08};

    Timer0_Init();   // 初始化定时器
    CS = 1;   
    WRR = 1;
        while (1)
        {
                 ADC_START();
                 Result = ADC_GET();
                 RDD = 1;
                 CS = 0;
                 Result = Result*100/51;       
                 digits[0] = Result/100;                           //最高位
             digits[1] = Result%100/10;
              digits[2] = Result%100%10;    // 小数部分
                 for(i = 0;i<3;i++)
                 {
                        P2 = position[i];
                        P1 = SegmentTable[digits[i]];       
                        if(i == 0)
                        {
                                P1 = P1 -0x80;       
                        }       
                        delay(1);
                        P2 = 0x00;

                 }                                                  
    }
}


现在已经实现功能了,但是数码管会闪烁
而且delay函数没法往下调了,j到119甚至就显示不出来了
回复

使用道具 举报

ID:92781 发表于 2024-11-24 11:29 | 显示全部楼层
共阳数码管的四个公共端,供电不足,AT89C52的拉电流有400微安,又加了限流电阻,根本驱动不了数码管,com1-com4用三极管驱动试试吧
回复

使用道具 举报

ID:92781 发表于 2024-11-24 11:32 | 显示全部楼层
不想用三极管,也可以吧r12-r15四个限流电阻改为上拉电阻
回复

使用道具 举报

ID:92781 发表于 2024-11-24 11:42 | 显示全部楼层
本帖最后由 jjy1039 于 2024-11-25 08:53 编辑

你那种是限流,改用上拉提高驱动能力就行了
上拉.jpg
回复

使用道具 举报

ID:961114 发表于 2024-11-25 09:21 | 显示全部楼层
你用AI8051U  兼容的  直接USB仿真,排产故障更简单
回复

使用道具 举报

ID:619259 发表于 2024-11-25 09:45 | 显示全部楼层
数码管动态显示会受A/D芯片转换时间的影响,出现闪烁,建议数码管用定时器扫描方式。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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