基于Proteus的C51远程计算器

本文介绍了一种基于Proteus的C51远程计算器设计,实现主机通过矩阵键盘输入运算,从机接收并显示结果。涉及按键扫描、串口通信、字符串处理及LCD显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于Proteus的C51远程计算器

一、具体要求:
1、 主机的矩阵键盘输入数和运算符号,从机显示运算结果
2、 主从单片机串行通信系统,并在 LCD 上显示运算内容及结果

二、实验要点:
1、按键扫描
2、串口通信
3、字符串数据处理
4、LCD实时显示

三、设计方案:

1、主机通过扫描矩阵按键,返回对应数据,并经程序处理后将字符通过串口发送给从机,主机并不执行其他功能。

2、从机接收串口发送的数据,当接收到字符"="时,进行等式运算,并实时进行LCD显示。当接收到字符"c"时,LCD清屏,缓存的全部数据清0。

四、程序源码:
由于我是以小项目分块写的,所以各个程序不在同一个页面,如果强行复制在一起,可能会出问题,就只给出了main函数的程序,各个子函数就需要另外安排了,这就当给大家提供一个思路。
我开始还想着直接主机处理完全部数据,从机直接LCD显示就是了,为此还浪费了我不少时间,没想到换个思路主机传输数据,从机来处理计算一下子就好了。
当然如果大家需要,我的整个项目文件包括源程序和仿真我都放在文章末尾如果大家需要可以直接下载,喜欢的话点个关注,来个赞呗,谢谢哦。
1、主机main:

// 主机:按键扫描,并实时发送给从机
void main()
{   
    UsartInit();//串口初始化
    delay(200); 
    while(1)
    {          
        num=KeyPro();//按键扫描
        if(num!=0xff) //按键按下
        {  
            putchar(num);//串口实时发送
        }
    }
}

2、从机main:

// 接收串口数据,实时显示,并适时做等式运算
void main()
{      
    UsartInit();  //串口初始化
    LCD_init();   //LCD初始化
    putstring("Hello,this is calaulator\r\n");//串口打印数据,但LCD不显示
    putstring("He is made from Hebin and Wangshaoji\r\n");
    showstring(0,0,Hello_0);//LCD1602第1行
    showstring(0,1,Hello_1);//LCD1602第2行
    delayms(500);
    while(1)
    {   
  // 字符数据处理程序是写在中断函数里面的,所以这里直接调用显示就可以了
        showstring(0,0,dis_table0);//LCD实时显示
        showstring(0,1,dis_table1);
    }
}

五、Proteus仿真:
在这里插入图片描述
六、项目资料
失效链接:https://pan.baidu.com/s/1OAhFDi9IraFuk_7ZbbuOGA
提取码:nzfd

更新链接:https://pan.baidu.com/s/1fPRoXaYUJqUE23Uh_9PMzA
提取码:t9q4

蓝奏云:https://wwi.lanzoup.com/iRNRd0rdbwfe
更新日期20230329
最近才看见有小伙伴需要这个项目的资料,于是重新更新了一下链接。
不过找不到proteus软件了,而且我当时完成的时候软件是一个比较老版本的。
还好的是代码和基于老版本的仿真图还在,自己重新绘制一下仿真就行。

另外还有个问题:
大家都看见了,我在仿真时,调用了Proteus的矩阵键盘,但是又自己画了一个,是有原因的,就是调用的矩阵键盘不能使用,我也没有找到原因,但估计时程序里面的按键扫描函数需要升级,如果大家解决了,希望留言。

感谢大家的阅读,欢迎提问和共同学习。

