51单片机C语言程序设计源代码.docx
- 文档编号:27033855
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:213
- 大小:64.82KB
51单片机C语言程序设计源代码.docx
《51单片机C语言程序设计源代码.docx》由会员分享,可在线阅读,更多相关《51单片机C语言程序设计源代码.docx(213页珍藏版)》请在冰豆网上搜索。
51单片机C语言程序设计源代码
新概念
51单片机C语言教程
----入门、提高、开发、拓展全攻略
郭天祥编著
电子工业出版社
例2.2.1编写程序,点亮第一个发光二极管(part2_1.cP27)
#include
sbitled1=P1^0;//声明单片机P1口的第一位
voidmain()//主函数
{
led1=0;/*点亮第一个发光二极管*/
}
例2.2.2编写程序,点亮P1口的若干二极管(part2_2.cP39)
#include
voidmain()//主函数
{
P1=0xaa;
//while
(1);
}
例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.cP42)
#include
#defineuintunsignedint//宏定义
sbitled1=P1^0;//声明单片机P1口的第一位
uinti,j;
voidmain()//主函数
{
while
(1)//大循环
{
led1=0;/*点亮第一个发光二极管*/
for(i=1000;i>0;i--)//延时
for(j=110;j>0;j--);
led1=1;/*关闭第一个发光二极管*/
for(i=1000;i>0;i--)//延时
for(j=110;j>0;j--);
}
}
例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.cP48)
#include
#defineuintunsignedint//宏定义
sbitled1=P1^0;//声明单片机P1口的第一位
voiddelay1s();//声明子函数
voidmain()//主函数
{
while
(1)//大循环
{
led1=0;/*点亮第一个发光二极管*/
delay1s();//调用延时子函数
led1=1;/*关闭第一个发光二极管*/
delay1s();//调用延时子函数
}
}
voiddelay1s()//子函数体
{
uinti,j;
for(i=500;i>0;i--)
for(j=110;j>0;j--);
}
例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
(part2_5.cP49)
#include
#defineuintunsignedint//宏定义
sbitled1=P1^0;//声明单片机P1口的第一位
voiddelayms(uint);//声明子函数
voidmain()//主函数
{
while
(1)//大循环
{
led1=0;/*点亮第一个发光二极管*/
delayms(200);//延时200毫秒
led1=1;/*关闭第一个发光二极管*/
delayms(800);//延时800毫秒
}
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
例2.8.3利用C51自带库_crol_(),以间隔500ms,实现流水灯程序(part2_6.cP53)
#include
#include
#defineuintunsignedint//宏定义
#defineucharunsignedchar
voiddelayms(uint);//声明子函数
ucharaa;
voidmain()//主函数
{
aa=0xfe;//赋初值
while
(1)//大循环
{
P1=aa;
delayms(500);//延时500毫秒
aa=_crol_(aa,1);//将aa循环左移1位后再赋给aa
}
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
例3.2.1编写程序使第一个数码管显示8(part2.1_.1cP59)
#include
sbitdula=P2^6;//申明U1锁存器的锁存端
sbitwela=P2^7;//申明U2锁存器的锁存端
voidmain()
{
wela=1;//打开U2锁存器
P0=0xFE;//送入位选信号
wela=0;//关闭U2锁存器
dula=1;//打开U1锁存器
P0=0x7F;//送入段选信号
dula=0;//关闭U2锁存器
while
(1);//程序停止到这里
}
例3.2.2让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为0.5ms,循环下去。
(part2.1_2.cP61)
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;//申明U1锁存器的锁存端
sbitwela=P2^7;//申明U2锁存器的锁存端
ucharnum;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelayms(uint);
voidmain()
{
wela=1;//打开U2锁存端
P0=0xco;//送入位选信号
wela=0;//关闭U2锁存端
while
(1)
{
for(num=0;num<16;num++)//16个数循环显示
{
dula=1;//打开U1锁存端
P0=table[num];//送入段选信号
dula=0;//关闭U1锁存端
delay(500);//延时0.5秒
}
}
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
例3.3.1第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时间为0.5s,在关闭它……一直到最后一个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。
(part2.1_3.cP62)
例3.5.2用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。
(part2.1_5.cP75)
例4.1.1用数码管前两位显示一个十进制数,变化范围为00~59,开始时显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。
(part2.2_1.cP82)
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P3^4;
sbitkey2=P3^5;
sbitkey3=P3^6;
sbitkey4=P3^7;
sbitdula=P2^6;//申明U1锁存器的锁存端
sbitwela=P2^7;//申明U2锁存器的锁存端
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelayms(uint);
ucharnumt0,num;
voiddisplay(ucharnumdis)//显示子函数
{
ucharshi,ge;//分离两个分别要显示的数
shi=numdis/10;
ge=numdis%10;
dula=1;
P0=table[shi];//送十位段选数据
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时
wela=1;//原来段选数据通过位选锁存器造成混乱
P0=0xfe;//送位选数据
wela=0;
delayms(5);//延时
dula=1;
P0=table[ge];//送个位段选数据
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
voidinit()//初始化函数
{
TMOD=0x01;//设置定时器0为工作方式1(00000001)
TH0=(65536-45872)/256;//装初值50ms一次中断
TL0=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
}
voidkeyscan()
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
num++;
if(num==60)//当到60时重新归0
num=0;
while(!
key1);//等待按键释放
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
if(num==0)//当到0时重新归60
num=60;
num--;
while(!
key2);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
num=0;//清0
while(!
key3);
}
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
while(!
key4);
TR0=~TR0;//启动或停止定时器0
}
}
}
voidmain()
{
init();//初始化函数
while
(1)
{
keyscan();
display(num);
}
}
voidT0_time()interrupt1
{
TH0=(65536-45872)/256;//重装初值
TL0=(65536-45872)%256;
numt0++;
if(numt0==20)//如果到了20次,说明1秒时间到
{
numt0=0;//然后把num清0重新再计20次
num++;
if(num==60)
num=0;
}
}
例4.2.1实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0~F,六个数码管同时静态显示即可。
(part2.2_2.cP87)
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;//申明U1锁存器的锁存端
sbitwela=P2^7;//申明U2锁存器的锁存端
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
voiddisplay(ucharnum)
{
P0=table[num];//显示函数只送段选数据
dula=1;
dula=0;
}
voidmatrixkeyscan()
{
uchartemp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
break;
case0xde:
key=1;
break;
case0xbe:
key=2;
break;
case0x7e:
key=3;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
key=4;
break;
case0xdd:
key=5;
break;
case0xbd:
key=6;
break;
case0x7d:
key=7;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=8;
break;
case0xdb:
key=9;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
key=12;
break;
case0xd7:
key=13;
break;
case0xb7:
key=14;
break;
case0x77:
key=15;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
voidmain()
{
P0=0;//关闭所有数码管段选
dula=1;
dula=0;
P0=0xc0;//位选中所有数码管
wela=1;
wela=0;
while
(1)
{
matrixkeyscan();//不停调用键盘扫描程序
}
}
例5.3.1用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位A/D转换后数值在0~255变化)。
(part2.3_1.cP107)
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;//申明U1锁存器的锁存端
sbitwela=P2^7;//申明U2锁存器的锁存端
sbitadwr=P3^6;//定义AD的WR端口
sbitadrd=P3^7;//定义AD的RD端口
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
voiddisplay(ucharbai,ucharshi,ucharge)//显示子函数
{
dula=1;
P0=table[bai];//送段选数据
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时
wela=1;//原来段选数据通过位选锁存器造成混乱
P0=0x7e;//送位选数据
wela=0;
delayms(5);//延时
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delayms(5);
}
voidmain()//主程序
{
uchara,A1,A2,A3,adval;
wela=1;
P0=0x7f;//置CSAD为0,选通ADCS以后不必再管ADCS
wela=0;
while
(1)
{
adwr=1;
_nop_();
adwr=0;//启动AD转换
_nop_();
adwr=1;
for(a=10;a>0;a--)//TX-1C实验板AD工作频率较低,所以启动转换后要多留点时间用来转换
{//这里把显示部分放这里的原因也是为了延长转换时间
display(A1,A2,A3);
}
P1=0xff;//读取P1口之前先给其写全1
adrd=1;//选通ADCS
_nop_();
adrd=0;//AD读使能
_nop_();
adval=P1;//AD数据读取赋给P1口
adrd=1;
A1=adval/100;//分出百,十,和个位
A2=adval%100/10;
A3=adval%10;
}
}
例5.5.1用单片机控制DAC0832芯片输出电流,让发光二级管D12由灭均匀变到最亮,再由最亮均匀熄灭。
在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5S左右,循环变化。
(part2.3_2.cP121)
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;//申明U1锁存器的锁存端
sbitwela=P2^7;//申明U2锁存器的锁存端
sbitdawr=P3^6;//定义DA的WR端口
sbitdacs=P3^2;//定义DA的CS端口
sbitbeep=P2^3;//定义蜂鸣器端口
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
voidmain()
{
ucharval,flag;
dula=0;
wela=0;
dacs=0;
dawr=0;
P0=0;
while
(1)
{
if(flag==0)
{
val+=5;
P0=val;//通过P0口给DA数据口赋值
if(val==255)
{
flag=1;
beep=0;
delayms(100);
beep=1;
}
delayms(50);
}
else
{
val-=5;
P0=val;//通过P0口给DA数据口赋值
if(val==0)
{
flag=0;
beep=0;
delayms(100);
beep=1;
}
delayms(50);
}
}
}
例6.5.1在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机“IgetX”,串口波特率设为9600bps。
(part2.4_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 语言程序设计 源代码