吉林大学微机接口实验五:D/A转换

news2024/12/23 5:25:15

1.实验内容

2.实验原理/预备知识 

D/A转换器TLC7528是关键,其用法参见:

芯片部件汇总:常用功能部件大全-CSDN博客

直接找"TLC7528 D/A数模转换器"(实际上学校的讲义已经讲的很清楚,我只是给搬到了博客里)

3.实验电路图

        本次实验的电路较简单,直接按照讲义连接即可。只是拓展实验由于需要使用外部中断,需要加一根线,将'KK1+'端口连接到一个外部中断端口(MIR6或MIR7):

 4.实验代码(汇编和C语言版):

汇编语言:

 基础实验:

A0832 EQU 0600H     ;  IOY0地址是0600H,IOY1地址是0640H,IOY2地址是0680H
  
CODE SEGMENT
    ASSUME  CS:CODE

START:
    ;产生锯齿波
    MOV CX, 07H       ;锯齿波周期数
JUCHI:
    MOV DX, A0832     ;DAC0832接IOY0,0600H为控制端口地址
    MOV AL, 00H       ;AL为数字量
JC1: 
    OUT DX, AL        ;转换为模拟量
    CALL DELAY1       ;延时,此为短延时
    CMP AL ,0FFH
    JE JC2
    INC AL            ;AL步加1,直到等于0FFH
    JMP JC1
JC2:
    LOOP JUCHI

    ;产生矩形波
    MOV CX, 05H       ;矩形波周期数
JUXING:
    MOV DX, A0832
    MOV AL, 00H       ;先输出00H的波形
    OUT DX, AL
    CALL DELAY2       ;长延时
    MOV AL, 0FFH      ;再输出0FFH的波形
    OUT DX, AL
    CALL DELAY2       ;长延时
    LOOP JUXING

    ;产生三角波
    MOV CX, 05H       ;三角波周期数
SANJIAO:
SJ1:
    MOV DX, A0832
    OUT DX, AL
    CALL DELAY1       ;短延时
    CMP AX, 0FFH
    JE SJ2           
    INC AL            ;将AL从00H步加0FFH
    JMP SJ1
SJ2:
    MOV DX, A0832
    OUT DX, AL
    CALL DELAY1       ;短延时
    CMP AL, 00H
    JE SJ3
    DEC AL            ;将AL从0FFH步减至00H
    JMP SJ2
SJ3:
    LOOP SANJIAO
    
    ;产生阶梯波
    MOV CX, 0FFFFH     ;产生阶梯波的周期数为0FFFF次
    MOV AX, 0FEH       ;设置波形振幅最大值为0FEH
    MOV BL,05H         ;阶梯波中的阶梯数
    DIV BL             ;用最大振幅除以阶梯数,得到每个台阶的高度
    MOV BL, AL         ;将上述除法的商保存在BL中
    MOV BH, 00H        ;BH置0
JIETI:
    MOV AX,0000H       ;AX初始化0000H
JT1:
    MOV DX, A0832
    OUT DX, AL
    CMP AX, 00FFH      ;判断AX是否达到幅度上限
    JAE JT2            ;达到上限,表示一次阶梯波完整生成,开始新一次生成
    CALL DELAY2        ;长延时
    ADD AX, BX         ;用当前阶梯高度加上每个阶梯的高度得到下一阶梯的高度
    JMP JT1
JT2:    
    LOOP JIETI

DELAY1:                ;短延时
    PUSH CX
    MOV CX, 01FFH
D1: 
    PUSH AX
    POP AX
    LOOP D1
    POP CX
    RET

DELAY2:                ;长延时
    PUSH CX
    MOV CX, 0FFFFH
D2: 
    PUSH AX
    POP AX
    LOOP D2
    POP CX
    RET

CODE ENDS
    END START

扩展实验:

CODE SEGMENT
    ASSUME CS:CODE
START:
    MOV AX,0000H
    MOV DS,AX
    
    ;设置中断向量
    MOV AX,OFFSET MIR6
    MOV SI,0038H ;MIR6中断的矢量地址
    MOV [SI],AX
    INC SI
    INC SI
    MOV AX,CS
    MOV [SI],AX
	
    CLI
    MOV AL,11H    
    OUT 20H, AL    	;命令字ICW1, 11H=00010001B
    MOV AL, 08H
    OUT 21H, AL    	;命令字ICW2, 08H=00001000B 
    MOV AL, 04H
    OUT 21H, AL    	;命令字ICW3, 04H=00000100B
    MOV AL, 03H
    OUT 21H, AL    	;命令字ICW4, 03H=00000011B
    MOV AL, 0AFH   	;OCW1, AF = 10101111B
    OUT 21H, AL 
    STI
    MOV BL,00H
    
