BASCOM-AVR代码:
' ==========================================================
' MAX5481数字电位器测试
'2025年10月17日
' ==========================================================
$regfile = "m16def.dat" ' 指定ATmega16单片机型号定义文件
$crystal = 8000000 ' 设置晶振频率为8MHz
$hwstack = 64 ' 设置硬件堆栈大小为64字节
$swstack = 64 ' 设置软件堆栈大小为64字节
$framesize = 64 ' 设置帧大小为64字节
' ==========================================================
' 引脚定义
' ==========================================================
Cs Alias Portb.4 ' 定义片选引脚CS连接到PORTB.4
' ==========================================================
' SPI 配置
' ==========================================================
' 配置硬件SPI:无中断、MSB先传、主机模式、时钟极性低、相位0、无从机选择
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1
Spiinit ' 初始化SPI接口
' ==========================================================
' 变量定义
' ==========================================================
Dim Command_byte As Byte ' SPI命令字节
Dim Data_high As Byte ' 数据高字节
Dim Data_low As Byte ' 数据低字节
Dim Test As Word ' 测试值变量
Dim Temp_word As Word ' 临时数据变量
' ==========================================================
' 串口配置
' ==========================================================
'Config Serialin = Buffered , Size = 20 ' 注释掉的串口输入缓冲配置
'Enable Interrupts ' 注释掉的中断使能
$baud = 9600 ' 设置串口波特率为9600
Test = 1023 ' 初始化测试值为1023(10位最大值)
' ==========================================================
' 子程序声明
' ==========================================================
Declare Sub Write_wiper(byval Value As Word) ' 声明写入Wiper位置的子程序
' ==========================================================
' 主程序开始
' ==========================================================
Waitms 10 ' 延时10ms,确保系统稳定
' ==========================================================
' 主循环 - 循环测试不同的Wiper位置
' ==========================================================
Do
' 测试不同的阻值位置
Call Write_wiper(Test) ' 写入最大阻值位置(1023)
Waitms 200 ' 延时200ms
Call Write_wiper(768) ' 写入75%位置(768)
Waitms 200
Call Write_wiper(512) ' 写入50%位置(512)
Waitms 200
Call Write_wiper(256) ' 写入25%位置(256)
Waitms 200
Call Write_wiper(0) ' 写入最小阻值位置(0)
Waitms 200
Loop
End ' 程序结束
' ==========================================================
' 写入Wiper位置子程序 (10位数字电位器)
' SPI传输格式:8位命令 + 16位数据(高10位有效,低6位无效)
' ==========================================================
Sub Write_wiper(byval Value As Word)
' 命令字节: 0x00 = 写入Wiper寄存器并立即更新
Command_byte = &H00
' 数据格式转换:将10位数据左移6位,放到16位数据的D15-D6位置
' 因为数字电位器只使用高10位,低6位被忽略
Temp_word = Value * 64 ' 相当于左移6位(乘以2^6=64)
Data_high = High(temp_word) ' 获取16位数据的高字节
Data_low = Low(temp_word) ' 获取16位数据的低字节
' SPI数据传输过程
Reset Cs ' 片选置低,开始SPI传输
Spiout Command_byte , 1 ' 发送命令字节
Spiout Data_high , 1 ' 发送数据高字节
Spiout Data_low , 1 ' 发送数据低字节
Set Cs ' 片选置高,结束SPI传输
' 调试输出 - 通过串口显示传输的数据
Print "输出原始值: " ; Value ' 输出原始值
Print "输出命令字节: " ; bin(command_byte) ' 以二进制格式输出命令字节
Print "输出数据高字节: " ; bin(data_high) ' 以二进制格式输出数据高字节
Print "输出数据低字节: " ; bin(data_low) ' 以二进制格式输出数据低字节
Print "---" ' 输出分隔线
End Sub
|