1、STC12C5A60S2单片机的P1端口接有8只LED灯,分析以下程序输出的结果。(2)如何修改中断服务程序,使P1口的LED灯以0.5秒为周期闪烁(亮0.25秒,灭0.25秒)?
void main(void)
{
p1=0xff;
TMOD =0x01;//赋值给寄存器TMOD,令定时器具有16位,仅由TRx控制定时器运行
设置为定时器工作模式,
TCON寄存器控制标志位,计数计数时间等
TH0=(65536-10000)/256;//高八位数据
TL0=(65536-10000)%256;//低八位数据
EA=1;// allow all source interupt
ET0=1;//allow interrput 0;
TR0=1;//
while (1)
{
;
/* code */
}
}
void timer0(void) interrupt 1 using 1
{
static uint i;//注意要用int类型不能用char类型;
TH0=(65536-1000)/256;//定时公式,不同晶振要改变定时时间
TL0=(65536-1000)%256;//定时1ms
i++;
if(i==(250)
{
i=0;
p1=~p1;//over flip,输出0.5s为周期的方波
}
}
2、设计一个实验,使用单片机定时器T1的工作方式1,通过定时中断模式,从P2.0引脚上输出占空比为1:3的方波,使实验箱上的LED灯L1接亮0.5s、灭1.5s的规律闪烁。
static uint i=0;//initial to zero 注意要用int类型不能用char类型;
void main(void)
{
p1=0xff;//一开始就让端口输出高电平,使得led灭掉
p2=0xff;//trun off all led;
TMOD |=0x10;//赋值给寄存器TMOD,令定时器具有16位,仅由TRx控制定时器运行,方式1,定时器T1
//设置为定时器工作模式,
//TCON寄存器控制标志位,计数计数时间等
TH1=(65536-10000)/256;//高八位数据
TL1=(65536-10000)%256;//低八位数据
EA=1;// allow all source interupt
ET1=1;//allow interrput 1;
TR1=1;//
while (1)
{
;
}
}
void timer0(void) interrupt 3 using 1
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;//定时10ms
i++;
if(i==150)//1.5s,因为一开始就是灭的,所以计数到1.5s就翻转
{
p2=~p2;//over flip
}
else if(i==200)//
{
i=0;
p2=~p2;
}
}
3、单片机引脚P3.5(T1)上外接有按键K1作为计数信号输入,引脚P1.0上外接有一个LED灯。请编写C51程序,使用定时器T0的工作方式1,通过计数中断模式实现如下功能:按键K每按下4次,使LED灯闪烁一次,且当LED的闪烁次数达到8次后使蜂鸣器鸣响报警。
void delay(uchar i)
{
uchar m,n;
for(m=0;m<i;m++)
for(n=0;n<i;n++);
}
static uchar i=0;
void main(void)
{
p1=0xff;
p2=0xff;
TMOD =0x05;//赋值给寄存器TMOD,令定时器具有16位,仅由TRx控制定时器运行
//设置为定时器工作模式,
//TCON寄存器控制标志位,计数计数时间等
TH0=0xff;//高八位数据
TL0=0xfc;//低八位数据
EA=1;// allow all source interupt
ET0=1;//allow interrput 0;
TR0=1;//
while (1)
{
;
/* code */
}
}
void timer0(void) interrupt 1 using 1
{
TR0=0;
TH0=0xff;//高八位数据
TL0=0xfc;//低八位数据
p1=0;
delay(500);
p1=0xff;
i=i+1;
if(i==8)
{
for(i=0;i<255;i++)
{
p2=~p2;
delay(10);
}
for(i=0;i<255;i++)
{
p2=~p2;
delay(10);
}
i=0;
}
TR1=1;
}
4、(选做)设计一个实验,用STC12C5A60S2的定时器T1中断控制两个LED(L1和L2)分别以200ms和800ms为周期闪烁。
void main(void)
{
p1=0xff;
p2=0xff;//trun off all led;
TMOD |=0x10;//赋值给寄存器TMOD,令定时器具有16位,仅由TRx控制定时器运行,方式1,定时器T1
//设置为定时器工作模式,
//TCON寄存器控制标志位,计数计数时间等
TH1=(65536-10000)/256;//高八位数据
TL1=(65536-10000)%256;//低八位数据
EA=1;// allow all source interupt
ET1=1;//allow interrput 1;
TR1=1;//
while (1)
{
;
}
}
void timer0(void) interrupt 3 using 1
{
static uint i;//initial to zero 注意要用int类型不能用char类型;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;//定时10ms
i++;
if(i==400)//周期八百ms
{
i=0;
led2=~led2;
led1=~led1;
}
else if((i%100)==0)//周期200ms
{
led1=~led1;
}
}
5.此外还有这些定义:
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define p0 P0
#define p1 P1
#define p2 P2
#define p3 P3
sbit k1=p3^5;//use p3.5 as key1
sbit led1=p1^1;
sbit led2=P1^2;