A1:
    CMP BL,00H
    JZ  JUCHI
    CMP BL,01H
    JZ JUXING
    CMP BL,02H
    JZ SANJIAO
    JMP JIETI
    
JUCHI:
    MOV DX, 0600H     	;DAC0832接IOY0,0600H为控制端口地址
    MOV AL, 00H       	;AL为数字量
JC1: 
    OUT DX, AL        	;转换为模拟量
    CALL DELAY1      	;短延时
    CMP AL ,0FFH
    JE A1
    INC AL            	;AL步加1,直到等于0FFH
    JMP JC1

JUXING:
    MOV DX, 0600H
    MOV AL, 00H       	;先输出00H的波形
    OUT DX, AL
    CALL DELAY2      	;长延时
    MOV AL, 0FFH      	;再输出0FFH的波形
    OUT DX, AL
    CALL DELAY2       	;长延时
    JMP A1
   
SANJIAO:
    MOV AL, 00H
SJ1:
    MOV DX, 0600H
    OUT DX, AL
    CALL DELAY3       	;短延时
    CMP AL, 0FFH
    JE SJ2           
    INC AL            	;将AL从00H步加0FFH
    JMP SJ1
SJ2:
    MOV DX, 0600H
    OUT DX, AL
    CALL DELAY3      	;短延时
    CMP AL, 00H
    JE A1
    DEC AL            	;将AL从0FFH步减至00H
    JMP SJ2
    
JIETI:
    MOV AX, 0FEH        ;设置波形振幅最大值为0FEH
    MOV CL,05H         	;阶梯波中的阶梯数
    DIV CL             	;用最大振幅除以阶梯数,得到每个台阶的高度
    MOV CL, AL         	;将上述除法的商保存在CL中
    MOV CH, 00H        	;CH置0
JT1:
    MOV AX, 0000H     	;AX初始化0000H
JT2:
    MOV DX, 0600H
    OUT DX, AL
    CMP AX, 0FFH       	;判断AX是否达到幅度上限
    JAE A1              	;达到上限,表示一次阶梯波完整生成
    CALL DELAY4        	;长延时
    ADD AX, CX         	;用当前阶梯高度加上每个阶梯的高度得到下一阶梯的高度
    JMP JT2

DELAY1:
    PUSH AX
    PUSH CX
    MOV AX, 01H   		;调节循环次数来改变周期
D1:                
    MOV CX, 0FFH
DD1: 
    LOOP DD1
    DEC AX
    CMP AX, 00H
    JNZ D1
    POP CX
    POP AX
    RET
 
DELAY2:
    PUSH AX
    PUSH CX
    MOV AX, 7FH   		;调节循环次数来改变周期
D2:                
    MOV CX, 0FFH
DD2: 
    LOOP DD2
    DEC AX
    CMP AX, 00H
    JNZ D2
    POP CX
    POP AX
    RET

DELAY3:
    PUSH AX
    PUSH CX
    MOV AX, 01H   		;调节循环次数来改变周期
D3:                
    MOV CX, 0FFH
DD3: 
    LOOP DD3
    DEC AX
    CMP AX, 00H
    JNZ D3
    POP CX
    POP AX
    RET

DELAY4:
    PUSH AX
    PUSH CX
    MOV AX, 7FH   		;调节循环次数来改变周期
D4:                
    MOV CX, 0FFH
DD4: 
    LOOP DD4
    DEC AX
    CMP AX, 00H
    JNZ D4
    POP CX
    POP AX
    RET

MIR6:
    INC BL
    CMP BL, 03H
    JA M
    IRET
M:
    MOV BL, 00H
    IRET
    
CODE ENDS
    END START

 C语言版本:

我以前提过,只要在TDX-PITE软件中点左上方设置->语言->C,即可切换成C语言模式。

#include "conio.h"
typedef unsigned char u8;
typedef unsigned int u16;

u16 DAC = 0x0600;
u8 value = 0;
u8 time = 0;

void delay(u16 time);
void sawtooth();
void rectangle();
void triangle();
void ladder(u8 num);

void main() {
	while(1) {
		sawtooth();
		rectangle();
		triangle();
		ladder(5);
	}
}

