❶ 單片機流水燈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); //調用顯示子程序
}
}