導航:首頁 > 操作系統 > 51單片機定時器c程序

51單片機定時器c程序

發布時間:2022-02-23 22:25:46

❶ 定時器延時問題(51單片機,c語言)

你的這兩個函數void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告訴你,沒有問題。你的這個程序其實就是想顯示0000~5959之間的數,而且這個數是每20秒+1順序遞增的。之所以沒有任何反應,那是你的主程序沒有掛起,也就是在while(1)里沒有沒有大括弧,程序執行一次就結束了,所以你什麼都看不到。應該這樣
while(1)
{//加入的成對大括弧

for(thou=0;thou<=5;thou++) //千位
for(hun=0;hun<=9;hun++) //百位
for(ten=0;ten<=5;ten++) //十位
for(one=0;one<=9;one++) //個位
{
while(num!=20) //循環一秒
{
display(thou,hun,ten,one);//數碼管顯示四個數字
}
num=0;
}
}
這樣你就可以看到程序運行的結果了,但結果是這樣的:四個LED顯示管閃得很嚴重,計劃是一亮一滅的,而且0000~5959這個數字幾乎顯示得不成樣子。主要是delayms(5),這個延遲程序你應該盡量控制在20ms之內(主要是人眼殘輝的時間極限),短了感覺就全亮,長了就一閃一滅。
不過我很看不慣你的這個程序,我給你一個CPU負擔更小,而顯示又非常好的程序供你參考:
#include<AT89X52.H>
#define uint unsigned int
#define uchar unsigned char

sbit LED4=P2^0; //數碼管千分位
sbit LED3=P2^1; //數碼管百分位
sbit LED2=P2^2; //數碼管十分位
sbit LED1=P2^3; //數碼管個分位

uchar ms20,s1;//20毫秒和1s變數定義(聲明)

//定時器T0初始化,10ms秒初值
void InitTimer0(void)
{
TMOD=0x01;
TH0=0x0D8;
TL0=0x0F0;
EA=1;
ET0=1;
TR0=1;
}

void Display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)
{
static uchar k;
P2=P2|0xf0;
switch(k++)
{
case 0:
P0=dat4;
LED4=1;
break;

case 1:
P0=dat3;
LED3=1;
break;

case 2:
P0=dat2;
LED2=1;
break;

case 3:
P0=dat1;
LED1=1;
break;

default:k=0;return;
}
}

void Timer0(void) interrupt 1//1ms中斷
{
TH0=0x0D8;
TL0=0x0F0;
ms20++;
s1++;
}

void Main(void)
{
uchar thou,hun,ten,one;
InitTimer0();
while(1)
{
if(s1>=100)//每1秒鍾one+1
{
s1=0;
if(one++>=9)
{
one=0;
if(ten++>=5)
{
ten=0;
if(hun++>=9)
{
hun=0;
if(thou++>=5) thou=0
}
}
}
}
if(ms20==2)//每20毫秒調用一次顯示函數
{
Display(thou,hun,ten,one);
ms20=0;
}
}
}

❷ 利用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--;
}
}
}

❸ 求高手寫 用51單片機C語言 TMOD=0X01 定時一秒的程序

#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;

void initT0( )
{
TMOD = 0x01; //定時器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中斷一次
EA = 1;
ET0 = 1;
TR0 = 1;
}

void main(void)
{
initT0();
while(1)
if(time==20) //中斷20次,1s
{
time=0;
LED=~LED; //P1.0上的LED1s亮或滅一次
}

}

void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}

❹ 求 定時器初始化程序 51單片機C語言的 THANKU~

寫一個關於定時器0的初始化子函數給你,加上注釋
void timer0() interrupt 1
{
TMOD=0X01;//選擇定時器0
TH0=(65536-50000)/256;//裝入50MS的初值
TL0=(65536-50000)%256;
EA=1;//打開總中斷
ET0=1;//打開定時器0中斷
TR0=1;//開啟定時器0
}

