51单片机c语言程序集锦.docx
《51单片机c语言程序集锦.docx》由会员分享,可在线阅读,更多相关《51单片机c语言程序集锦.docx(15页珍藏版)》请在冰豆网上搜索。
51单片机c语言程序集锦
#include
#include
//每65536时钟循环设置断点
staticunsignedlongoverflow_count=0;
voidtimer0_ISR(void)interrupt1
{
overflow_count++;//溢出记数
}
//MAINC
voidmain(void)
{
//设置16位模式,溢出中断
TMOD=(TMOD&0xF0)|0x01;//T/C0模式
ET0=1;//开T0中断
TR0=1;//开T0计数
EA=1;//开中断
while
(1)//循环
{
}
}
#include
unsignedcharex0_isr_counter=0;
voidex0_isr(void)interrupt0
{
ex0_isr_counter++;//Incrementthecount
}
voidmain(void)
{
ConfigureINT0(externalinterrupt0)togenerate
aninterruptonthefalling-edgeof/INT0(P3.2).
EnabletheEX0interruptandthenenablethe
globalinterruptflag.
IT0=1;//Configureinterrupt0forfallingedgeon/INT0(P3.2)
EX0=1;//EnableEX0Interrupt
EA=1;//EnableGlobalInterruptFlag
Waitforever.
while
(1)
{
}
}
Io口输出
//点亮P1口的一个灯
#include
/*------------------------------------------------
MAINCFunction
------------------------------------------------*/
voidmain(void)
{
P1=0xFF;//灯全不灭掉
while
(1)//主循环
{
P1=0xfe;//P1口的最低位点亮,可以更改数值是其他的灯点亮
}
}
//按下P3口的按键,P1显示相应的位置,IO读写操作程序
#include
sbitKEY=P3^0;//定义按键的接口
sbitLED=P1^0;//定义灯的接口
/*------------------------------------------------
MAINCFunction
------------------------------------------------*/
voidmain(void)
{
P1=0xFF;//所有的灯灭
while
(1)
{
LED=KEY;//灯的状态由按键的状态决定
}
}
//按下P3口的按键,P1显示相应的位置,IO读写操作程序
sfrP1=0x90;/*SFRdefinitionforPort1*/
sfrP3=0xB0;/*SFRdefinitionforPort3*/
/*------------------------------------------------
MAINCFunction
------------------------------------------------*/
voidmain(void)
{
unsignedcharpval;/*tempvariableforportvalues*/
P1=0xFF;/*SetupP1forInput*/
/*--------------------------------------
UsetheToolboxbuttonsinthedebugger
tochangethevalueofP1.Openthe
Port1andPort3dialogsfromthe
PeripheralsMenutoviewtheirstatus.
--------------------------------------*/
while
(1)
{
pval=P3;/*ReadP1intopval*/
P1=pval;/*WritepvaltoP3*/
}
}
跑马灯
#include
////////////////////////////////////////////////////////
voiddelay(unsignedintcnt)//简单的延时
{
while(--cnt);
}
///////////////////////////////////////////////////////
main()
{
P1=0xfe;//给初始化值
while
(1)
{
delay(30000);//delayatcrystalfrequencyin12MHz
P1<<=1;//左移一位
P1|=0x01;//最后一位补1
if(P1==0x7f)//检测是否移到最左端?
{
delay(30000);//delay
P1=0xfe;
}
}
}
定时器0
#include
sbitLED=P1^2;
voidInit_Timer0(void)
{
TMOD|=0x01;
TH0=0x00;/*Initvalue*/
TL0=0x00;
EA=1;/*interuptenable*/
ET0=1;/*enabletimer0interrupt*/
TR0=1;
}
main()
{
Init_Timer0();
while
(1);
}
voidTimer0_isr(void)interrupt1using1
{
TH0=0x00;/*Initvalue*/
TL0=0x00;
LED=~LED;//指示灯反相
}
定时器1
/*copyright2009,ShengzhenJinChuangElectronicTechnologyco.,Ltd
*
*ThissampleisusedforTimer116bittimermode.
*
*writebyShifang2009-4-23
*
*V1.1
*/
#include
sbitLED=P1^2;
voidInit_Timer1(void)
{
TMOD|=0x10;
TH1=0x00;/*Initvalue*/
TL1=0x00;
EA=1;/*interuptenable*/
ET1=1;/*enabletimer1interrupt*/
TR1=1;
}
main()
{
Init_Timer1();
while
(1);
}
voidTimer1_isr(void)interrupt3using1
{
TH1=0x00;/*Initvalue*/
TL1=0x00;
LED=~LED;
}
定时器2
/*copyright2009,ShengzhenJinChuangElectronicTechnologyco.,Ltd
*
*ThissampleisusedforTimer116bittimermode.
*
*writebyShifang2009-4-23
*
*V1.1
*/
#include
sbitLED=P1^2;
voidTIM2Inital(void)
{
RCAP2H=(65536-60000)/256;//@12M10ms16bit自动重载
RCAP2L=(65536-60000)%256;
ET2=1;
EA=1;
TR2=1;
}
main()
{
TIM2Inital();
while
(1);
}
voidTimer0_isr(void)interrupt1using1
{
TH0=0x00;/*Initvalue*/
TL0=0x00;
LED=~LED;//指示灯反相
}
voidTIM2(void)interrupt5using1//定时器2中断
{
TF2=0;
LED=~LED;//指示灯反相
}
中段
//按键中断程序
#include
main()
{
P1=0x55;//P1口初始值
EA=1;//全局中断开
EX0=1;//外部中断0开
IT0=1;//边沿触发
while
(1)
{
}
}
voidISR_Key(void)interrupt0using1
{
P1=~P1;//s3按下触发一次,P1取反一次
}
实时时钟
#include
#include
sbitSCK=P3^6;
sbitSDA=P3^4;
sbitRST=P3^5;//DS1302复位
bitReadRTC_Flag=1;
unsignedcharl_tmpdate[7]={0,0,12,15,4,3,9};//秒分时日月周年08-05-1512:
00:
00
unsignedcharl_tmpdisplay[8];
codeunsignedcharwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//秒分时日月周年最低位读写位
codeunsignedcharread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
codeunsignedchartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
//共阴数码管0-9'-''熄灭‘表
codeunsignedchartable1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//显示位码表
voidWrite_Ds1302_byte(unsignedchartemp);
voidWrite_Ds1302(unsignedcharaddress,unsignedchardat);
unsignedcharRead_Ds1302(unsignedcharaddress);
voidRead_RTC(void);//readRTC
voidSet_RTC(void);//setRTC
voidInitTIMER0(void);//initaltimer0
voidmain(void)
{
InitTIMER0();
//Set_RTC();
while
(1){
if(ReadRTC_Flag)
{
ReadRTC_Flag=0;
Read_RTC();
switch(l_tmpdate[0]/5)//设计每个5秒交替显示年月日时分秒
{
case0:
case2:
case4:
case6:
case8:
case10:
l_tmpdisplay[0]=l_tmpdate[2]/16;//数据的转换,因我们采用数码管0~9的显示,将数据分开
l_tmpdisplay[1]=l_tmpdate[2]&0x0f;
l_tmpdisplay[2]=10;//加入"-"
l_tmpdisplay[3]=l_tmpdate[1]/16;
l_tmpdisplay[4]=l_tmpdate[1]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/16;
l_tmpdisplay[7]=l_tmpdate[0]&0x0f;
break;
case1:
case3:
case5:
case7:
case9:
case11:
l_tmpdisplay[0]=l_tmpdate[6]/16;
l_tmpdisplay[1]=l_tmpdate[6]&0x0f;
l_tmpdisplay[2]=10;
l_tmpdisplay[3]=l_tmpdate[4]/16;
l_tmpdisplay[4]=l_tmpdate[4]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[3]/16;
l_tmpdisplay[7]=l_tmpdate[3]&0x0f;
break;
default:
break;
}
}
}
}
voidInitTIMER0(void)
{
TMOD|=0x01;//定时器设置16位
TH0=0xef;//初始化值
TL0=0xf0;
ET0=1;
TR0=1;
EA=1;
}
voidWrite_Ds1302_Byte(unsignedchartemp)
{
unsignedchari;
for(i=0;i<8;i++)//循环8次写入数据
{
SCK=0;
SDA=temp&0x01;//每次传输低字节
temp>>=1;//右移一位
SCK=1;
}
}
/****************************************************************************/
voidWrite_Ds1302(unsignedcharaddress,unsignedchardat)
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();//启动
Write_Ds1302_Byte(address);//发送地址
Write_Ds1302_Byte(dat);//发送数据
RST=0;//恢复
}
/****************************************************************************/
unsignedcharRead_Ds1302(unsignedcharaddress)
{
unsignedchari,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for(i=0;i<8;i++)//循环8次读取数据
{
if(SDA)
temp|=0x80;//每次传输低字节
SCK=0;
temp>>=1;//右移一位
SCK=1;
}
RST=0;
_nop_();//以下为DS1302复位的稳定时间
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return(temp);//返回
}
/****************************************************************************/
voidRead_RTC(void)//读取日历
{
unsignedchari,*p;
p=read_rtc_address;//地址传递
for(i=0;i<7;i++)//分7次读取秒分时日月周年
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
}
}
/***********************************************************************/
voidSet_RTC(void)//设定日历
{
unsignedchari,*p,tmp;
for(i=0;i<7;i++){//BCD处理
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);
p=write_rtc_address;//传地址
for(i=0;i<7;i++)//7次写入秒分时日月周年
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);
}
voidtim(void)interrupt1using1//中断,用于数码管扫描
{
staticunsignedchari,num;
TH0=0xf5;
TL0=0xe0;
P0=table[l_tmpdisplay[i]];//查表法得到要显示数字的数码段
P2=table1[7-i];
i++;
if(i==8)
{
i=0;
num++;
if(10==num)//隔段时间读取1302的数据。
时间间隔可以调整
{
ReadRTC_Flag=1;//使用标志位判断
num=0;
}
}
}
鸿鸣灯
/*copyright2009,ShenzhenJinChuangElectronicTechnologyco.,Ltd
*
*ThissampleisusedforTimer116bittimermode.
*
*writebyShifang2009-4-23
*
*V1.1
*/
#include
sbitSPK=P1^2;//定义蜂鸣器端口
voiddelay(unsignedintcnt)//延时
{
while(--cnt);
}
main()
{
unsignedinti;
while
(1)
{
for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
{
delay(80);//参数决定发声的频率,估算值
SPK=!
SPK;
}
SPK=1;//喇叭停止工作,间歇的时间,可更改
delay(20000);
}
}