找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我的示波器仿真时,输出屏一直是黑的呢?

[复制链接]
跳转到指定楼层
楼主
ID:1170740 发表于 2026-5-4 12:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我打算自制一个基于STC89C52的单片机作为51单片机课程的课设,从网上找了个用STC60作为主控芯片的方案,想着自己添加一个ADC0832去实现相同的单片机功能,现在画了一个仿真图想试试效果,但是下进去代码之后就没有任何显示,经过了豆包和deepseek一块检查,一直在改代码,现在想求助一下,请问我的仿真连线有什么问题吗?附上我的原理图,请求大佬出手相助。

这个示波器用的是STC89C52作为主控芯片,MC33072,ADC0832作为数字信号和模拟信号的输入,加了个LM393作为频率记录,降压芯片用的是SCT2450


现在就是想问一下硬件方面有没有问题,因为我还不熟悉代码,所有代码都是用AI帮忙编写的。

屏幕截图 2026-05-04 124329.png (99.84 KB, 下载次数: 0)

这里是下载了代码之后的效果

这里是下载了代码之后的效果

屏幕截图 2026-05-04 124319.png (103.19 KB, 下载次数: 0)

这是没有启动的情况

这是没有启动的情况

屏幕截图 2026-05-04 125341.png (214.76 KB, 下载次数: 0)

这是我的示波器原理图

这是我的示波器原理图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1170740 发表于 2026-5-5 12:14 | 只看该作者
有没有人能帮帮我呢
回复

使用道具 举报

板凳
ID:161164 发表于 2026-5-5 15:17 | 只看该作者
代码呢?
回复

使用道具 举报

地板
ID:342822 发表于 2026-5-5 19:31 | 只看该作者
查看仿真里的示例“Adafruit LI9341 TFT LCD Demo”如何接线的!!
回复

使用道具 举报

5#
ID:1170889 发表于 2026-5-6 23:44 | 只看该作者
频率没对吧
回复

使用道具 举报

6#
ID:584814 发表于 2026-5-7 08:19 | 只看该作者
要信任AI,大胆执着地继续用AI试,总有成功的一天。
别特么信坛里的人,他们都要见源码和仿真什么的才愿意出手,比AI弱爆了。
回复

使用道具 举报

7#
ID:844772 发表于 2026-5-7 10:43 | 只看该作者
除了电压有点高,看不出哪错,建议就画条线,看看是否能行。
回复

使用道具 举报

8#
ID:1064915 发表于 2026-5-7 14:54 | 只看该作者
有STC60这个芯片吗
回复

使用道具 举报

9#
ID:76027 发表于 2026-5-7 16:43 | 只看该作者
代码一点都看不懂,就上AI写代码。AI会忽悠你到老。别信网上说的,不懂代码可以直接让AI写。
回复

使用道具 举报

10#
ID:1156764 发表于 2026-5-7 18:05 | 只看该作者
看着没有什么严重的问题,
或许你可以先不接放大器电路唷,随便接个电压进去,看看能不能打印出来,
如果都打不了的话,很有可能是代码的问题
回复

使用道具 举报

11#
ID:1170740 发表于 2026-5-7 18:36 | 只看该作者

#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int

/************************ 引脚定义(严格匹配仿真图)************************/
// LCD1 控制引脚
sbit LCD_RES  = P1^6;  // RES -> P1.6
sbit LCD_DC   = P1^5;  // D/C -> P1.5
sbit LCD_CS   = P1^4;  // CS  -> P1.4
sbit LCD_WR   = P1^7;  // WR  -> P1.7
sbit LCD_RD   = P1^3;  // RD  -> P1.3
#define LCD_DATA  P0   // 数据总线 D0~D7 -> P0口(含P0.0蜂鸣器,不影响)

// ADC0832 引脚
sbit ADC_CS   = P1^0;  // CS  -> P1.0
sbit ADC_CLK  = P1^1;  // CLK -> P1.1
sbit ADC_DI   = P1^2;  // DI  -> P1.2
sbit ADC_DO   = P1^2;  // DO  -> P1.2(ADC0832 DI/DO复用)