void delay(u16 time) 
{
	int i=0;
	for(;i<time;i++)
	{
		int j=0;
		for(;j<50;j++);
	}
}


void sawtooth() { //value连续变化,输入到DAC中,就是锯齿形状
	
	int Loop = 5;
	for(;Loop>0;Loop--)
	{
		value = 0;
		for(;value <= 0x0FE;value++) {
			outportb(DAC, value); 
			delay(10);
		}
	
	}
}

void rectangle() { //value一高一低两个离散的值输入到DAC,就是矩阵形状
	int Loop = 5;
	for(;Loop>0;Loop--)
	{
	
		value = 0;
		outportb(DAC, value);
		delay(500);
		value = 0x0FF;
		outportb(DAC, value);
		delay(500);
	}
}

void triangle() {//其实就是锯齿,先从低到高再从高到低
	int Loop = 5;
	for(;Loop>0;Loop--)
	{
		value = 0;
		for(;value<=0x0FE;value++){
			outportb(DAC, value);
			delay(10);
		}
		for(;value>0;value--){
			outportb(DAC, value);
			delay(10);
		}
	}
}

void ladder(u8 num) { //num逐渐减小,step跳跃性的逐渐增大,形成阶梯状
	int Loop = 5;
	int num0 = num;
	u8 step = 0x0FF / (num+1);
	for(;Loop>0;Loop--)
	{
		num = num0;
		
		value = 0;
		for(;num>0; num--) {
			outportb(DAC, value);
			delay(100);
			step = 0xFF / (num+1);
			value += step;
		}
	}
}

必须提到一点,在 TDX-PITE 的编译器下,不能在for循环中定义一个变量,即不能写:

for(int i=0;i<10;i++);

        这样写会报错,必须写:

int i = 0;
for(;i<10;i++);

        原因尚不明确,网上相关资料太少,网上有很多关于C51的资料很多,但关于如何用C语言操作8086微机的资料较少,我也是参照了一位学长的博客:

吉林大学微机接口实验代码(五)_吉林大学微机系统实验-CSDN博客

        如果你知道什么关于C语言在微机接口技术中的应用的资料,可以告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第430题扁平化多级双向链表

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* flatten(Node* head) {function<Node*(Node*)> dfs [&](Node* node) {Node* cur node;// 记录链表的最后一个节点Node* last nullptr;while (cur) {Node* next cur->next;// 如果有子节点…

【源码+文档+调试讲解】重庆旅游景点数据分析系统python

摘 要 重庆旅游景点数据分析系统是一个专门为旅游管理部门和景点运营商设计的信息化工具&#xff0c;它通过集成和分析各种数据来优化景点管理和提升游客体验。该系统能够实时收集游客流量、景点信息、满意度反馈等关键信息&#xff0c;帮助管理者洞察游客行为和市场趋势。系统…

C++ const成员函数

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 C const引用常量 使用规则 引用常量对象&#xff1a;可以引用一个常量对象&#xff0…

Unity 的Event的Use()方法

对于Event的Use方法&#xff0c;其在调用后将不会再判断同类型的事件 这种情况下&#xff0c;第二个MosueDown不会进入&#xff0c;因为已经Use 如果把Use注释掉 依旧能进入第二个MosueDown 也就是说当使用了Use方法&#xff0c;相同的事件类型不会进第二遍

【文心智能体】从零到一的优质智能体构建全攻略

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 创作平台&#xff1a;文心智能体平台&#xff1a; 基本配置智能体名称与简介人物设定回复逻辑prompt提示词的编写开场白设定与开场白…

利士策分享,领导者素养自检:五维审视法

利士策分享&#xff0c;领导者素养自检&#xff1a;五维审视法 在人生的广阔舞台上&#xff0c;每个人都蕴藏着成为领导者的潜力&#xff0c;但如何知晓自己是否已具备那份独特的素养&#xff1f; 这需要我们进行一次深刻而诚实的自我审视。 以下五个维度&#xff0c;或许能为你…

K8s Calico替换为Cilium,以及安装Cilium过程(鲁莽版)

迁移CNI插件的3种办法&#xff1a; 1、创建一个新的集群&#xff0c;通过Gitops的方式迁移负载&#xff0c;然而&#xff0c;这可能涉及大量的准备工作和潜在的中断。 2、另一种方法是重新配置/etc/cni/net.d/指向Cilium。但是&#xff0c;现有的pod仍将由旧的…

AI 驱动的数据库 TDSQL-C 实战与电商可视分析

目录 一、背景介绍二、实验介绍三、效果展示四、实操指导4.1 系统设计4.2 环境搭建4.2.1 购买 TDSQL-C Mysql Serverless 实例4.2.2 部署HAI高算力服务器本地python环境搭建 4.3 应用构建4.3.1 搭建项目框架4.3.2 TDSQL-C 数据库&HAI云算力配置4.3.3 应用开发4.3.4 运行程序…

将本地文件上传至虚拟机

1、查看虚拟机ip地址 ip addr 2、xshell连接上虚拟机 连接root连接不上的解决办法更改配置文件vim /etc/ssh/sshd_config 重启&#xff08;sudo service ssh restart&#xff09;并查看是否开启ssh服务&#xff08;sudo ps -e | grep ssh&#xff09; 即可连接成功 3、复制文…

深度学习500问——Chapter15:异构计算,GPU和框架选型(2)

文章目录 15.5 GPU硬件环境配置推荐 15.5.1 GPU主要性能指标 15.5.2 购买建议 15.6 软件环境搭建 15.6.1 操作系统选择 15.6.2 常用基础软件安装 15.5 GPU硬件环境配置推荐 15.5.1 GPU主要性能指标 GPU的性能主要由以下三个参数构成&#xff1a; 计算能力。通常我们关心的是…

Python酷库之旅-第三方库Pandas(127)

目录 一、用法精讲 566、pandas.DataFrame.swapaxes方法 566-1、语法 566-2、参数 566-3、功能 566-4、返回值 566-5、说明 566-6、用法 566-6-1、数据准备 566-6-2、代码示例 566-6-3、结果输出 567、pandas.DataFrame.melt方法 567-1、语法 567-2、参数 567-3…

sheng的学习笔记-AI-蒙特卡罗强化学习

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 强化学习&#xff1a;sheng的学习笔记-AI-强化学习&#xff08;Reinforcement Learning, RL&#xff09;-CSDN博客 K-摇臂赌博机&#xff08;K-armed bandit&#xff09;&#xff1a;https://blog.csdn.net/coldstarry/ar…

【AAOS】CarService -- Android汽车服务

概述 Android Automative OS理解为Android OS + Android Automative Service,而CarService就是提供汽车相关功能的最主要模块。 CarService与Android OS的关系:CarService运行于独立的进程中,其作为原有Android服务的补充,在汽车设备上运行。CarService在整体车载通信中起…

海南聚广众达电子商务咨询有限公司可靠不?

在这个短视频与直播电商风起云涌的时代&#xff0c;海南聚广众达电子商务咨询有限公司以其专业的服务能力和敏锐的市场洞察力&#xff0c;在抖音电商领域脱颖而出&#xff0c;成为了众多商家信赖的合作伙伴。今天&#xff0c;就让我们一同走进海南聚广众达&#xff0c;探索它是…

LLM - 使用 vLLM 部署 Qwen2-VL 多模态大语言模型 (配置 FlashAttention) 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142528967 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 vLLM 用…

VS Code使用Git Bash终端

Git Bash可以运行linux命令&#xff0c;在VS Code的终端界面&#xff0c;找到号旁边的箭头&#xff0c;就能直接切换了 当然&#xff0c;前提是安装了Git Bash&#xff0c;并且在资源管理器里&#xff0c;能鼠标右键出"Git Bash Here"

【个人笔记】线程和线程池的状态以及转换方式

线程和线程池的状态是不一样的&#xff01;&#xff01; 线程有 6 种状态&#xff0c;查看Thread的State枚举类&#xff1a; NEW&#xff1a;创建后没启动的线程就处于这种状态RUNNABLE&#xff1a;正在java虚拟机中执行的线程就处于这种状态BLOCKED&#xff1a;受阻塞并等待…

前端中CSS选择器权重的问题

前言 前端中很重要的CSS&#xff0c;使得网页更加丰满美丽&#xff0c;我们使用CSS时&#xff0c;必不可少的需要使用选择器&#xff0c;选择器也分为简单选择器和复合选择器。而在给选择器中填充内容时&#xff0c;有时候会有一些命令重复&#xff0c;会涉及到优先级的问题&a…

setInterval 实现匀速运动示例【JavaScript】

这段代码利用 setInterval 实现了一个简单的动画&#xff0c;当用户点击按钮时&#xff0c;页面上的方块会向右移动&#xff0c;直到到达一定的边界为止。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><met…