MCS51C语言编程示例.docx
- 文档编号:3234357
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:15
- 大小:153.25KB
MCS51C语言编程示例.docx
《MCS51C语言编程示例.docx》由会员分享,可在线阅读,更多相关《MCS51C语言编程示例.docx(15页珍藏版)》请在冰豆网上搜索。
MCS51C语言编程示例
MCS-51C语言编程示例
例1图1所示是利用优先权解码芯片,在单片机8031的一个外部中断
上扩展多个中断源的原理电路图。
图中是以开关闭合来模拟中断请求信号。
当有任何一中断源产生中断请求,能给8031的
引脚送一个有效的中断信号,由P1的低3位可得对应中断源的中断号。
图1扩展多个中断源
在中断服务程序中仅设置位置标志,并保存I/O口输入状态。
FranklinC51编译器提供定义特定MCS-51系列成员的寄存器头文件。
MCS-51头文件位reg51.h。
C51程序如下:
#include
unsignedcharstatus;
bitflag;
voidservice_int1()interrupt2using2
{flag=1;
status=P1;
}
voidmain(void)
{IP=0x04;
IE=0x84;
for(;;)
{if(flag)
{switch(status)
{case0:
break;
case1:
break;
case2:
break;
case3:
break;
default:
;
}
flag=0;
}
}
}
例2设单片机的
=12MHz晶振,要求在P1.0脚上输出周期位2ms的方波。
周期位2ms的方波要求定时时间间隔1ms,每次时间到P1.0取反。
机器周期=
=
需要计数的次数=
由于计数器的加一计数,为得到1000个计数之后的定时器溢出,必须给定时器设置初值位-1000(即1000的补数)。
(1)用定时器0的方式1编程,采用查询方式,程序如下:
#include
sbitP1_0=P1^0;
voidmain(void)
{TMOD=0x01;
TR0=1;
for(;;)
{TH0=-(1000/256);
TL0=-(1000%256);
do{}while(!
TF0);
P1_0=!
P1_0;
TF0=0;
}
}
(2)用定时器0的方式1编程,采用中断方式。
程序如下:
#include
sbitP1_0=P1^0;
voidtime(void)interrupt1using1
{P1_0=!
P1_0;
TH0=-(1000/256);
TL0=-(1000%256);
}
voidmain(void)
{TMOD=0x01;
P1_0=0;
TH0=-(1000/256);
TL0=-(1000%256);
EA=1;
ET0=1;
TR0=1;
do{}while
(1);
}
例3采用10MHz的晶振,在P1.0脚上输出周期2.5s,占空比20%脉冲信号。
10MHz晶振,使用定时器最大定时几十毫秒。
取10ms定时,周期2.5s需要250次中断,占空比20%,高电平应为50次中断。
10ms定时,晶振
。
需要定时器计数次数
中断服务程序流程图如图2所示。
图2中断服务程序流程图
程序如下:
#include
#defineucharunsignedchar
ucharperiod=250;
ucharhigh=50;
uchartime=0;
timer0()interrupt1using1
{TH0=-8333/256;
TL0=-8333%256;
if(++time==high)P1=0;
elseif(time==period)
{time=0;
P1=1;
}
}
main()
{TMOD=0x01;
TH0=-8333/256;
TL0=-8333%256;
EA=1;
ET0=1;
TR0=1;
do{}while
(1);
}
产生一个占空比变化脉冲信号的程序,它产生的脉宽调制信号用于电机变速控制。
程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
uchartime,status,percent,period;
bitone_round;
uintoldcount,target;
voidpulse(void)interrupt1using1
{TH0=-833/256;
TL0=-833%256;
ET0=1;
if(++time=percent)P1=0;
elseif(time=100)
{time=0;P1=1;
}
voidtachmeter(void)interrupt2using2
{union
{uintword;
struct{ucharhi;ucharlo;}
byte;}
newcount;
newcount.byte.hi=TH1;
newcount.byte.ho=TL1;
period=newcount.word-oldcount;
oldcount=newcount.word;
one_round=1;
}
voidmain(void)
{IP=0x04;
TMOD=0x11;
TCON=0x54;
TH1=0;TL1=0;
IE=0x86;
for(;;)
{if(one_round)
{if(period {if(percent<100)++percent; } elseif(percent>0)—percent; one_round=0; } } } 例4单片机 ,波特率为9600,各设置32字节的队列缓冲区用于发送接收。 设计单片机和终端或另一计算机通信的程序。 程序如下: #include #defineucharunsignedchar ucharxdatar_buf[32]; ucharxdatat_buf[32]; ucharr_in,r_out,t_in,t_done; bitr_full,t_empt,t_done; codeucharm[]={"thisisatestprogram\r\n}; serial()interrupt4using1 {if(RI&&~r_full) {r_buff[r_in]=SBUF; RI=0; r_in=++r_in&&ox1f; if(r_in=r_out)r_full=1; } elseif(TI&&~empty) {SBU=t_buf[t_out]; TI=0; t_out=++t_out&0x1f; if(t_out=t_in)t_empty=1; } elseif(TI) {TI=0; t_done=1; } } voidloadmsg(ucharcode*msg) {while((*msg! =0&&((((t_in+1^t_out)&oxlf)! =0)) {t_buf[t_in]=*msg; msg++; t_in=++t_in&0x1f; if(t_done) {TI=1; t_empty=t_done=0; } } } voidprocess(ucharch) {return;} voidprocessmsg(void) {while(((r_out+1^r_in)! =0) {process(r_buf[r_out]); r_out=++r_out&0x1f; } } main() {TMOD=0x20; TH1=0xfd; TCON=0x40; SCON=0x50; IE=0x90; t_empty=t_done=1; r_full=0; r_out=t_in=0; r_in=1; for(;;) {loadmsg(&m); processmsg(); } } 例58255控制打印机 图3是8031扩展8255与打印机接口的电路。 图38031扩展8255与打印机接口的电路 程序如下: #include #include #defineucharunsignedchar #defineCOM8255XBYTE[0x007f] #definePA8255XBYTE[0x007c] #definePC8255XBYTE[0x007e] voidtoprn(uchar*p) {while(*p! ='\0') {while((0x80&PC8255)! =0); PA8255=*p; COM8255=0x00; COM8255=0x01; p++; } } voidmain(void) {ucharidataprn[]="WELCOME"; COM8255=0x8e; torpn(prn); } 例6EPROM编码器 #include #include #defineCOM8255XBYTE[0x07ff] #definePA8255XBYTE[0x07fc] #definePB8255XBYTE[0x07fd] #definePC8255XBYTE[0x07fe] #defineucharunsignedchar #defineuintunsignedint voidd1_ms(unitx); voidprogram(ram,eprom,con) ucharxdata*ram; uinteprom,ron; {inti; COM8255=0x08; COM8255=0x0f; for(i=0;i {PA8255=*ram; PB8255=eprom%256; PC8255=eprom/256; eprom++; ram++; COM8255=0x0e; d1_ms(50); COM8255=0x0f; } } main() {program(0x1000,0x0000,0x0100); } 例7ADC0809与8031接口的数据采集程序举例 程序如下: #include #include #defineucharunsignedchar #defineIN0XBYTE[0x7ff8] sbitad_busy=P3^3; voidad0809(ucharidata*x) {uchari; ucharxdata*ad_adr; ad_adr=&IN0; for(i=0;i<8;i++) {*ad_adr=0; i=i; i=i; while(ad_busy==0); x[i]=*ad_adr; ad_adr++; ad_adr++; } } voidmain(void) {staticucharidataad[10]; ad0809(ad); } 例8AD574与8031接口的数据采集程序举例 程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MCS51 C语言编程示例 语言 编程 示例
![提示](https://static.bdocx.com/images/bang_tan.gif)