『壹』 求單片機定時器簡單程序(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);循環左移一位}
『貳』 定時器中斷實驗51單片機,P2口外接8個發光二極體,4個共陽極接法,4個共陰極接法,如圖所示.要求分別用C語言
雖然看不到圖但是這種問題實在不難,給你程序等於害你,給你點思路自己寫才能幫助你:首先設定好定時器1,如果晶振是12MHz,TH1=(65536-50000)/256,TL1=(65536-50000)%6,TMOD=0x10,主要就這三步,配置好了定時器1。然後給P2一個初值0xf0,然後進入主程序死循環等待中斷,中斷函數重裝初值後,i ,當i增到20說明1s時間到,i=0,P2=~P2。具體思路給你了。
希望我的回答能幫助到你。
『叄』 單片機C語言編程如何實現定時器中斷1s編程
以下是一個實時時鍾的程序,裡麵包含有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=0;sec++;sans=!sans;
if(sec==60){sec=0;min++;
if(min==60){min=0;hour++;
if(hour==24){hour=0;x=!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=0;k<255;k++){_nop_();_nop_();_nop_();}
hs=0;
k=led_data[2];
SBUF=led_xs[k];
while(!TI){}
TI=0;
hg=1;
for(k=0;k<255;k++){_nop_();_nop_();_nop_();}
hg=0;
k=led_data[1];
SBUF=led_xs[k];
while(!TI){}
TI=0;
ms=1;
for(k=0;k<255;k++){_nop_();_nop_();_nop_();}
ms=0;
k=led_data[0];
SBUF=led_xs[k];
while(!TI){}
TI=0;
mg=1;
for(k=0;k<255;k++){_nop_();_nop_();_nop_();}
mg=0;
if(!(a||b||c||w)){
SBUF=0xff;
while(!TI){}
TI=0;
ms=1;
mg=1;
md=sans;
for(k=0;k<255;k++){_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=!b;c=w=0;break;
case 1 : year++;break;
case 2 : if(month<12)month++;else month=1;break;
case 3 : dateadd();break;
case 4 : hour++;if(hour==24)hour=0;break;
case 5 : min++;if(min==60)min=0;break;
default: break;
}
break;
case 0x0b : switch(a){
case 0 : c=!c;b=w=0;break;
case 1 : year--;break;
case 2 : month--;if(month==0)month=12;break;
case 3 : datesub();break;
case 4 : hour--;if(hour==0xff)hour=23;break;
case 5 : min--;if(min==0xff)min=59;break;
default: break;
}
break;
case 0x07 : if(a==0){w=!w;b=c=0;}
else{a=0;b=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=5;o>0;o--)
for(p=4;p>0;p--)
for(q=248;q>0;q--);
}
datesub()
{
switch(month){
case 1 : date--;if(date==0) date=31;break;
case 2 : date--;if(((year%4==0)&&(date==0))==1)date=29;
else if(date==0) date=28;break;
case 3 : date--;if(date==0) date=31;break;
case 4 : date--;if(date==0) date=30;break;
case 5 : date--;if(date==0) date=31;break;
case 6 : date--;if(date==0) date=30;break;
case 7 : date--;if(date==0) date=31;break;
case 8 : date--;if(date==0) date=31;break;
case 9 : date--;if(date==0) date=30;break;
case 10: date--;if(date==0) date=31;break;
case 11: date--;if(date==0) date=30;break;
case 12: date--;if(date==0) date=31;break;
default: break;
}
weekjs();
}
weekjs()
{
uchar c,m,wk,pd,yz;
uint y,p;
if(month==1){m=13;y=year-1;}
else if(month==2){m=14;y=year-1;}
else {y=year;m=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=1;if(a!=3)month++;}break;
case 2 : date++;if(((year%4==0)&&(date==30))==1){date=1;if(a!=3)month++;}
else if(date==29){date=1;if(a!=3)month++;}break;
case 3 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 4 : date++;if(date==31){date=1;if(a!=3)month++;}break;
case 5 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 6 : date++;if(date==31){date=1;if(a!=3)month++;}break;
case 7 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 8 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 9 : date++;if(date==31){date=1;if(a!=3)month++;}break;
case 10: date++;if(date==32){date=1;if(a!=3)month++;}break;
case 11: date++;if(date==31){date=1;if(a!=3)month++;}break;
case 12: date++;if(date==32){date=1;if(a!=3)month++;}break;
default: break;
}
if(month==13){month=1;year++;}
y=x;
weekjs();
}
『肆』 51單片機定時中斷C語言的寫法步驟,可追加分數
程序說明:51單片機定時器0工作於方式一,定時50ms中斷一次
晶振為12M
#include
void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
ET0
=
1;
//開定時器0中斷
EA
=
1;
//開總中斷
TR0
=
1;
//啟動定時器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
}
/***************************************************************************************************************/
上面是比較好理解的。如果實在要求簡潔的話,看下面的,跟上面功能一樣
#include
void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值
IE
=
0x82;//開總中斷並開定時器0中斷
TR0
=
1;
//啟動定時器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值}
『伍』 利用51單片機定時器產生PWM波的c語言程序,要求如下
#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
cnt++;
if(pwm>0)
{
if(cnt>100)cnt=0;
if(cnt<=pwm)pluse=1;
else pluse=0;
}
else pluse=0;
}
main()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
pwm++;
if(pwm>100)pwm=100;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}
『陸』 請問單片機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語言定時器如何調用
單片機中通過中斷的方式來調用定時器。
具體的調用方式可以參考通過如下程序:
程序功能:利用定時器進行定時,實現每秒中led閃爍一次
#include<reg52.h>
sbitled=P0^0;
unsignedintnum;
voidmain(void)
{
TMOD=0x00;//工作方式0
TH0=(8192-5000)/32;//12M晶振下定時5ms
TL0=(8192-5000)%32;
EA=1; //開總中斷
ET0=1; //開定時器中斷
TR0=1; //啟動定時器
while(1)
{
if(num==200) //定時1秒鍾到
{
num=0; //計數器清零
led=~led; //led燈取反,實現1秒閃爍一次
}
}
}
voidtimer()interrupt1//定時器1工作與方式0
{
TH0=(8192-5000)/32;//重裝初值
TL0=(8192-5000)%32;
num++; //計數器加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;
}
}
}
『玖』 單片機怎麼設計一個0-9的一位數秒錶,用定時器實現 c語言程序及其注釋
#include
#define
uchar
unsigned
char
uchar
distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar
times,num;
void
t0isr()
interrupt
1
{
TH0=(65536-50000)/256;
//重置初值
TL0=(65536-50000)%256;
times++;
if(times>=20)
//1秒是否到
{
times=0;
num--;
//1秒到後,計數值減1
P0=distab[num];
//顯示
if(num==0)num=9;
//到0後再賦值為9
}
}
main()
{
TMOD=0x01;
//定時器0為16為定時
TH0=(65536-50000)/256;
//50毫米中斷一次
TL0=(65536-50000)%256;
ET0=1;
EA=1;
num=9;
times=0;
TR0=1;
while(1);
}
『拾』 請大家給我寫一個用單片機c語言變的程序,要求:用定時器實現燈的閃爍
我看樓上寫的程序不怎麼好,而且不容易懂,不是單片機c語言吧,於是自作主張的自己又寫了一個,是51單片機的,12MHz晶振。我猜你現在用的是51吧?
#include
#define
uchar
unsigned
char
sbit
Led=P1^0;
uchar
counter;
void
timer1()
interrupt
3
using
1
{
TH1=-50000/256;
TL1=-50000%256;
counter=counter+1;
}
void
main()
{
counter=0;
TMOD=0x50;
TH1=-50000/256;
TL1=-50000%256;
//定時50ms,16位定時器
EA=1;
TR1=1;
while(1)
{
if(counter==20)
{
counter=0;
Led=~Led;
//led燈閃爍
}
}
}
樓主覺得可以的話,一定要給滿意噢,若有什麼不滿意的地方,請繼續追問。對啊,中斷裡面的程序一定要短,中斷嘛,本來就是要告訴單片機該做什麼的了。