当前位置:首页 » 编程语言 » 单片机定时器实验c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

单片机定时器实验c语言

发布时间: 2022-01-13 09:42:57

㈠ 单片机定时器中断实验 程序(汇编语言)不要c语言

;假定晶振频率12M
;假定P1口对应接8个LED,且高电平有效
;MCU:8051系列

CONT_DISP EQU 30H ;定义查表的计数变量,用于8个LED灯的显示状态
CONT_INT EQU 31H ;定义中断间隔的计数变量,用于控制20个中断为1秒的时间间隔

ORG 00H
AJMP GO
ORG 0BH
AJMP INT0_1 ;定时器0,工作方式1

GO:
MOV SP,#60H
MOV P1,#00H ;P1口初始全部关闭
MOV CONT_DISP,#8 ;查表取LED点亮状态,注意此处为了减少变量,查表采用从尾到首的顺序,所以初始值为表末位数
MOV TMOD,#01H ;定时器工作方式1
MOV TH0,#0BH
MOV TL0,#3CH ;计数器初始设定,中断间隔为50ms
SETB TR0
SETB ET0
SETB EA ;计数器开始工作
LOOP: ;以下几句为不断为P1口送值,点亮相应的LED
MOV A,CONT_DISP
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
AJMP LOOP
;----------------以下为中断处理程序---------------
INT0_1:
PUSH ACC ;保护现场
MOV TH0,#0BH
MOV TL0,#3CH ;定时器初值重装
DJNZ CONT_INT,RETINT
MOV CONT_INT,#20 ;20个中断判定
DJNZ CONT_DISP,RETINT ;每20个中断,即1秒,查表数减1
MOV CONT_DISP,#8 ;到1再循环
RETINT:
POP ACC
RETI

TAB:
NOP
DB 00H,0FFH,0AAH,55H,0A0H,50H,0AH,05H ;注意此表为从尾倒查式, 上面一句NOP不可少.

END

㈡ 单片机定时器控制电子门铃c语言程序

图中那示波器的接法有什么用?应该是监测P2.0口和P2.3口吧。
编程如下:
#include <reg52.h> //52系列头文件
#define uchar unsigned char //变量类型宏定义
#define uint unsigned int

sbit Key = P2^0; //按键位声明
sbit Bell = P2^3; //门铃位声明
uint p; //中断次数变量

void main() //主程序
{
TMOD = 0x00; //设置T0工作于方式0
TH0 = (8192-700)/32; //T0计数器装入定时700us初值
TL0 = (8192-700)%32;
IE = 0x82; //开总中断,开T0中断

if(Key==0) //如果键被按下
{
TR0 = 1; //启动T0定时器计时
}
while(Key==0); //等待按键松开
}

void Timer0() interrupt 1 //T0中断服务子程序
{
Bell = ~Bell; //每次中断发生时,门铃状态取反
p++; //中断计次值加1
if(p<=400) //如果中断<=400次,
{
TH0 = (8192-700)/32; //重装700us定时初值
TL0 = (8192-700)%32;
}
if(p>400) //如果中断次数>400
{
TH0 = (8192-1000)/32; //则重装定时 1ms 初值
TL0 = (8192-1000)%32;
if(p==1000) //如果中断次数 =800次
{
P = 0; //中断计数值归0
TR0 = 0; //关闭T0定时器
}
}
}
操作说明:每当按下并保持,响铃一声。松开后再按,即重复上述状态。

㈢ 求单片机定时器简单程序(C语言)详解。不胜感激~

用定时器0中断做流水灯,程序如下:#include<reg52.h>#include<intrins.h> //包含_crol_()循环左移函数
unsigned char temp,count;void init() //初始化函数{ TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;//装初值,高8位 TL0=(65536-50000)%256;//装初值,低8位 EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 temp=0xfe; count=0;//记数值清0}void main(){ init(); while(1){ P1=temp;}}void timer0() interrupt 1 using 1 //定时器0中断函数{ TH0=(65536-50000)/256;//重装初值,同上 TL0=(65536-50000)%256; count++;//计数值加1 if(count==10)//500ms{ count=0;//计数值清0 temp=_crol_(temp,1);循环左移一位}

㈣ 请问单片机C语言定时器程序怎么写

