P148作业
5-5请分别定义下列变量:
(1) 片内RAM中无符号字符型变量x;
unsigned char data x;
(2) 片内RAM中位寻址区无符号字符型变量y,将y.0-y.2再分别定义为位变量key_in、key_up、key_down;
unsigned char bdata y;
sbit key_in=y^0;
sbit key_up=y^1;
sbit key_down=y^2;
(3) 片外RAM中整型变量x,并指定变量x的绝对地址为4000H;
xdata int x _at_ 0x4000;
或 #define x XWORD[[0x2000]
(4)特殊功能寄存器变量PCON;
sfr PCON=0x87;
5-7用C51语言编程实现,片内扩展RAM的000EH单元和000FH单元的内容交换。
#include
void main()
{
unsigned char *pp1,*pp2,temp;
AUXR&=0xfd;
pp1=0x000e;
pp2=0x000f;
temp=*pp1;
*pp1=*pp2;
*pp2=temp;
}
5-9 试用C51语言编写程序实现将片内RAM 21H单元存放的两位BCD码数转换为十六进制数存入30H单元。
data unsigned char y1 _at_ 0x21;
data unsigned char y2 _at_ 0x30;
void main()
{ unsigned char temp;
temp=y1;
y1=(y1&0xf0)>>4;
y2=y1*10+(temp&0x0f);
}
P208作业
7-7在STC12C5A60S2单片机中,假设系统的时钟频率为12MHz,利用定时/计数器T0,分别用汇编语言和C51编程实现在P1.0引脚输出周期为2s的方波。
分析:仿例
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
7-3,要产生周期2s的方波,需定时1s,一个定时器完成不了,可定时50ms,T0工作在方式1,然后利用R7对50ms定时中断计数20次来实现。选择12T模式,T0x12=0,f=12MHz,则需计数50000,初值为65536-50000=15536=3CB0H
(1)汇编程序:
ORG 0000H
LJMP MAIN
ORG 000BH ;T0的中断向量入口地址
LJMP T0_INT
ORG 0100H
MAIN:MOV SP,#0BFH ;初始化堆栈指针
MOV TMOD,# 01H ;T0工作在方式1
MOV TL0,#0B0H ;给T0写入初值
MOV TH0,#03CH
MOV R7,#20 ;利用寄存器R7计数20次
SETB EA ;开放总中断
SETB ET0 ;T1溢出中断允许
SETB TR0 ;启动T1开始工作
SJMP $
T0_INT:MOV TL0,#0B0H ;重新赋初值
MOV TH0,#03CH
DJNZ R7,NEXT
CPL P1.0
MOV R7,#20 ;重新赋给R7值50
NEXT:RETI
END
(1) C51程序:
#include/
sbit P1_0=P1^0;
unsigned char i=0;
void main( )
{
TMOD=0x01;//T0工作在方式1
TL0=0xB0;//给T0装入初值
TH0=0x3C;
EA=1;//开放总中断
ET0=1;//T0溢出中断允许
TR0=1;//启动T0开始工作
while(1);
}
void T0_INT( ) interrupt 1//T0中断服务程序
{
TH0=0x3C;
TL0=0xB0;//重新置入初值
i++;
if(i= =20)
{
P1_0=!P1_0;
i=0;
}
}
7-8由P1口驱动8个指示灯,利用定时/计数器T1的定时功能分别用汇编语言和C51编程实现8个指示灯依次循环点亮(输出高电平),点亮间隔为1s,反复循环。
分析:仿照上题,T1需定时50ms,R7计数20次,达到定时1s的目的,每隔1s,循环一次,实现轮流点亮。
(1)汇编程序
ORG 0000H
LJMP MAIN
ORG 001BH ;T1的中断向量入口地址
LJMP T1_INT
ORG 0100H
MAIN:MOV SP,#0BFH ;初始化堆栈指针
MOV TMOD,# 10H ;T1工作在方式1
MOV TL1,#0B0H ;给T1写入初值
MOV TH1,#03CH
MOV R7,#20 ;利用寄存器R7计数20次
MOV A,#01H
SETB EA ;开放总中断
SETB ET1 ;T1溢出中断允许
SETB TR1 ;启动T1开始工作
SJMP $
T1_INT:MOV TL1,#0B0H ;重新赋初值
MOV TH1,#03CH
DJNZ R7,NEXT ; R7减1不为0,
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
中断次数未
;到20次,跳转到NEXT处返回
MOV P1,A;
RL A ;为下一次做准备
MOV R7,#20 ;重新赋给R7值50
NEXT:RETI
END
(2) C51程序:
#include
unsigned char i=0;
unsigned char j;
void main( )
{
TMOD=0x10;//T1工作在方式1
TL1=0xB0;//给T1装入初值
TH1=0x3C;
j=0x01;
EA=1;//开放总中断
ET1=1;//T1溢出中断允许
TR1=1;//启动T1开始工作
while(1);
}
void T1_INT( ) interrupt 3//T1中断服务程序
{
TH1=0x3C;
TL1=0xB0;//重新置入初值
i++;
if(i= =20)
{
P1=j;//已定时中断20次
i=0;
j=_crol_(j,1);
}
}
7-12 假设系统时钟频率为12MHz,利用PCA模块的功能,分别用汇编语言和C51编程实现在P1.3引脚上间断重复输出频率为450Hz的方波,持续和停止时间均为4s。
分析:将PCA模块的工作方式寄存器CCAPM0寄存器写为4DH,即PCA0设为时钟输出方式,从而可以在P1.3引脚自动翻转,输出方波,并允许PCA中断。要求方波频率为450hz,即周期为1/450,定时时间应设定为1/900s,选择计数器时钟来源为系统时钟频率的12分频,即工作方式寄存器CMOD设为00H,需要计数(1/900)/(12/12000000)=10000/9≈1111=0457H个时钟脉冲,可将CL、CH初始值设为零,CCAP0H设为04H,CCAP0L设为57H,在每次PCA中断里:将计数值加到比较匹配寄存器里CCAP0H+=4,CCAP0L+=57H
4秒启动一次PCA计数(CR=1),4秒停止(CR=0);
4秒定时器由T1产生,工作在方式1定时50毫秒,计数时钟fosc/12
初值N,则(65536-N)*1=50000N=15536=3cb0H
(1) 汇编程序:
CCON EQU 0D8H;PCA控制寄存器
CMOD EQU 0D9H;PCA模式寄存器
CL EQU 0E9H;PCA定时器的低8位
CH EQU 0F9H;PCA定时器的高8位
CCAPM0 EQU 0DAH; PCA模块0的模式寄存器
CCAP0L EQU 0EAH;PCA模块0的捕获寄存器的低8位
CCAP0H EQU 0FAH;PCA模块0的捕获寄存器的高8位
AUXR EQU 8EH
CR BIT CCON.6;PCA定时控制位
CF BIT CCON.7;PCA溢出标志位
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP T1_INT
ORG 003BH
LJMP PCA_INT
ORG 0100H
MAIN:
CLR A
MOV CCON,A;//(P197)
MOV CL,A;
MOV CH,A;
MOV SP,#0BFH;初始化堆栈指针
MOV TMOD,#10H;T1工作在方式1
MOV TL1,#B0H;给T1写入初值
MOV TH1,#3CH;
ANL AUXR,#101111111H;//T1X12=0
MOV CCAPM0,#4DH;// 允许中断,输出方波
MOV CCAP0L,#57H;
MOV CCAP0H,#04H;
MOV CMOD,#0H;//FOSC/12时钟计数
MOV R7,#80;利用寄存器R7计数80次
SETB EA;
SETB ET1;
SETB TR1;
SETB CR
SJMP $
T1_INT: MOV TL1,#B0H;给T1写入初值
MOV TH1,#3CH;
DJNZ R7,NEXT;