// 蜂鸣器
sbit BEEP     = P0^0;  // 蜂鸣器 -> P0.0

/************************ 基础参数定义 ************************/
#define SCREEN_W  240   // LCD宽度
#define SCREEN_H  320   // LCD高度
#define BASE_Y    160   // 波形基准线(屏幕垂直中心)
#define SCALE     1     // 电压缩放系数(适配ADC采样值)
#define RED       0xF800// 基准线颜色
#define GREEN     0x07E0// 波形颜色
#define BLACK     0x0000// 背景色

/************************ 延时函数(12MHz晶振适配)************************/
void delay_ms(uint ms) {
    uint i,j;
    for(i=ms; i>0; i--)
        for(j=110; j>0; j--);
}

void delay_us(uint us) {
    while(us--);
}

/************************ LCD1(ILI9341)驱动函数 ************************/
// 写指令
void lcd_write_cmd(uchar cmd) {
    LCD_DC = 0;  // 指令模式
    LCD_CS = 0;
    LCD_RD = 1;  // 禁用读
    LCD_DATA = cmd;
    LCD_WR = 0;
    LCD_WR = 1;  // 上升沿写指令
    LCD_CS = 1;
}

// 写数据
void lcd_write_data(uchar dat) {
    LCD_DC = 1;  // 数据模式
    LCD_CS = 0;
    LCD_RD = 1;
    LCD_DATA = dat;
    LCD_WR = 0;
    LCD_WR = 1;  // 上升沿写数据
    LCD_CS = 1;
}

// 设置显示窗口
void lcd_set_window(uint x1, uint y1, uint x2, uint y2) {
    lcd_write_cmd(0x2A);  // 列地址设置
    lcd_write_data(x1>>8); lcd_write_data(x1&0xFF);
    lcd_write_data(x2>>8); lcd_write_data(x2&0xFF);

    lcd_write_cmd(0x2B);  // 行地址设置
    lcd_write_data(y1>>8); lcd_write_data(y1&0xFF);
    lcd_write_data(y2>>8); lcd_write_data(y2&0xFF);

    lcd_write_cmd(0x2C);  // 写GRAM
}

// 画像素点
void lcd_draw_pixel(uint x, uint y, uint color) {
    if(x >= SCREEN_W || y >= SCREEN_H) return; // 边界保护
    lcd_set_window(x, y, x, y);
    lcd_write_data(color>>8);  // 高8位
    lcd_write_data(color&0xFF);// 低8位
}

// 清屏
void lcd_clear(uint color) {
    uint x, y;
    lcd_set_window(0, 0, SCREEN_W-1, SCREEN_H-1);
    for(y=0; y<SCREEN_H; y++) {
        for(x=0; x<SCREEN_W; x++) {
            lcd_write_data(color>>8);
            lcd_write_data(color&0xFF);
        }
    }
}

