51单片机用内部中断 1s一个中断C程序怎么写

51单片机用内部中断 1s一个中断C程序怎么写,第1张

假设你的外部晶振为12M(时钟频率为1M),用复合定时法,即把小值定时叠起来枝册御void t0() interrupt 1{中断服务程序;}主函数姿颤:TMOD=0x01 //设置为定时器0工作方式1for(t=20t>0t--){ TH0=(65536-50000)/256 TL0=(65536-50000)%256//赋初值使一次定时为50ms TR0=1 //开定时器t0 while(!TF0) //等待置位 TR0=0 //关定时 TF0=0 //清标志位}TF0=1 //亲自置位TF0,是打开中断前提IE=0x82 //开允许位EA,ET0若想精确一些,由于中断置位的 *** 作会花3~8个时钟周期;所以可把初值增大3~8,即TH0=(65536-49997)/256TL0=(65536-49997)%256还可用编译软件调试(先设置外部晶振值为12M)测量延时时猛岩间

以下是一个实时时钟的程序,里面包含有1S定时器,你也可以使用延时程序,但是不精确

/*备注:按键一为功能键,按一下调年,按两下调月,按三下调日,按四下调时,按五下调分*/

/* 按六下退出,或者在任何时候按键四退出设定状态。在设定状态键二加一,键三减一*/

/* 键四退出,正常状态键二显示年,键三显示月日,键四显示星期和秒*/

/* 星期根据日期计算得出,其已全部调试通过,为了时间精确,要调一个误差值*/

#include<reg2051.h>

#include<stdio.h>

#include<absacc.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar code led_xs[12]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff,0xfd}

uchar data led_data[4]

volatile uchar data a //定义按键一志标

volatile uchar data month=4 //定义月并赋初值

volatile uchar data date=29 //定义日并赋初值

volatile uchar data week//定义星期并赋初值

volatile uchar data hour //定义时

volatile uchar data min //定义分

volatile uchar data sec=0 //定义秒

volatile uint data zn=0 //定义中间存储变量

volatile uint data year=2007 //定义年并赋初值

sbit md=P3^7 //定义秒点

sbit k1=P1^0 //定义按键一

sbit k2=P1^1 //定义按键二

sbit k3=P1^2 //定义按键三

sbit k4=P1^3 //定义按键四

sbit hs=P1^4 //定义显示片选信号一

sbit hg=P1^5 //定义显示片选信号二

sbit ms=P1^6 //定义显示片选信号三

sbit mg=P1^7 //定义显示片选信号四乱拦轿

bit sans //定义闪烁标志

bit b //定义按键二标志

bit c //定义按键三标志

bit w //定义按键四标志

bit x//定义24小时到标志

bit y//定义日期加一标志

keyscan() //申明键哗肆盘扫描函数

void display() //申明显示函数

void chushihua(void) //申明衡碧初始化函数

void delay_10ms(void) //申明10ms延时函数

dateadd() //申明日期加函数

datesub() //申明日期减函数

weekjs()//星期计算函数

void main(void)

{

weekjs()//计算初值星期几

x=y=0 //日期加初始化

chushihua() //调初始化函数,初始化定时器,中断

do{

keyscan() //键盘扫描

display() //调用显示函数

if((!y)==x)dateadd()//判断是否有24小时,有就调用日期加函数

}

while(1) //先调用显示键盘

}

void chushihua(void) //初始化函数

{

TMOD=0x02 //定时器0以方式2工作,自动重装初值

IE=0x82 //开总中断和TO中断

TH0=0x06 //T0高位置初值

TL0=0x06 //T0低位置初值

TR0=1 //启动TO

}

timer0 () interrupt 1 //T0中断函数

{

if(zn<4000){zn++if(zn==2000)sans=!sans}

else {zn=0sec++sans=!sans

if(sec==60){sec=0min++

if(min==60){min=0hour++

if(hour==24){hour=0x=!x}

}

}

}

}

void display()

