652、基于51单片机的流水灯(独立按键,数码管,串口控制)

完整资料或定制滴滴我(有偿)见文末。

目录

一、设计功能

二、proteus仿真

三、原理图

四、程序源码

五、资料包括


一、设计功能

设计一个单片机扩展系统,要求:使用89C51或89C52单片机,扩展RAM(2K~8K),两片DAC0832(双缓冲),一片AD574(或ADC0809),一片8255,画出详细的单片机连接的接线图,编写各芯片的内部地址。

说明:ADC0808和ADC0809功能是完全一样的,就是型号的区别。仿真里面的ADC0809没有仿真模型,只能用ADC0808代替

内涵测试程序,程序功能:
1、将8255的PB发送到PA口;
2、将ADC0809的IN0电压输出到第一个DAC0832
3、将ADC0809的IN1电压输出到第二个DAC0832
4、向6264的第一个内存写入一个数字

二、proteus仿真

三、原理图

四、程序源码

五、资料包括

需要完整的资料可以点击下面的名片,找我要资源压缩包的百度网盘下载地址及提取码。

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。下面是一个简单的C语言程序示例,通过单片机的UART串口控制流水灯数码管。 ```c #include <reg52.h> #include <intrins.h> #define BAUDRATE 9600 sbit LATCH = P1^0; // 74HC595锁存器控制引脚 sbit SRCLK = P1^1; // 74HC595移位寄存器时钟引脚 sbit RCLK = P1^2; // 74HC595锁存器时钟引脚 sbit SER = P1^3; // 74HC595串行数据输入引脚 unsigned char disp_buf[4] = {0xFF, 0xFF, 0xFF, 0xFF}; // 数码管显示缓存 void delay(unsigned int t) { while(t--); } void init_uart() { TMOD |= 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; ES = 1; EA = 1; } void uart_isr() interrupt 4 { if(RI) { char c = SBUF; switch(c) { case '0': P0 = 0xFF; break; case '1': P0 = 0xFE; break; case '2': P0 = 0xFC; break; case '3': P0 = 0xF8; break; case '4': P0 = 0xF0; break; case '5': P0 = 0xE0; break; case '6': P0 = 0xC0; break; case '7': P0 = 0x80; break; case 'a': disp_buf[0] = 0x3F; disp_buf[1] = 0x06; disp_buf[2] = 0x5B; disp_buf[3] = 0x4F; break; case 'b': disp_buf[0] = 0x7C; disp_buf[1] = 0x5E; disp_buf[2] = 0x5E; disp_buf[3] = 0x3C; break; case 'c': disp_buf[0] = 0x3D; disp_buf[1] = 0x42; disp_buf[2] = 0x42; disp_buf[3] = 0x3D; break; case 'd': disp_buf[0] = 0x7C; disp_buf[1] = 0x42; disp_buf[2] = 0x42; disp_buf[3] = 0x3C; break; default: break; } RI = 0; } } void shift_byte(unsigned char byte) { unsigned char i; for(i = 0; i < 8; i++) { SRCLK = 0; SER = byte & 0x80; byte <<= 1; SRCLK = 1; } } void update_disp() { unsigned char i; for(i = 0; i < 4; i++) { LATCH = 0; shift_byte(disp_buf[i]); LATCH = 1; RCLK = 0; RCLK = 1; } } void main() { init_uart(); while(1) { update_disp(); delay(5000); disp_buf[0] = _crol_(disp_buf[0], 1); disp_buf[1] = _crol_(disp_buf[1], 1); disp_buf[2] = _crol_(disp_buf[2], 1); disp_buf[3] = _crol_(disp_buf[3], 1); } } ``` 在上述程序中,通过单片机的UART串口接收PC端发送的指令,并根据指令控制流水灯数码管的显示。指令格式为一个字符,取值范围为0~7和a~d,表示流水灯数码管的不同状态。例如,当接收到字符'0'时,流水灯关闭;当接收到字符'1'时,流水灯从左往右移动一个灯;当接收到字符'a'时,数码管显示"abcd",以此类推。 其中,74HC595是一个串行输入并行输出的移位寄存器。通过向74HC595的串行输入引脚SER输入数据,然后通过SRCLK和RCLK两个时钟引脚控制锁存器的移位和锁存操作,从而实现对多个LED灯或数码管控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值