<think>好的,用户想用Proteus和C51单片机实现百家姓灯的仿真项目。首先,我需要明确什么是“百家姓灯”。通常,这种项目可能涉及LED灯的流动显示,但用户希望用特定的姓氏或字符来展示,比如用LED点阵显示不同的姓氏。不过,用户提供的参考内容是关于流水灯的,所以可能需要结合两者的思路。 首先,我需要回顾用户提供的参考资料。引用[1]提到使用Proteus和Keil进行流水灯的设计,引用[2]给出了具体的C51代码和仿真电路。流水灯的基本原理是控制多个LED依次亮灭,形成流动效果。而百家姓灯可能需要显示不同的字符,可能需要用到点阵LED或者多个LED组合成字形。 接下来,考虑硬件设计。如果使用8x8点阵,可以显示简单的汉字或字母,但百家姓中的汉字可能比较复杂,可能需要更大的点阵,比如16x16。不过,对于单片机来说,驱动大点阵可能需要更多的IO口,可能需要使用动态扫描或者外接驱动芯片,比如74HC595来扩展IO。Proteus中是否有这样的元件支持?另外,用户提到的流水灯是直接连接P1口,每个引脚控制一个LED,而点阵可能需要行列控制。 软件部分,C51代码需要控制点阵的行和列,逐行扫描显示不同的姓氏。需要将姓氏的字模数据存储在数组中,通过定时器中断实现动态显示。参考引用[2]中的delay函数和移位操作,可能需要调整代码结构,使用定时器来提高显示的稳定性。 另外,用户可能没有点阵的经验,所以可能需要简化设计,比如使用多个LED排列成字形,每个LED代表姓氏中的一个笔画部分,或者使用数码管显示姓氏的拼音首字母。但数码管显示汉字有限,可能不太适合。 综合来看,一个可行的方案是使用8x8点阵显示简化后的姓氏,或者使用多个LED组成特定图案,通过程序控制其亮灭顺序。硬件上可能需要扩展IO口,软件上需要编写相应的控制代码,并生成字模数据。 在仿真电路设计时,需要添加单片机、点阵模块或LED阵列、可能的驱动芯片,以及必要的电阻等元件。代码部分需要初始化IO口,设置定时器,编写显示函数和字模数据。 可能遇到的问题包括点阵的驱动电流不足,显示闪烁,或者字模数据不正确。需要检查电路连接和代码中的扫描频率,以及字模生成是否正确。 最后,根据用户的需求,可能需要分步骤指导:设计电路图、编写代码、仿真测试。同时,考虑用户提供的代码是流水灯,可能需要在此基础上修改,加入字模显示逻辑。</think>### Proteus与C51实现百家姓灯的设计方案 #### 一、硬件设计思路 1. **显示模块选择** - 采用$8 \times 8$ LED点阵显示简化汉字(如姓氏首字或笔画较少的姓氏),例如“王”、“李”等。若需要更复杂显示,可级联多个点阵或改用$16 \times 16$点阵。 - 若仅需流水灯效果,可使用8个LED排列成特定姓氏的笔画路径(如“口”字形),通过流水灯顺序点亮[^1]。 2. **驱动电路设计** - 使用74HC595移位寄存器扩展IO口,解决C51单片机引脚不足问题。点阵的行列控制需配合驱动芯片实现动态扫描。 - 电路示例(简化版): ```plaintext C51 P0口 → 74HC595数据输入 → 点阵列控制 C51 P2口 → 点阵行控制 ``` 3. **Proteus仿真元件清单** - AT89C51单片机 - 8x8 LED点阵(或LED阵列) - 74HC595芯片、电阻、电源 --- #### 二、软件设计实现 1. **核心逻辑** - **字模提取**:使用PCtoLCD2002等工具生成姓氏的显示编码。例如“李”字对应二进制矩阵: ```c unsigned char code li_char[] = {0x08,0x14,0x22,0x7F,0x41,0x41,0x41,0x00}; //示例字模 ``` - **动态扫描**:通过定时器中断(如每2ms一次)刷新点阵显示,避免闪烁。 2. **代码框架** ```c #include <reg51.h> #include <intrins.h> #define ROW P2 //行控制端口 #define DATA_PIN P0_0 //74HC595数据引脚 #define CLK_PIN P0_1 //移位时钟 #define LATCH_PIN P0_2 //锁存时钟 unsigned char idx = 0; unsigned char code surname[] = { /* 字模数据 */ }; void Timer0_Init() { TMOD = 0x01; TH0 = 0xFC; TL0 = 0x67; //1ms定时 ET0 = 1; EA = 1; TR0 = 1; } void SendTo595(unsigned char dat) { for(int i=0; i<8; i++) { DATA_PIN = dat >> 7; CLK_PIN = 1; _nop_(); CLK_PIN = 0; dat <<= 1; } LATCH_PIN = 1; _nop_(); LATCH_PIN = 0; } void Timer0_ISR() interrupt 1 { TH0 = 0xFC; TL0 = 0x67; SendTo595(surname[idx]); //发送列数据 ROW = 0x01 << idx; //选中当前行 idx = (idx + 1) % 8; } void main() { Timer0_Init(); while(1); } ``` --- #### 三、仿真调试要点 1. **动态扫描同步**:定时器中断时间需与点阵刷新率匹配,建议控制在$1 \sim 5ms$[^2]。 2. **电流限制**:Proteus中LED点阵需串联限流电阻(典型值$220\Omega$)。 3. **扩展功能**:通过按键切换不同姓氏字模,可结合外部中断实现。 ---
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值