{

uchar k

uint d

uchar e

SCON=0x00

P1=0x0f

if((a!=0)&&sans){

led_data[3]=10

led_data[2]=10

led_data[1]=10

led_data[0]=10

}

else {

switch(a){

case 0 :led_data[3]=hour/10

led_data[2]=hour%10

led_data[1]=min/10

led_data[0]=min%10

break

case 1 :led_data[3]=year/1000

d=year%1000

led_data[2]=d/100

e=d%100

led_data[1]=e/10

led_data[0]=e%10

break

case 2 :led_data[3]=month/10

led_data[2]=month%10

led_data[1]=10

led_data[0]=10

break

case 3 :led_data[3]=10

led_data[2]=10

led_data[1]=date/10

if(led_data[1]==0)led_data[1]=10

led_data[0]=date%10

break

case 4 : led_data[3]=hour/10

led_data[2]=hour%10

led_data[1]=10

led_data[0]=10

md=0

break

case 5 : led_data[3]=10

led_data[2]=10

led_data[1]=min/10

led_data[0]=min%10

md=0

break

default: break

}

}

if(b){

led_data[3]=year/1000

d=year%1000

led_data[2]=d/100

e=d%100

led_data[1]=e/10

led_data[0]=e%10

}

else if(c){

led_data[3]=month/10

led_data[2]=month%10

led_data[1]=date/10

if(led_data[1]==0)led_data[1]=10

led_data[0]=date%10

}

else if(w){

led_data[3]=week

led_data[2]=11

led_data[1]=sec/10

led_data[0]=sec%10

}

if((led_data[3]==0)&&(!w))led_data[3]=10

k=led_data[3]

SBUF=led_xs[k]

while(!TI){}

TI=0

hs=1

for(k=0k<255k++){_nop_()_nop_()_nop_()}

hs=0

k=led_data[2]

SBUF=led_xs[k]

while(!TI){}

TI=0

hg=1

for(k=0k<255k++){_nop_()_nop_()_nop_()}

hg=0

k=led_data[1]

SBUF=led_xs[k]

while(!TI){}

TI=0

ms=1

for(k=0k<255k++){_nop_()_nop_()_nop_()}

ms=0

k=led_data[0]

SBUF=led_xs[k]

while(!TI){}

TI=0

mg=1

for(k=0k<255k++){_nop_()_nop_()_nop_()}

mg=0

if(!(a||b||c||w)){

SBUF=0xff

while(!TI){}

TI=0

ms=1

mg=1

md=sans

for(k=0k<255k++){_nop_()_nop_()}

P1=0x0f

md=1

}

}

keyscan()

{

uchar key_value,reread_key

P1=0x0f

key_value=P1&0x0f

if(key_value!=0x0f){

delay_10ms()

reread_key=P1&0x0f

if(key_value==reread_key){

switch(key_value){

case 0x0e : if(!(b||c||w)){a++if(a==6)a=0}

else b=c=w=0

break

case 0x0d : switch(a){

case 0 : b=!bc=w=0break

case 1 : year++break

case 2 : if(month<12)month++else month=1break

case 3 : dateadd()break

case 4 : hour++if(hour==24)hour=0break

case 5 : min++if(min==60)min=0break

default: break

}

break

case 0x0b : switch(a){

case 0 : c=!cb=w=0break

case 1 : year--break

case 2 : month--if(month==0)month=12break

case 3 : datesub()break

case 4 : hour--if(hour==0xff)hour=23break

case 5 : min--if(min==0xff)min=59break

default: break

}

break

case 0x07 : if(a==0){w=!wb=c=0}

else{a=0b=c=w=0}

break

default : break

}

P1=0x0f

reread_key=P1&0x0f

while(key_value==reread_key){

reread_key=P1&0x0f

display()

}

}

}

}

void delay_10ms(void)

{

uchar o,p,q

for(o=5o>0o--)

for(p=4p>0p--)

for(q=248q>0q--)

}

datesub()

{

switch(month){

case 1 : date--if(date==0) date=31break

case 2 : date--if(((year%4==0)&&(date==0))==1)date=29

else if(date==0) date=28break

case 3 : date--if(date==0) date=31break

case 4 : date--if(date==0) date=30break

case 5 : date--if(date==0) date=31break

case 6 : date--if(date==0) date=30break

case 7 : date--if(date==0) date=31break

case 8 : date--if(date==0) date=31break

case 9 : date--if(date==0) date=30break

case 10: date--if(date==0) date=31break

case 11: date--if(date==0) date=30break

case 12: date--if(date==0) date=31break

default: break

}

weekjs()

}

weekjs()

{

uchar c,m,wk,pd,yz

uint y,p

if(month==1){m=13y=year-1}

else if(month==2){m=14y=year-1}

else {y=yearm=month}

c=y/100

yz=y%100

wk=2*c+1

p=26*(m+1)

pd=p/10

pd=pd+yz+(yz/4)+(c/4)+date

if(pd>wk)week=(pd-wk)%7

else if(pd<wk){week=(7-((wk-pd)%7))if(week==7)week=0}

else week=0

}

dateadd()

{

switch(month){

case 1 : date++if(date==32){date=1if(a!=3)month++}break

case 2 : date++if(((year%4==0)&&(date==30))==1){date=1if(a!=3)month++}

else if(date==29){date=1if(a!=3)month++}break

case 3 : date++if(date==32){date=1if(a!=3)month++}break

case 4 : date++if(date==31){date=1if(a!=3)month++}break

case 5 : date++if(date==32){date=1if(a!=3)month++}break

case 6 : date++if(date==31){date=1if(a!=3)month++}break

case 7 : date++if(date==32){date=1if(a!=3)month++}break

case 8 : date++if(date==32){date=1if(a!=3)month++}break

case 9 : date++if(date==31){date=1if(a!=3)month++}break

case 10: date++if(date==32){date=1if(a!=3)month++}break

case 11: date++if(date==31){date=1if(a!=3)month++}break

case 12: date++if(date==32){date=1if(a!=3)month++}break

default: break

}

if(month==13){month=1year++}

y=x

weekjs()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12355639.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存