// LCD初始化(适配仿真图接线)
void lcd_init(void) {
    // LCD硬件复位
    LCD_RES = 0;
    delay_ms(20);
    LCD_RES = 1;
    delay_ms(50);

    // ILI9341初始化时序
    lcd_write_cmd(0xCF);
    lcd_write_data(0x00); lcd_write_data(0xC1); lcd_write_data(0X30);
    lcd_write_cmd(0xED);
    lcd_write_data(0x64); lcd_write_data(0x03); lcd_write_data(0X12); lcd_write_data(0X81);
    lcd_write_cmd(0xE8);
    lcd_write_data(0x85); lcd_write_data(0x00); lcd_write_data(0x78);
    lcd_write_cmd(0xCB);
    lcd_write_data(0x39); lcd_write_data(0x2C); lcd_write_data(0x00); lcd_write_data(0x34); lcd_write_data(0x02);
    lcd_write_cmd(0xF7); lcd_write_data(0x20);
    lcd_write_cmd(0xEA); lcd_write_data(0x00); lcd_write_data(0x00);
    lcd_write_cmd(0xC0); lcd_write_data(0x23);
    lcd_write_cmd(0xC1); lcd_write_data(0x10);
    lcd_write_cmd(0xC5); lcd_write_data(0x3E); lcd_write_data(0x28);
    lcd_write_cmd(0xC7); lcd_write_data(0x86);
    lcd_write_cmd(0x36); lcd_write_data(0x48);
    lcd_write_cmd(0x3A); lcd_write_data(0x55);
    lcd_write_cmd(0xB1); lcd_write_data(0x00); lcd_write_data(0x18);
    lcd_write_cmd(0xB6); lcd_write_data(0x08); lcd_write_data(0x82); lcd_write_data(0x27);
    lcd_write_cmd(0xF2); lcd_write_data(0x00);
    lcd_write_cmd(0x26); lcd_write_data(0x01);
    lcd_write_cmd(0xE0);
    lcd_write_data(0x0F); lcd_write_data(0x31); lcd_write_data(0x2B); lcd_write_data(0x0C);
    lcd_write_data(0x0E); lcd_write_data(0x08); lcd_write_data(0x4E); lcd_write_data(0xF1);
    lcd_write_data(0x37); lcd_write_data(0x07); lcd_write_data(0x10); lcd_write_data(0x03);
    lcd_write_data(0x0E); lcd_write_data(0x09); lcd_write_data(0x00);
    lcd_write_cmd(0xE1);
    lcd_write_data(0x00); lcd_write_data(0x0E); lcd_write_data(0x14); lcd_write_data(0x03);
    lcd_write_data(0x11); lcd_write_data(0x07); lcd_write_data(0x31); lcd_write_data(0xC1);
    lcd_write_data(0x48); lcd_write_data(0x08); lcd_write_data(0x0F); lcd_write_data(0x0C);
    lcd_write_data(0x31); lcd_write_data(0x36); lcd_write_data(0x0F);
    lcd_write_cmd(0x11);  // 退出睡眠
    delay_ms(120);
    lcd_write_cmd(0x29);  // 开启显示
    lcd_clear(BLACK);     // 清屏为黑色背景
}

/************************ ADC0832采样函数 ************************/
uchar adc0832_read(uchar ch) {
    uchar i, dat = 0, dat1 = 0;
    ADC_CS = 0;          // 选中ADC
    ADC_CLK = 0;         // 初始时钟低电平
    ADC_DI = 1;          // 起始位
    delay_us(1);
    ADC_CLK = 1;         // 时钟上升沿
    delay_us(1);
    ADC_CLK = 0;         // 时钟下降沿

    // 选择通道(ch=0选CH0,ch=1选CH1)
    ADC_DI = (ch == 0) ? 1 : 0;
    delay_us(1);
    ADC_CLK = 1;
    delay_us(1);
    ADC_CLK = 0;
    ADC_DI = 1;          // 通道选择确认位
    delay_us(1);
    ADC_CLK = 1;
    delay_us(1);
    ADC_CLK = 0;
    delay_us(1);

    // 读取8位采样数据
    for(i=0; i<8; i++) {
        ADC_CLK = 1;
        delay_us(1);
        ADC_CLK = 0;
        dat <<= 1;
        if(ADC_DO) dat |= 0x01;
    }
    // 读取反序数据(校验,可省略)
    for(i=0; i<8; i++) {
        dat1 >>= 1;
        if(ADC_DO) dat1 |= 0x80;
        ADC_CLK = 1;
        delay_us(1);
        ADC_CLK = 0;
    }
    ADC_CS = 1;          // 释放ADC
    return (dat == dat1) ? dat : 0; // 数据校验
}

/************************ 示波器核心功能 ************************/
// 绘制基准线+网格(可选,增强可视化)
void draw_base_line(void) {
    uchar x;
    // 绘制垂直基准线(红色)
    for(x=0; x<SCREEN_W; x++) {
        lcd_draw_pixel(x, BASE_Y, RED);
    }
}

