㈠ 利用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語言程序,使用定時器中斷,當接受的下降沿時,開始定時,定時一分鍾,定時結束後跳出中斷
//假設晶振12MHZ,檢測的是P1.1下降沿
#include "reg51.h"
unsigned int YSJS;
sbit K1 = P1^1;
void main(void)
{
TMOD |= 0X10; //定時器1工作於方式1,16位定時器
TL1 = 0x78; //設置定時初值
TH1 = 0xEC; //定時器1定時時間=5000us
ET1 = 1; //使能定時器1中斷
EA =1; //開總中斷
K1 = 1;
YSJS = 0;
while(1)
{
if(K1==0)TR1 = 1; //啟動定時器1
if(YSJS == 12000) //已定時一分鍾
{
//這里加入你自己定時一分鍾後要做的處理
}
}
}
void TIMER1(void) interrupt 3 //定時器1中斷函數使用默認寄存器組
{
TL1 = 0x78; //設置定時初值
TH1 = 0xEC; //定時器1定時時間=5000us
YSJS++;
if(YSJS==12000) //已定時一分鍾
{
TR1 = 0;關閉定時器1
}
}
㈢ 基於51單片機的999倒計時C語言程序。
/*************************************
要求是能進行9999秒倒計時
用C語言實現
*************************************/
#include<at89X51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num_qian,num_,num_shi,num_ge;//定義千位,百位,十位,個位。
uint time;//要顯示的時間0~9999
uint tcnt;//計時單元
//*****************//
//以下是埠定義
//*****************//
sbit key_qian=P1^0;//按鍵"千加1"
sbit key_ =P1^2;//按鍵"百加1"
sbit key_shi =P1^4;//按鍵"十加1"
sbit key_ge =P1^6;//按鍵"個加1"
sbit laba =P3^1;//喇叭
void delay(unsigned int z)//1毫秒延時子函數
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//*****************//
//以下是七段數碼管驅動程序
//*****************//
/**************************************************
** 功能描述: 中斷接受字元串驅動程序
**佔用引腳資源 P30
**佔用系統資源 串口中斷;中斷向量4
***************************************************/
#define DUAN P0
#define WEI P2
unsigned char code dispcode[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
}; //共陰段碼表
//0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,NULL,-
uchar code dispbitcode[]=
{0xef,0xdf,0xbf,0x7f}; //共陰位碼表
uchar dispbuf[4],dispcount;//開辟四個顯示緩沖區
void ledinit()/***初始化子函數,定時器0刷新顯示內容***/
{
TMOD|=0x01; // 定時器0方式1
TH0=(65536-5000)/256; //定時器16位模式
TL0=(65536-5000)%256; //溢出時間:5ms
TR0=1; //開啟定時器0
ET0=1; //使能定時器0
EA=1; //系統使能
}
void leddisp()//固定顯示某些數字
{
dispbuf[0]=time/1000;
dispbuf[1]=time%1000/100;
dispbuf[2]=time%100/10;
dispbuf[3]=time%10;
}
void keytest()//按鍵檢測程序
{
if(!key_qian)//如果千位按鍵
{
delay(5);//5毫秒延時去抖
if(!key_qian)//如果千位按鍵的確按下了
{
num_qian++;//千位數字加一
while(!key_qian);//等待按鍵松開
}
time+=num_qian*1000;//千位數字加1
}
if(!key_)//如果百位按鍵
{
delay(5);//5毫秒延時去抖
if(!key_)//如果百位按鍵的確按下了
{
num_++;//百位數字加一
while(!key_);//等待按鍵松開
}
time+=num_*100;//百位數字加1
}
if(!key_shi)//如果十位按鍵
{
delay(5);//5毫秒延時去抖
if(!key_shi)//如果十位按鍵的確按下了
{
num_shi++;//千位數字加一
while(!key_shi);//等待按鍵松開
}
time+=num_shi*10;//十位數字加1
}
if(!key_ge)//如果千位按鍵
{
delay(5);//5毫秒延時去抖
if(!key_ge)//如果個位按鍵的確按下了
{
num_qian++;//千位數字加一
while(!key_ge);//等待按鍵松開
}
time+=num_ge;//個位數字加1
}
}
void main()//主程序
{
ledinit();//數碼管中斷初始化,定時器0刷新顯示內容
while(1)//大循環
{
if((!key_qian)||(!key_)||(!key_shi)||(!key_ge))//如果四個按鍵中的任何一個被按下
keytest();//執行按鍵檢測程序
leddisp();//不斷的刷新顯示內容
}
}
//*************************************************
//以下是定時器0刷新數碼管顯示內容驅動程序
//*************************************************
/**************************************************
** 功能描述: 七段數碼管驅動程序
**佔用引腳資源: 數碼管段選,數碼管位選
**佔用系統資源T0
***************************************************/
void t0(void) interrupt 1 //using 0
{
TH0=(65536-5000)/256; //5ms中斷
TL0=(65536-5000)%256; //16位定時器模式
WEI=0xff;//關位選
DUAN=dispcode[dispbuf[dispcount]]; //段選
WEI=dispbitcode[dispcount]; //開位選
dispcount++;
if(dispcount==5)
dispcount=0;
tcnt++; //計數個數加一
if(tcnt==5*200)//滿足1S了
{
tcnt=0;//計數個數歸零
time--;//時間減一
if(time==0)//時間
while(1);
}
if(time<10)//時間小於10
laba=~laba;//聲音報警
}
這是9999秒倒計時的
㈣ 用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++;
}
}
㈤ 求51單片機做能定1微秒的定時器要c語言程序,晶振為12M,P1.7口循環輸出高電平150微秒,低電平150微秒
#include <REG51.H>
sbit pause = P1^7;
void main(void)
{ EA = 1;
TMOD = 0x01;
ET0 = 1;
TR0 = 1;
pause = 0;
while(1);
}
void timeint(void) interrupt 1
{ TH0 = (65536-150)/256;
TL0 = (65536-150)%256;
pause = !pause;
}
上面的程序產生的方波高低脈沖寬度應該在153-155uS之間,這是因為51在響應中斷需要3-5個機器周期時間,將150改成146應該更准確些,但若是做題目,還應該是-150。
㈥ 關於51單片機定時器的程序,P1.5連接蜂鳴器(用C語言寫)
讓蜂鳴器發出兩種不同的聲調很容易,只要給蜂鳴器的控制信號發送不同頻率的脈沖就可以實現了,以下以延時方式來做。#include#defineucharunsignedchar#defineuintunsignedintsbitSPK=P1^0;sbitK1=P1^7;//發聲函數voidAlarm(uchart){uchari,j;for(i=0;i<200;i++){SPK=~SPK;for(j=0;j
㈦ 求 定時器初始化程序 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
}
㈧ 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單片機的定時器程序,c語言編寫,使用內部定時器設計一個三位秒錶 (秒,十秒,分),顯示秒位的變動,
方法:首先:要學會數碼管的顯示程序
然後:按鍵的操作,注意軟體的消抖(具體的是延時,10ms左右)。
假設有k1~停表,k2~復位,k3~繼續運行
先說停表和繼續運行的
停表:如果k1按下,TR0=0;
繼續運行:如果k3按下,TR0=1;
復位:直接用硬體復位單片機或者k2按下,數據清零。
要實現數據的循環:只要定時器計數到最大值時,再把最小值賦給它!
㈩ AT89C51單片機 用定時器1,方式0定時1s的C語言程序怎麼寫
#include
<reg52.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
uchar
flag;
void
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void
timer0()
interrupt
1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
flag++;
if(flag==20)//當定時到1秒時執行花括弧裡面的語句
{}
}
這是利用T0計時的,如果是T1隻要把TMOD=0x01改成TMOD=0x11;把interrupt
1
改成interrupt
3
即可