❺ c51單片機c語言編程中定時器和中斷的關系,程序如下,坐等!!!

你的定時器中斷進不了吧,
因為你沒開定時器中斷允許位ET0=1
另:
定時器模式設置好後TMOD=0x01,
打開定時器中斷允許ET0=1,
然後TR0=1啟動定時器就可以了

❻ 單片機定時器c程序

你可以設定定時器T0,每50MS中斷一次,中斷一次計數一次,計數20次,剛好1秒,到1秒就把狀態改變就行了。

❼ 用51單片機做一個定時器,程序用C語言寫,有人會嗎

這么簡單的問題 隨便一本51單片機書上就有 實在不行 參考下面代碼

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code shu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //開啟0-7數碼管
uint aa=0,chu=0;
char num;
sbit d3=P1^3;
sbit d1=P1^1;
sbit d0=P1^0;
sbit d2=P1^2;
sbit s1=P2^4;
sbit s2=P2^5;
delay(uint z)
{
uint x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}

void init ()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void main()
{
d3=0;
d2=0;
P0=0X00;
init();
while(1)
{
//寫你想寫的代碼 num每加一次 表示秒鍾增加一次
}
}
void an() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;
num++;
}
}

❽ 求單片機89C51 的c程序 ---->實現 30秒定時器。

//說多了沒用,直接幫你寫出這段程序,給你慢慢琢磨
#include<REG51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};0-9的段碼(共陰極數碼管)

unsigned char code dispbit[]={0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF};1-6位數碼管的位碼

unsigned char cont;//動態掃描計數器
unsigned char dispbuf[6]={1,2,3,4,5,6};//顯示緩沖區,改變裡面的數值就改變了顯示內容
sbit DULA=P2^6;
sbit WELA=P2^7;

void delay(void)
{
unsigned char i;
for(i=255;i>0;i--);
}

void main(void)
{
DULA=0;
WELA=0;
while(1)
{
P0=0XFF;//清顯示
WELA=1;
WELA=0;

P0=dispcode[dispbuf[cont]];//取段碼到埠
DULA=1;//送到數碼管段引腳
DULA=0;

P0=dispbit[cont];//取位碼到埠
WELA=1;//送到數碼管位引腳
WELA=0;//此時某個數碼管被點亮,

if(++cont>=6)cont=0;//循環6次為一個動態掃描周期
delay();//延時保持顯示
}
}

❾ c編程時,51單片機怎麼用定時器寫一個延時1ms的子函數

好辦
用C51,方式一
void delay(unsigned int T) //T的單位取微秒
{
signed int cnt; //這里用符號數的相反數 就是2^16-n的原碼,也可以定義無符號數自己換成2^16-n

cnt=-(fosec*1.0/12)*T; // fosec的單位MHz

TMOD=0x01;
TH0=(unsigned char)(cnt>>8);
TL0=(unsigned char)cnt;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;//加這句是為了可以循環使用

}

閱讀全文

與51單片機定時器c程序相關的資料

熱點內容
程序員男友消失了 瀏覽:393
程序員搜索框自動提示 瀏覽:22
android44api20 瀏覽:675
adb刷recovery命令 瀏覽:695
廣聯達正版加密鎖可以補辦嗎 瀏覽:943
java程序員一天多少行代碼 瀏覽:946
喪屍危機java 瀏覽:123
華為手機怎麼去除app標記未讀信息 瀏覽:854
java監控文件夾 瀏覽:805
群控伺服器主機怎麼轉變普通電腦 瀏覽:706
手機怎麼調整app大小 瀏覽:453
加密門禁卡揭秘 瀏覽:138
詞釋pdf 瀏覽:992
安卓手機上如何停止自動續費 瀏覽:880
加密編碼摘要 瀏覽:785
疫情命令黨 瀏覽:497
java轉sql 瀏覽:706
android獲取apn 瀏覽:74
phpfpm進程池 瀏覽:795
解壓掏耳朵音頻 瀏覽:676