没有合适的资源?快使用搜索试试~ 我知道了~
单片机汇总.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 67 浏览量
2023-06-06
18:37:34
上传
评论
收藏 246KB DOC 举报
温馨提示
试读
22页
单片机汇总.doc
资源推荐
资源详情
资源评论
第 10 章附加题
补充题 1:参考教材图 11-6 所示的 STC89C52 与 ADC0809
接口电路,设计可以从该 A/D 转换器模拟通道
IN0~IN7 获取数据的接口电路,每隔 1s 读入一
个数据,并将数据存入首址为 30H~37H 的片内数
据存储器中(单片机晶振频率为 6MHz).
接口电路设计:
将 ADC0809 的 8 个通道输入模拟电路,如图附加题 10-1
所示:
为了便于观察将采集结果送数码管显示出来,P1 口设置
显示转换值,P2 口设置显示通道号。
2.软件设计
根据电路图计算知道:P2.7 和 WE 信号经或非门输出片
选 ADC0809 的 STAR 信号和 ALE 信号,0809 的地
址锁存信号 ADDC、ADDB、ADDA 连接单片机地址总
线 A2、A1、A0,则知:P2.7=0,
P2.2P2.1P2.0=000-111,其它地址线选所以 8 个
通道口地址为:7FF8H-7FFFH.
产生 1S 定时,使用定时/计数器 T0,工作方式 1 定时,
每定时 100ms 中断一次,中断 10 次为 1S,去采集
通道模拟信号,相隔 1S 采集下一个通道数据。
定时常数的设定:
TC=216-(100ms/2μs) =15536=3CB0H
每隔 100ms 中断一次,中断 10 次为 1s
即:TH0 应装 3CH,TL0 应装 B0H。
程序清单:
/*LX11-4.C*/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define XBYTE ((unsigned char volatile xdata *) 0)
uchar xdata xadc0809[8] _at_ 0x7ff8;
uchar data dadc0809[8] _at_ 0x30;
uchar n=0;
uchar m=0x0a;
/***********延时函数*****************/
void delay(uint N)
{ uint i;
for(i = 0;i < N;i++); }
/***********显示函数***********/
void desp()
{ uint i;
for(i=0;i<8;i++)< p="">
{ P1=dadc0809[i];
P2=i;
delay(200000000);}}
/**********main()*******/
void main()
{ uint i;
SP=0x60; /*设置堆栈指针*/
TMOD=01;
ET0=1;
EA=1;
TR0=1;
TMOD=01;
xadc0809[0]=0x0; /*启动第 0 通道模数转换*/
while(1)
{ desp();}}
/**********中断服务函数*************/
void exint1(void) interrupt 1 { /*T0 中断服务子程
序*/
if(m==0){m=0x0a;
dadc0809[n]=xadc0809[n]; /*1S 时间到,读取转换值*/
if(n==7)n=0; //8 个通道采集完,重新置 n=0 通道
n++;
xadc0809[n]=0x0; /*再次启动下一个通道模
数转换*/}
else m=m-1;TH0=0xb0;TL0=0x3c;//1S 时间没有到,重新
置计数初值。}
附加题 2:设计 STC89C52 单片机与 DAC0832 的接口电路,
单片机工作在单缓冲方式,DAC0832 用作波形发
生器,编写驱动程序,使其输出梯形波。
1.接口电路设计:
将 P2.7 片选 DAC0832,DAC0832 口地址为 7FFFH,电
路原理图附加题 10-2 所示:
2.C51 程序清单:
#include<absacc.h>
#define DAC0832 XBYTE[0x7fff] //设置
DAC0832 的访问地址
unsigned char num,i,j;
void main() {while (1) { for (num = 0 ; num < 255 ;
num++) //上升段波形
DAC0832=num; //DAC0832 转换
输出
for (i = 0 ; i < 255 ; i++) //水平段波形
DAC0832=num;
for (num = 255 ; num > 0 ; num--) //下降段
波形
DAC0832=num;
for (j = 0 ; j < 255 ; j++) //水平段
波形
DAC0832=num;
}}
3.汇编语言清单
ORG 0000H
CLR A
MOV DPTR,#7FFFH
LOOP: MOV R1,#0FFH
LOOP1: MOVX @DPTR,A
INC A
DJNZ R1,LOOP1
MOV R1,#0FEH
MOV A,#0FEH
LOOP2: MOVX @DPTR,A
DJNZ R1,LOOP2
MOV R1,#0FEH
MOV A,#0FEH
LOOP3: MOVX @DPTR,A
DEC A
DJNZ R1,LOOP3
MOV R1,#0FEH
MOV A,#00H
LOOP4: MOVX @DPTR,A
DJNZ R1,LOOP4
SJMP LOOP
END
第八章补充题:看课本实验四实验内容,用 PROTEUS 画出
双机通信原理图,编写试验程序完成双机通信,
完成实验内容。(采用汇编语言和 C51 两种方法
实现)
答案:
画出原理图,如图附加题 8-1 点点的异步通信。
使用定时器 T1,工作方式 2 定时,晶振频率为 11.0592MHz,
波特率为 9600,选择 SMOD=0,查表 7-2 得:定时
器 TL1=TH1=FDH.
2.汇编语言程序:
/* 程序中增加了在 P2 口显示启动信号 AA、回答信号 BB、
发送数据和校验和 */
ORG0000H
BUFS EQU30H;发送数据缓冲区
BUFR EQU50H;接收数据缓冲区
NUMBEQU10H;发送/接收数据字节个数
SUMSEQU7EH;发送校验和单元
SUMREQU7FH;接收校验和单元
/******** main 函数 *********/
MAIN:LCALL InitArray;调用发送数据单元初始化子程序
LCALLDELAY;延时等待外围器件完成复位
LCALLInitUart ;初始化串口
MAIN2: JBP1.0,SEND;转调用发送子程序
LCALL RECEIVE;调用接收子程序/
HERE: SJMP HERE
SEND: LCALLSEND1
HERE1: SJMP HERE1
/**********发送数据单元初始化************/
InitArray:MOVR2,#NUMB
MOVR0,#BUFS
MOVA,#00H
LOOP: MOV@R0,A
INCR0
INCA
DJNZR2,LOOP
RET
/********** 初始化串口波特率 ************/
InitUart:; /*初始化串口波特率,使用定时器 1*/
;/* Setup the serial port for 9600 baud at
11.0592MHz */
MOV SCON,#50H; //串口工作在方式 1
MOV TMOD,#20H;
MOV PCON,#00H;
MOV TH1,#0FDH
MOV TCON,#40H;
RET
/*******发送子程序**********/
SEND1: MOV P2,#0AAH;
MOV SBUF,#0AAH; /*发送联络信号*/
LOOP1: JNB TI,LOOP1
CLR TI
LOOP2: JNB RI,LOOP2
CLR RI
MOV A,SBUF
CJNE A,#0BBH,LOOP2
MOV P2,#0BBH
LCALL DELAY
SEND2: MOV SUMS,#00H
MOV R0,#BUFS
MOV R2,#NUMB
LOOP3: MOV A,@R0
MOV P2,A
LCALL DELAY
MOV SBUF,A
LOOP4: JNB TI,LOOP4
CLR TI
ADD A,SUMS
MOV SUMS,A
INC R0
DJNZ R2,LOOP3
LOOP5: JB P1.7,LOOP6
ADD A,#01H
MOV SUMS,A
LOOP6: MOV P2,A
LCALL DELAY
MOV SBUF,A
LOOP7: JNB TI,LOOP7
CLR TI
LOOP8: JNB RI,LOOP8
CLR RI
MOV P2,SBUF
LCALL DELAY
MOV A,SBUF
CJNE A,#00H,LOOP9
ENDS: RET
LOOP9: LJMP SEND2
/********接收子程序**********/
RECEIVE:JNB RI,RECEIVE
CLR RI
MOV P2,SBUF
LCALL DELAY
MOV A,SBUF
CJNE A,#0AAH,RECEIVE
MOV P2,#0BBH
LCALL DELAY
MOV SBUF,#0BBH
LOOP11: JNB TI,LOOP11
CLRTI
LOOP12: MOV SUMR,#00H
MOV R1,#BUFR
MOV R3,#NUMB
LOOP13: JNB RI,LOOP13
CLR RI
MOV P2,SBUF
LCALL DELAY
MOV A,SBUF
MOV @R1,A
ADD A,SUMR
MOV SUMR,A
INC R1
DJNZ R3,LOOP13
MOV P2,SUMR
LOOP14: JNB RI,LOOP14
CLR RI
MOV P2,SBUF
LCALL DELAY
MOV A,SBUF
CJNE A,SUMR,LOOP16
MOV P2,#00H
LCALL DELAY
MOV SBUF,#00H
LOOP15: JNB TI,LOOP15
CLR TI
RET
LOOP16: MOV P2,#0FFH
LCALL DELAY
MOV SBUF,#0FFH
LOOP17: JNB TI,LOOP17
CLR TI
LJMP LOOP12
/*************延时子程序***********************/
DELAY: MOV R7,#04H
DL: MOV R6,#0FFH
DL1: MOV R5,#0FFH
DL5: DJNZ R5,DL5
DJNZ R6,DL1
DJNZ R7,DL
RET
END
3.C51 程序:
/* 程序中增加了在 P2 口显示启动信号 AA、回答信号 BB、
发送数据和校验和 */
/* SEND_RECI_LINE=1,设置发送; SEND_RECI_LINE=0,
设置接收*/
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit SEND_RECI_CTRL = P1^0;
sbit CTRL_BUTTON = P1^7; /* CTRL_BUTTON=
0,设置错误校验和 */
uchar idata sbuf [32] _at_ 0x30; /*发送内容*/
uchar idata rbuf [32] _at_ 0x30; /*接收缓冲区*/
void initUart(void); /*初始化串口波特率,
使用定时器 1*/
void send(uchar idata *d); /*发送函数*/
void receive(uchar idata *d); /*接收函数*/
void initArray(); /*数组初始化*/
/***********ms 延时程序******************/
void delay(uint z) /*延时函数*/
{uint i;
for(i=0;i}
/******** main 函数 *********/
void main (void) {
initArray();
delay(10); /* 延时等待外围器件完成复位 */
initUart(); /* 初始化串口 */
if(SEND_RECI_CTRL){ /*发送*/
send(sbuf); }
else{ /*接收*/
receive(rbuf); }
while(1){}}
/********** 数组初始化************/
void initArray()
{uchar i;
for(i=0;i<32;i++)< p="">
{sbuf[i]=i;}}
/********** 初始化串口波特率 ************/
void initUart(void) /*初始化串口波特率,使
用定时器 1*/
{/* Setup the serial port for 9600 baud at 11.0592MHz
*/
SCON = 0x50; /*串口工作在方式 1*/
TMOD = 0x20;
PCON = 0x0;
TH1 = 0xfd;
TCON = 0x40;}
void send(uchar idata *d) /*发送函数*/
{uchar i,pf;
do{
P2=0xaa;
SBUF=0xaa; /*发送联络信号*/
while(TI==0){}TI=0;
while(RI==0){}RI=0;
}while((SBUF^0xbb)!=0); /*乙机未准备好,继
续联络*/
P2=SBUF;delay(50000);
do{
pf=0; /*清校验和*/
for(i=0;i<16;i++){
P2=d[i];delay(50000);
SBUF=d[i]; /*发送一个数据*/
pf+=d[i]; /*求校验和*/
while(TI==0){}TI=0; }
if(!CTRL_BUTTON) pf++; /* CTRL_BUTTON=0,
设置错误校验和 */
P2=pf;delay(50000); /*显示校验和*/
SBUF=pf; /*发送校验和*/
while(TI==0){}TI=0;
while(RI==0){}RI=0;
P2=SBUF;delay(50000);
}while(SBUF!=0); /*回答出错, 则重发*/}
void receive(uchar idata *d) /*接收函数*/
{uchar i,pf;
do{
while(RI==0){}RI=0;
P2=SBUF;delay(50000);
}while((SBUF^0xaa)!=0); /*判甲机请求否*/
P2=0xbb;delay(50000);
SBUF=0xbb; /*发应答信号*/
while(TI==0){}TI=0;
while(1){
pf=0; /*清校验和*/
for(i=0; i<16; i++){
while(RI==0){}RI=0;
d[i]=SBUF; /*接收一个数据*/
P2=d[i]; /*显示接收数据*/
pf+=d[i]; /*求校验和*/}
P2=pf; /*显示校验和*/
while(RI==0){}RI=0;
P2=SBUF;
if((SBUF^pf)==0){ /*比较校验和*/
P2=0;delay(50000);
SBUF=0x00; /*校验和相同发"0x00"*/
while(TI==0){}TI=0;}
else{
P2=0xff;delay(50000);
SBUF=0xff;while(TI==0){}TI=0; /*校验和不同发
"0xff", 重新接收*/}}}
第七章补充题 3:若系统时钟频率为 12MHz,编写软件实现,
用定时/计数器 T2 使 P1.0 输出周期为 1ms 的方
波。
正确答案:
答案:
汇编程序清单,中断方式
T2CON EQU 0C8H ;定义 T2CON 寄存器字节地址为 C8H
T2MOD EQU 0C9H ;定义 T2MOD 寄存器地址为 C9H
TF2 EQU T2CON.7 ;定义 T2 计数溢出标志位
ET2 EQU IE.5 ;定义 T2 中断允许标志位
RCAP2L EQU 0CAH ;定义 RCAP2L 寄存器字节地址为 CAH
RCAP2H EQU 0CBH ;定义 RCAP2H 寄存器字节地址为
CBH
TL2 EQU 0CCH ;定义 TL2 寄存器字节地址为 CCH
TH2 EQU 0CDH ;定义 TH2 寄存器字节地址为 CDH
IPH EQU 0B7H ;定义 IPH 寄存器字节地址为 B7H
ORG 0000H
AJMP MAIN
ORG 002BH ;T2 中断入口地址
LJMP PT2INT
ORG 0100H
MAIN: MOV SP,#60H ;设置堆栈指针
MOV T2MOD,#00H ;设置 T2 向上计数 DCEN=0 且时钟
输出不使能
MOV T2CON,#04H ;设置 T2 自动重装载、定时且启
动 T2 计数
MOV TH2,#0FEH ;装载定时器 2 的定时初值
MOV TL2,#0CH
MOV RCAP2L,#0CH
MOV RCAP2H,# 0FEH
MOV IE,#0A0H ;允许 T2 中断请求,总中断允
许
MOV IP,#20H ;设置 T2 为第 3 级中断优先级
MOV IPH,#20H
SETB P1.0 ;预置 P1.0=1
HERE: SJMP HERE ;踏步等待中断
PT2INT:CLR TF2 ;清计数溢出标志
CPL P1.0 ;P1.0 输出求反
RETI
END
C51 程序清单,查询方式。
#include<REG52.H>
sfr IPH = 0xb7;
sfr T2MOD = 0xc9;
sbit P10=P1^0; //定义位变量 P10
void main(){ //主函数
SP=0x60; //设置堆栈区
T2MOD=0x00; //设置定时器 2 向上计数且时钟输出不
使能
T2CON=0x04; //设置定时器 2 自动重装载、定时且启
动 T2 计数
TL2=0x0c;TH2=0xfe; //定时寄存器装载定时初值
RCAP2H=0xfe;RCAP2L=0x0c;//捕获寄存器装载定时初
值
IE=0xa0; //允许定时器 2 中断请求,总中断允许
IP=0x20;IPH=0x20; //设置定时器 2 为第 3 级中断优
先级
while(1){
if(TF2){TF2=0;P10=!P10; } }
附加题 :将例题 7-2,编写汇编语言程序实现相同功能 。
正确答案:
答案:汇编语言的查询方式
ORG 0000H
MAIN: MOV SCON,#00H
SETB P2.7
MOV A,#07FH
LOOP1: MOV SBUF,A
HERE: JNB TI,HERE
CLR TI
RR A
ACALL DELAY
SJMP LOOP1
/*************延时子程序***********************/
DELAY: MOV R7,#10H
DL5: MOV R5,#80H
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R5,DL
DJNZ R7,DL5
RET
END
汇编语言,中断方式
剩余21页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 83
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功