导航:首页 > 操作系统 > c语言单片机定时程序

c语言单片机定时程序

发布时间:2022-08-30 13:13:35

单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)

单片机流水灯C语言程序的源代码如下:

#include //51系列单片机定义文件

#define uchar unsigned char //定义无符号字符

#define uint unsigned int //定义无符号整数

void delay(uint); //声明延时函数

void main(void)

{

uint i;

uchar temp;

while(1)

{

temp=0x01;

for(i=0;i<8;i++) //8个流水灯逐个闪动

{

P1=~temp;

delay(100); //调用延时函数

temp<<=1;

}

temp=0x80;

for(i=0;i<8;i++) //8个流水灯反向逐个闪动

{

P1=~temp;

delay(100); //调用延时函数

temp>>=1;

}

temp=0xFE;

for(i=0;i<8;i++) //8个流水灯依次全部点亮

{

P1=temp;

delay(100); //调用延时函数

temp<<=1;

}

temp=0x7F;

for(i=0;i<8;i++) //8个流水灯依次反向全部点亮

{

P1=temp;

delay(100); //调用延时函数

temp>>=1;

}

void delay(uint t) //定义延时函数

{

register uint bt;

for(;t;t--)

for(bt=0;bt<255;bt++);

}

(1)c语言单片机定时程序扩展阅读

51单片机流水灯的源代码如下

#include<reg51.h>

#include<intrins.h>

voiddelay(inta)

{

inti;

while(a--)for(i=0;i<110;i++);

}

main()

{

inti;

while(1)

{

P0=0xfe;

for(i=0;i<8;i++)

{

P0=_crol_(P0,1);

delay(500);

}

}

}

❷ 单片机C语言关于定时计数器程序运行时序问题

这个和你设置的定时器的工作模式有关系,你要在定时时间到后,依然想要TH0=0xfc; TL0=0x18。这两个寄存器值存在的话,你就要设置定时器的工作模式为:自动重装初值

❸ 51单片机定时闹铃(c语言)

我来发一个C语言51单片机时钟程序,希望能帮到你 /* 程序功能:带定时闹铃时钟 */ /*---------------------------------------------------------------*/ #include <AT89X51.H> /*包含器件配置文件*/ #define uchar unsigned char #define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/ uchar hour=0,min=0,sec=0; /*时、分、秒单元清零*/ uchar deda=0; /*5mS计数单元清零*/ bit d_05s=0; /*0.5秒标志*/ uchar set=0; /*模式设定标志*/ uchar m=0; uchar flag=0; /*RAM掉电标志*/ void delay(uint k); /*延时?函数*/ void conv(); /*走时单元转换*/ void disp(); /*走时时间显示?函数*/ /*------------------------走时?函数部分 ----------------------*/ /*定时器T0 5mS初始化*/ void init_timer() { TMOD=0x01; TH0=-(4800/256); TL0=-(4800%256); IE=0x82; TR0=1; } /*---------------------------------*/ /*5mS定时中断服务?函数*/ void T0_srv(void) interrupt 1 { TH0=-(4800/256); TL0=-(4800%256); deda++; } /*----------------------------------*/ /*时、分、秒单元及走时单元转换*/ void conv() { if(deda<=100)d_05s=0; else d_05s=1; if(deda>=200){sec++;deda=0;} if(sec==60){min++;sec=0;} if(min==60){hour++;min=0;} if(hour==24){hour=0;} } /*------------------------ 显示?函数部分 ----------------------*/ /*走时时间显示?函数*/ void disp() { P0=DATA_7SEG[hour/10];P2=0xf7;delay(1); P0=DATA_7SEG[hour%10];P2=0xfb;delay(1); if(d_05s==1){if(P2_2==0)P0_7=0;else P0_7=1;} delay(1); P0=DATA_7SEG[min/10];P2=0xfd;delay(1); P0=DATA_7SEG[min%10];P2=0xfe;delay(1); } /*---------------------- 调整时间?函数部分 -------------------*/ /*调整走时时间*/ void set_time() {uchar m; if(P2_5==0)delay(1); if(P2_5==0)hour++; if(hour==24)hour=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } if(P2_6==0)delay(1); if(P2_6==0)min++; if(min==60)min=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } } /*------------------ 按键扫描、延时等?函数部分-------------------*/ /*走时时间程序?函数*/ void time() { conv(); /* 走时单元转换?函数 */ disp(); /* 走时时间显示?函数 */ } /*------------------------------------*/ /*扫描按键?函数*/ void scan_key() { delay(1); if(P2_4==0)set++; if(set>=2)set=0; if(set==1)flag=0x55; F0:if(P2_4==0)goto F0; /*按键未释放,在此等候*/ } /*------------------------------*/ /*延时?函数*/ void delay(uint k) { uint i,j; for(i=0;i<k;i++){ for(j=0;j<121;j++) {;}} } /*----------------------- 主函数 ------------------------- */ /*主函数*/ void main() { init_timer(); /*定时器T0初始化*/ while(1) /*无限循环*/ { if(P2_4==0)scan_key(); /*有按键,调用按键扫描?函数*/ switch(set) /*根据set键值散转*/ { case 0:time(); break; /*走时时间程序*/ case 1:set_time();break; /*走时时间调整*/ default:break; /*其它退出*/ } if(flag!=0x55) /*判断掉电标志*/ { P0=0xc0; P2=0xc0; delay(100); P2=0xff; delay(400); } } }

❹ 单片机c语言编写产生1秒定时的程序,怎么写

如果是51单片机的话其实很简单的,这里假设晶振频率是12M(一般都是的),你可以选用定时器0,工作在工作状态2,因为这个状态下装入初始值几乎不需要时间,所以定时精确,也就是8位预置数状态,将初始值设为6,这样每次定时就是250微秒,在中断程序中定义一个静态变量,每次中断加一,这样当这个变量值为4000时就刚好是1S钟。
关键程序是:
void main()
{
TMOD=OX02;
EA=1;
ET0=1;
TH0=0X06;
TL0=0X06;
while(1);
}
void timer0() interrupt 1
{
static unsigned int times=0;
times++;
if(times==4000)
{
times=0;
//自己的程序
}}

❺ 用c语言编程实现C8051F300单片机1s定时,50Hz的方波输出

#include
sbit wave=P1^0;
void SetupTimer0()
{
TMOD &= 0XF0; //仅保留T1信息
TMOD |= 0X02; //设置T0: 定时功能,方式2,自动重载8位定时器/计数器
TH0 = 256-250;//定时每0.25ms中断一次
TL0 = 256-250;
TR0 = 1; //开启定时器
ET0 = 1; //定时器0中断打开
}
data unsigned char us250;
data unsigned int ms;
bit WAVE; //用以记住当前wave的状态
void Timer0_ISR() interrupt 1 //定时中断服务程序,为按键消抖服务
{
if (++us250<4) return;
us250=0; ++ms;
if (ms<10) return;
//每10ms波形变化一次,20ms完成一个波形,所以波形是50Hz的
ms=0;
WAVE=~WAVE; wave=WAVE; //方波输出
}
void main()
{
us250=ms=0;
wave=WAVE=0;

SetupTimer0();
EA = 1; //全局中断打开
while(1); //在中断函数中实现方波输出
}

❻ 单片机定时器中断程序,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;
}
}
}

