① 单片机实验“定时/计数器及中断”的一些问题
1.1)主程序各行作用如下:
第一行:设置定时器模式
第二行:设置定时器高位寄存器初值
第三行:设置定时器低位寄存器初值
第四行:T0定时器中断使能
第五行:总中断使能
第六行:打开T0定时器
第七行:死循环(主程序停留在此行)
主程序整体实现的功能:初始化定时器T0
1.2)void Timer0_Int(void)是定时器0中断函数,每行作用如下:
第一行:重新设定定时器高位寄存器初值
第二行:重新设置定时器低位寄存器初值
第三行:如果P1_0 IO口是高电平则改为低电平,如是低电平改为高电平
整体实现的功能:P1_0 IO口高低电平1秒切换一次
妈呀,这么多问题,网上找找,应该有的
② 单片机中断定时实验
涉及到的单片机知识如下:数码管编码(视具体电路连接而定,看是共阴还是共阳)、定时(可以采用定时器或者软件延时)、流水灯直接在pin口上输出高或低就行了。编码自己去写,不然怎么会有进步呢。看你们的要求,就知道你应该是重点高校学生,一定要对自己负责才行。
③ 单片机程序——定时器中断实验;实现LED一灭一闪
首先写法就不对!汇编应该是大写的
④ 单片机实验利用定时器控制八个LED灯每隔1S每四个为一组轮流点亮
03 8只LED左右来回点亮
/* 名称:8只LED左右来回点亮
说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
void main()
{
uchari;
P2=0x01;
while(1)
{
for(i=0;i<7;i++)
{
P2=_crol_(P2,1);//P2的值向左循环移动
DelayMS(150);
}
for(i=0;i<7;i++)
{
P2=_cror_(P2,1);//P2的值向右循环移动
DelayMS(150);
}
}
}
04 花样流水灯
/* 名称:花样流水灯
说明:16只LED分两组按预设的多种花样变换显示
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Pattern_P0[]=
{
0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff
};
uchar code Pattern_P2[]=
{
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff
};
//延时
void DelayMS(uint x)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
void main()
{
uchari;
while(1)
{ //从数组中读取数据送至P0和P2口显示
for(i=0;i<136;i++)
{
P0=Pattern_P0[i];
P2=Pattern_P2[i];
DelayMS(100);
}
}
}
05 LED模拟交通灯
/* 名称:LED模拟交通灯
说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0; //东西向灯
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3; //南北向灯
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量
//延时
void DelayMS(uint x)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//交通灯切换
void Traffic_Light()
{
switch(Operation_Type)
{
case1: //东西向绿灯与南北向红灯亮
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
DelayMS(2000);
Operation_Type=2;
break;
case2: //东西向黄灯闪烁,绿灯关闭
DelayMS(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!=10)return; //闪烁5次
Flash_Count=0;
Operation_Type=3;
break;
case3: //东西向红灯,南北向绿灯亮
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
DelayMS(2000);
Operation_Type=4;
break;
case4: //南北向黄灯闪烁5次
DelayMS(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10)return;
Flash_Count=0;
Operation_Type=1;
}
}
//主程序
void main()
{
while(1)Traffic_Light();
}
06 单只数码管循环显示0~9
/* 名称:单只数码管循环显示0~9
说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//延时
void DelayMS(uint x)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
//主程序
void main()
{
uchari=0;
P0=0x00;
while(1)
{/* for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);} //注:另一方案 */
P0=~DSY_CODE[i];
i=(i+1)%10;
DelayMS(300);
}
}
⑤ PIC单片机定时器初值计算方法及几种周期小结
正确为你解答:
1 可以按定时时间的计算公式, 计算出定时器的时间常数X:
定时时间T=(2的N次方-X)12/单片机晶振频率
2 N为定时器的工作方式:
方式0时,N=13
方式1时,N=16
方式2时,N=8
3 根据定时时间和工作方式,计算出时间常数X
把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定时了。
例如: 工作在方式1,定时时间为1000微秒 晶振频率=12MHZ
则 定时时间T=(2的16次方-X)12/12MHZ=1000 解出 X=64536=FC18H
⑥ 关于MCS-51系列单片机定时器/计数器实验的几个问题
(1)计数和定时有什么区别?怎样选择和设定?
(2)计数或定时初始值怎样计算与装入?
(3)定时器T0和T1各有哪几种工作方式?工作原理如何?
(4)怎样启动定时器?
这些,够写十多页了。
⑦ 单片机的定时器
从来也没有人说过:在串口通信时,89C51依靠检查TF1的置位清零的次数来计算溢出率。
楼主的疑问,在硬件设计的时候,Intel已经解决了,内部肯定有检查的方法。
⑧ 单片机定时器实验.
你的注释有的有错误,现重新更正如下
ORG 0000H
AJMP START
ORG 001BH ;外中断1入口地址
AJMP INT_T1
ORG 0100H
START:
MOV SP,#60H;设置堆栈深度
MOV TMOD,#10H ;置T1为方式1
MOV TL1,#00H ;延时50mS的时间常数
MOV TH1,#4BH
MOV R0,#00H;表格计数器
MOV R1,#20;1s计数器即20*50ms=1000ms=1s,得到所需要定时时间1s
SETB TR1;打开定时器1
SETB ET1:允许定时器1中断
SETB EA ;开总中断
SJMP $:等待
INT_T1: ;T1中断服务子程序
PUSH ACC ;保护现场
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR1 ;关定时器
MOV TL1,#00H ;重新载入计数初值
MOV TH1,#4BH
SETB TR1 ;再次打开定时器
DJNZ R1,EXIT;判断是否到达20个50ms,如果没有则继续循环
MOV R1,#20 ;重新载入1s计数值
MOV DPTR,#DATA ;置常数表首地址 MOV A,R0 ;置常数表偏移量
MOVC A,@A+DPTR ;读常数表
MOV P1,A ;这里中的A决定是什么花色,也就是显示什么
INC R0;指向下一个数
ANL 00,#07H;
EXIT:
POP DPH ;恢复现场
POP DPL
POP PSW
POP ACC
RETI
LED显示常数表
DATA: DB 0FAH,0F5H,0AFH,05FH,0AAH,55H,00H,0FFH
END
总的来说显示什么样的花色是由你提前计算好,然后将对应的值放入表格中。比方说,你的led是共阴极接法,那么你要L1和L3亮就要给p1口送00000110B,这个值放到表格中等你用的时候从表格中取出来就行了
⑨ 51单片机实验(关于定时器计数器)
6mz的晶振 可算出一个时钟周期为2微秒,200毫秒去除一下2微秒就是10000,然后吧10000取16进制为 27A0 ,用 FFFF减27A0再加1 得 C860,用定时方式一,TL0 ,#60H
TH0, #C8H
⑩ 单片机定时计数器实验
1. 你搞错了吧,周期2秒? 重复周期? 时间长了点吧。
2. 单片机也分种类,型号,还有1T单片机,12T单片机等等等等。
3. 搞不懂,不然有空给你写个代码了