你看过汇编吗?与汇编的格式是一样的。具体就是先开中断允许标志位(IE里面对应的各个位)在设定TMOD工作方式。下一步就是设定初始值了(TH、TL)。设置完这些就可以开定时器了。写中断中段函数是是需要另加interrupt 加上一个常数(比如是定时器0就在后面加上1)。我用89S52芯片编过一个定时器程序你参考一下,希望对你有一点帮助。
//功能:感应外界温度并用数码管显示
//时间:2005年6月20日
//设计人:
#include<reg52.h>
#define uchar unsigned char
sbit ad0809_oe=P1^0; //定义各个位
sbit ad0809_start=P1^1;
sbit ad0809_ale=P1^2;
sbit ls595_rclk=P1^3;
sbit ad0809_eoc=P1^5;
sbit ls595_oe=P1^4;
sbit ls595_ser=P3^0;
sbit ls595_srclr=P3^1;
uchar nn,mm;
uchar code tab[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};
send(uchar); //声明函数
AD(uchar);
void display(uchar);
void init();
//********普通口输入数据*****************
send(uchar shu) //普通口串行输入
{
unsigned char i,k;
k=0x01;
for(i=0;i<8;i++)
{
if(k==(k&shu)) //判断每位上是否为1
ls595_ser=1;
else
ls595_ser=0;
k<<=1; //左移一位
ls595_srclr=0; //输入一个上升沿讲数送入595中
ls595_srclr=1;
}
}
//*****************595显示子程序********************
void display(uchar )
{
uchar ge,shi,flge; //ge拆字后个位的存放处shi拆字后十位的存放处flge ℃的存放处
shi=tab[/10]; //拆字
send(shi); //给595送数
ge=tab[%10];
send(ge);
flge=0xb1;
send(flge);
ls595_rclk=0; //上升沿送出数据
ls595_rclk=1;
}
//*******************初始化程序********************
void init() //初始化AD、定时器
{
ad0809_start=0; //Start管教上升沿将AD内部寄存器清零
ad0809_start=1;
ad0809_ale=1; //ALE高电平选择通道
nn=0;
mm=0;
TMOD=0x01; //定时器初始化
//IE=0x82;
EA=1;
ET0=1;
TCON=0x00;
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;

}
AD(uchar wen)
{
// unsigned char tt=0;
// ad0809_ale=1; //选择通道
ad0809_start=1;
ad0809_start=0; //start下降沿启动转换信号
while(ad0809_eoc==0); //判断转换是否结束
ad0809_oe=1; //转换结束送出转换数据
wen=P2;
return (wen);
}

//**************中断服务程序*********************
void tiam0() interrupt 1 using 1 //中断服务程序
{
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;
nn++;
if(nn==10) //0.5秒M加一
{
mm++;
nn=0;
}
}

//****************主程序***************************
void main()
{
unsigned char bb,aa,cc; //bb=计算后得到温度,aa=AD输出数据
unsigned char wen; //wen存放转换的得到的数据
init();
// wen=17;
ls595_oe=0;
cc=0;
TR0=1;
while(1)
{
aa=AD(wen);
// ad0809_oe=0;
aa=~aa;
bb=aa/4;
if(mm==2)
{
mm=0;
cc=bb;
}
display(cc); //调用显示子程序

}
}

㈤ 关于单片机定时器设计的程序(C语言)

可以找个教程看看,实现这个应该不会太难吧!

㈥ 单片机定时器C语言

//定时器中断初始化
void init()
{
TMOD=0x02;//方式2
TH0=6;
TL0=6;
EA=1;
ET0=1;
TR0=1;
}
//中断函数
void time() interrupt 1
{
t++;
if(t==3686) //1s到了
m++,t=0;//m=2就是两秒了
}
1秒钟t就要加到3686,0.1秒t要加到多少,根据比例就算得出了,其他的也一样。时间算得出,然后在这段时间内做什么就很简单了。

㈦ 关于单片机定时器C语言编程,这段程序看不懂

因为每个CLK后TL0是向上加1的,并且在FFFF变成0000的时候才中断,所以正式的写法应该是(0x10000-SYSCLK)/1000,而对于一个两字节宽的数,0x10000-SYSCLK就等于~SYSCLK,但~SYSCLK更省代码和时间

㈧ 单片机定时器的设计,C语言或汇编语言

可以设计,使用Proteus仿真,

㈨ 单片机定时器中断程序,C语言程序设计

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar keyval;
uchar led1=0xfe,led2=0x55,led3=0x0f;
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
switch(keyval)
{
case 1:
P0=led1;
led1=_crol_(led1,1)
break;
case 2:
P0=led2;
led2=~led2;
break;
case 3:
P0=led3;
led3=~led3;
break;
default:break;
}
}
main()
{
TMOD=0x01;
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
keyval++;
keyval%=4;
}
}
}

㈩ 单片机定时器应用实验

完全一样的题目呀,真幸运,看我的吧(我的是8052的,没关系的):

汇编程序:

S1EQU30H

S2EQU31H

ORG0000H

AJMPMAIN

ORG001BH

AJMPINTT1

ORG0100H

MAIN:ANLTMOD,#0FH

ORLTMOD,#10H

MOVTH1,#3CH

MOVTL1,#0B0H

SETBEA

SETBET1

SETBTR1

MOVDPTR,#TABLE

MOVS1,#00H

MOVS2,#00H

LP:MOVA,S2

MOVCA,@A+DPTR

MOVP1,A

AJMPLP

INTT1:PUSHACC

INCS1

MOVA,S1

CJNEA,#20,NEXTT1

MOVS1,#00H

INCS2

ANLS2,#07H

NEXTT1:POPACC

RETI

TABLE:DB05H,0AH,50H,0A0H,55H,0AAH,0FFH,00H

C语言程序:

#include<reg52.h>

unsignedchars1=0,s2=0;

unsignedcharcodetable[]=

{

0x05,0x0A,0x50,0xA0,0x55,0xAA,0xFF,0x00

};

voidmain()

{

TMOD=(TMOD&0X0F)|0X10;

TH1=0X3C;

TL1=0XB0;

EA=1;

ET1=1;

TR1=1;

while(1)

{

P1=table[s2];

}

}

voidt1(void)interrupt3using0

{

s1++;

if(s1==20)

{

s1=0;

s2++;

s2=s2&0x07;

}

}