❼ 单片机C语言一秒定时程序详解

几M晶振
-----------------------------------
如果是12M晶振的话,那么定时器一个计数频率是12M / 12 = 1M,即一个计数周期是1us。

你给的程序看出,是定时器工作在MODE1。16位计数器。但是你给的程序应该有问题。
一个是TL0 = - 5000 / 256,应该是TL0 = - 5000 % 256;
另一个是if(BUFFER[0]==100),应该是if(BUFFER[0]==200)。

首先你要懂定时计数器原理,51是累加型,MODE1的上限是0xFFFF,即代表可计65535个数。这里程序想计5000个数(5000us),那么TH和TL组成的16位初值应该是60535。要表示这个数,可分两步理解,其一,5000表示成高低字节的两个8位数,高字节为5000 / 256(整数)= 19 = 0x13,低字节为5000 % 256(余数)= 136 = 0x88,结果是5000的16进制表示就是0x1388;其二,65535 - 5000 = 0xFFFF - 0x1388,相当于对0x1388取负。所以就有了TH0 = - 5000 / 256;TL0 = - 5000 % 256;

第二,如上分析,一个中断就是5ms,那么,在中断内部就要判断BUFFER[0]是否到达200,而不是100。如果到了,CIRCLE就向左移一位,然后BUFFER[1]加1,表示增加1秒,同时判断BUFFER[1]是否到60,如果是60就清零。

这小部分代码,还不能说清CIRCLE的具体作用,可能是用来点亮小灯的吧,移一位,小灯也移一次。

不知这样的回答满意不?
www.donald.net.cn

❽ 求单片机定时器简单程序(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语言单片机定时程序相关的资料

热点内容
linuxwireshark使用教程 浏览:656
手机访问阿里服务器地址 浏览:678
程序员可以干什么 浏览:70
绩效考核权重分配算法 浏览:524
android应用logo 浏览:898
光遇安卓服墓土商店什么时候开 浏览:566
月收益翻倍的源码 浏览:638
asop源码放在哪里 浏览:989
电脑服务器密码怎么找 浏览:574
jdp转换pdf 浏览:749
把pdf导入iphone 浏览:508
米哈游租赁的云服务器是哪个 浏览:524
android直接打电话 浏览:1017
ubuntu停止命令 浏览:285
cnc攻丝编程 浏览:869
换个手机号码app怎么注册 浏览:321
怎么下载小猴口算app 浏览:117
轻链app的货怎么样 浏览:626
电脑里的u盘如何加密 浏览:372
我的世界全部版本服务器下载地址 浏览:50