‘壹’ 设单片机晶振频率为12MHZ,编写出其延时100毫秒的程序
最好直接利用定时器延时,定时1毫秒,程序中调用延时函数就行了,Delay(100):
uint count; //定义外部变量
Delay( uint k) // 延时函数
{ count = k;
while(count!=0) ;
}
TIME0() interrupt 1 // 定时器0中断函数
{ TH0 = 0XFC;
TL0 = 0X18;
count--;
}
‘贰’ 单片机编程 设单片机的晶振频率为12MHZ,请编出利用定时/计数器T0,使之工作在方式1,产生50ms定时,
#include"reg52.h"
#define uchar unsigned char
sbit Wave=P1^0;
void Timer0() interrupt 1
{
static uchar t50ms;
TL0=0xb0;
TH0=0x3c;
t50ms=++t50ms%20;
if(!t50ms) Wave=~Wave;
}
void TimerInit()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
EA=1;
ET0=1;
}
void main()
{
TimerInit();
while(1);
}
直接打的,没进行编译,希望不会错。
‘叁’ 设单片机的晶振频率为6MHz,编程用定时器T0,在P1.0产生一个50Hz的方波。
f=50Hz,T=0.02s=20ms,所以每10ms中断一次,P1.0取反若选用工作方式1,则计数初值为EC78H ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt;定时器中断START:
MOV SP,#60H SETB P1.0
LCALL InitTimer0LOOP: NOP
;这可以加另外的代码 LJMP LOOPInitTimer0://定时器初始化
MOV TMOD,#01H
MOV TH0,#0ECH
MOV TL0,#78H
SETB EA
SETB ET0
SETB TR0
RETTimer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#0ECH
MOV TL0,#78H
CPL P1.0;输出方波
POP ACC
POP DPL
POP DPH
RETIEND
‘肆’ 设单片机系统的时钟频率为12MHz利用定时器T0(任选工作方式),编写一个完整的C51程序使P1.6和P1
12Mhz的51单片机,经过12分频后为1MHz,则一个指令周期为1/1Mhz = 1us. 使能定时器 2 使能定时器中断 3 编写中断程序我估计你是觉得1秒的时间,
‘伍’ 单片机设计
看了上边的对话,挺有意思的。有能力就自己做,想让别人做就花点钱,码程序300起步多正常。
‘陆’ 设单片机的fosc=12MHz.使P1.0和P1.1分别输出周期为1ms和10 ms的方波.请用定时器T0的方式2实现
周期为 1ms 和 10ms,最短 半周期为 0.5ms ①,
晶振12MHz,机械周期为T=12/Fosc=1us,定时器工作方式2 为 8位自重装模式,最大计数为255,时间为255×1us=255us=0.255ms,为符合①需求,选择 0.25ms,定时器初值 = 2^8-0.25ms/1us=6;
/***双路方波发生器——火柴天堂作品-20130616***/
/***默认硬件环境:51单片机,12MHz晶振,Wave0、Wave1双路方波输出***/
/***功能描述:P10输出1KHz方波,P11输出100Hz方波***/
#include"reg52.h" //包含52系列头文件
#define uchar unsigned char //定义 无符号字符型
#define uint unsigned int //定义 无符号整型
#define tl0 0x06 //0.25ms at 12MHz Fosc in Model 2
sbit Wave0=P1^0;
sbit Wave1=P1^1;
#define Wave0_HalfCycleAt250us 2 //方波0 半周期时间t=0.25ms×2=0.5ms,周期T=2t=1ms
#define Wave1_HalfCycleAt250us 20 //方波1 半周期时间t=0.25ms×20=5ms,周期T=2t=10ms
void Timer0() interrupt 1 //定时器T0 中断 函数
{
static uchar t0=0,t1=0; //定义静态变量
t0=++t0%Wave0_HalfCycleAt250us; //该句等效于:t0++;t0%=Wave0_HalfCycleAt250us;
if(!t0)Wave0=~Wave0; //方波输出,半周期为0.5ms,周期为1ms
t1=++t1%Wave1_HalfCycleAt250us; //该句等效于:t1++;t1%=Wave1_HalfCycleAt250us;
if(!t1) Wave1=~Wave1; //每隔5ms却换一次电平
}
void TimerInit() //定时器初始化 函数
{
TMOD=0x02; //T0 8位定时器
EA=1; //允许系统中断
ET0=1; //允许T0中断
TH0=tl0;
TL0=tl0;
TR0=1; //T0开始计时
}
void main()
{
TimerInit();
while(1);
}
‘柒’ 设单片机晶振频率12mhz,使用定时器1以工作方式1产生周期为100ms的等宽方
假设用P1.1输出,程序如下:
#include<reg52.h>
//主程序
void main()
{
TMOD=0x10;// 定时器1工作方式一
ET1=1;
EA=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(1);
}
//中断子程序
void Timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
P1^1=~P1^1;
}
‘捌’ 设单片机的晶振为6MHz,要求用T0定时150us,分别计算采用定时方式0,定时方式1时的初始值
void Timer0Init(void)//150微秒@12.000MHz { AUXR |= 0x80;//定时器时钟1T模式 TMOD &= 0xF0;//设置定时器模式 TL0 = 0xF8;//设置定时初值 TH0 = 0xF8;//设置定时...
‘玖’ 设单片机fosc=12MHz,利用T0方式1产生10ms定时,在P1.0引脚上输出周期为2ms的方波。
1、你的思路和程序都有问题
2、如果你想在P1.0引脚上输出周期为2ms的方波,T0定时中断应该定在1ms,然后再中断程序中对P1.0取反,每个1ms对P1.0取反一次,就得出周期为2ms的方波。
3、如果是定时10ms,计数器初值应该是D8F0H,而不是6318H
MOV TH0,#D8H
MOV TL0,#F0H
4、MOV R1,#500指令是非法的,R1是8位寄存器,最大赋值为255。
‘拾’ 设单片机8051的时钟频率为MHZ,试编写50ms的软件延时程序。
12MHZ就是一个指令周期是(即1s/(12*1000*1000HZ))=1/1.2us,所以,可以通过定时器来实现,设置定时器的计数为65536-(50*1200)即可:TL1=0x15; TH1=0xa0;