// 实时绘制波形(示波器核心)
void draw_wave(void) {
    uchar x;
    uchar adc_val;
    int y_curr, y_prev = BASE_Y;

    // 从左到右逐点绘制波形
    for(x=0; x<SCREEN_W; x++) {
        adc_val = adc0832_read(0);  // 读取CH0采样值(仿真图中ADC接CH0)
        // 转换采样值为屏幕坐标(适配0~255采样值到屏幕高度)
        y_curr = BASE_Y - (adc_val - 128) * SCALE;

        // 边界保护(防止超出屏幕)
        if(y_curr < 0) y_curr = 0;
        if(y_curr >= SCREEN_H) y_curr = SCREEN_H - 1;

        // 清除上一帧对应位置(实现“滚动波形”效果)
        lcd_draw_pixel(x, y_prev, BLACK);
        // 绘制当前采样点
        lcd_draw_pixel(x, y_curr, GREEN);

        y_prev = y_curr;
        delay_us(50);  // 调整采样速度(值越小,波形越密)
    }
}

/************************ 主函数 ************************/
void main(void) {
    BEEP = 1;          // 关闭蜂鸣器
    lcd_init();        // 初始化LCD
    draw_base_line();  // 绘制基准线

    // 循环采集+绘制波形(示波器持续工作)
    while(1) {
        draw_wave();
    }
}

回复

使用道具 举报

12#
ID:1170740 发表于 2026-5-7 18:41 | 只看该作者
taotie 发表于 2026-5-5 19:31
查看仿真里的示例“Adafruit LI9341 TFT LCD Demo”如何接线的!!

仿真里ili9341的接线对应的分别是P1.3->SDI/SDA  P1.4->D/C/SCL  P1.5->CS  P1.6->RES  P1.7->WR/D/C
LEDK->GND  LEDA->100R->+5V
回复

使用道具 举报

13#
ID:1170740 发表于 2026-5-7 18:47 | 只看该作者
礼盒先生 发表于 2026-5-7 18:05
看着没有什么严重的问题,
或许你可以先不接放大器电路唷,随便接个电压进去,看看能不能打印出来,
如果 ...

没接运放的时候也是黑屏,好像没什么变化

屏幕截图 2026-05-07 184622.png (117.68 KB, 下载次数: 0)

这是我没接运放之后的效果

这是我没接运放之后的效果
回复

使用道具 举报

14#
ID:1170740 发表于 2026-5-7 18:50 | 只看该作者
man1234567 发表于 2026-5-7 08:19
要信任AI,大胆执着地继续用AI试,总有成功的一天。
别特么信坛里的人,他们都要见源码和仿真什么的才愿意 ...

我相信AI,不过我还是更期待前人的智慧,不敢苟同你的看法
回复

使用道具 举报

15#
ID:1170740 发表于 2026-5-7 18:51 | 只看该作者

可能是我的代码太长了,我去压缩一下试试能不能发出来
回复

使用道具 举报

16#
ID:1170740 发表于 2026-5-7 18:57 | 只看该作者
glinfei 发表于 2026-5-7 10:43
除了电压有点高,看不出哪错,建议就画条线,看看是否能行。

我刚刚试了一下,直接把信号发生器连接在c52的P1.0口也无法输出波形
回复

使用道具 举报

17#
ID:1170740 发表于 2026-5-7 19:02 | 只看该作者
发表于 2026-5-5 12:14
有没有人能帮帮我呢

还有就是我仿真的时候会弹出两条警告:1,simulation is not running in real time due to excessive CPU load。
这句的意思是由于CPU负载过高,仿真无法实时运行。
2,Simulation must be paused whilst measuring。
这句话的意思是进行测量时,必须暂停仿真!
或许这两个是解决我的问题的关键呢。
回复

使用道具 举报

18#
ID:1170740 发表于 2026-5-7 19:09 | 只看该作者
这是代码

main.zip

2.55 KB, 下载次数: 0

这是我的代码

回复

使用道具 举报

19#
ID:844772 发表于 2026-5-8 09:04 | 只看该作者
发表于 2026-5-7 18:57
我刚刚试了一下,直接把信号发生器连接在c52的P1.0口

你就单单写一段LCD程序,试试能不能显示呗。这种问题要每个模块分别试试,再组合。
回复

使用道具 举报

20#
ID:1170740 发表于 2026-5-8 17:02 | 只看该作者
joyb 发表于 2026-5-7 14:54
有STC60这个芯片吗

这是一个前缀,这个前缀的51芯片有内置ad,但是我用的是stc89c52
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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