单片机实验设计
发布网友
发布时间:2023-09-17 15:55
我来回答
共2个回答
热心网友
时间:2024-12-04 21:18
;-------------------------------------
;下列程序,经过编译、仿真,符合要求:
;-------------------------------------
ORG 0000H
SJMP START
ORG 000BH
SJMP T0_INT
;-------------------------------------
START:
MOV TMOD, #01H
MOV TH0, #9EH
MOV TL0, #58H ;50ms@6MHz
SETB TR0
SETB ET0
SETB EA
MOV R2, #10
LOOP:
CLR PSW.5
CLR P1.1 ;输出0,这是一个周期的开始.
JNB PSW.5, $ ;等待500ms
CLR PSW.5
JNB PSW.5, $ ;再等待500ms
CLR PSW.5
MOV C, P3.3 ;如果P3.3为低,
CPL C
MOV P1.1, C ;就输出高,这就是50%占空比.
JNB PSW.5, $ ;继续等待500ms
CLR PSW.5
SETB P1.1 ;如果到这里才输出高,就是25%占空比.
JNB PSW.5, $ ;输出高500ms
SJMP LOOP
;-------------------------------------
T0_INT: ;50ms执行一次.
MOV TH0, #9EH ;重新赋初始值.
MOV TL0, #58H ;50ms@6MHz
DJNZ R2, T0_END ;不到10次,转到退出.
; ;下列指令都是每隔500ms执行一次.
MOV R2, #10 ;重新设置.
SETB PSW.5 ;每隔500ms,设置一次1
T0_END:
RETI
;-------------------------------------
END
;-------------------------------------
编译后的机器语言,仅仅用了74字节
热心网友
时间:2024-12-04 21:18
/*
AT89S52单片机,采用12MHZ晶振
启用time0计时器。以50ms为一中断周期
中断40次为2S
中断30次为1.5S
中断20次为1S
中断10次为0.5S
*/
#include <reg52.h>
#define uchar unsigned char;
sfr wdt=0x9f; //89s52的看门狗地址
sbit pwm=P1^1; //P1.1为输出
sbit sw_in=P3^3; //P3.3为按键输入选择占空比
uchar time2s=40; //2秒计数需进入中断的次数
uchar time1s=20; //1秒计数需进入中断的次数
uchar time0_5s=10; //0.5秒计数需进入中断的次数
uchar timex=0; //中断进入的次数
void main(void)
{
wdt=0; //关开门狗
IE=0x82; //开time0中断
TMOD=0x51; //TIME1为计数器 TIME0为定时器
TH0=(65536-50000)/256; //50MS的计时时间,可利用示波器采集,来更改数据,使时间再精确
TL0=(65536-50000)%256; //50MS的计时时间,可利用示波器采集,来更改数据,使时间再精确
TR0=1; //启动time0计时
while(1); //死循环,输出和判断都在中断中执行
}
//TIME0中断入口程序
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256; //50MS的计时时间,可利用示波器采集,来更改数据,使时间再精确
TL0=(65536-50000)%256; //50MS的计时时间,可利用示波器采集,来更改数据,使时间再精确
TR0=1; //启动time0计时
timex++;
while(sw_in) //当P3.3为高电平时
{
if(timex<=time0_5s) pwm=1; //占空比为25%
else pwm=0;
break;
}
while(!sw_in) //当P3.3为低电平时
{
if(timex<=time1s) pwm=1; //占空比为50%
else pwm=0;
break;
}
if(timex==time2s) timex=0; //当计时到2秒时,回归为0
}
希望能对你有所帮助