智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2250|回复: 0
打印 上一主题 下一主题

51单片机C语言教程

[复制链接]

2

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
威望
209
贡献
58
兑换币
2
注册时间
2011-12-18
在线时间
10 小时
跳转到指定楼层
1#
发表于 2011-12-18 01:45:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
新概念
51单片机C语言教程
----入门、提高、开发、拓展全攻略
郭天祥编著
电子工业出版社
例2.2.1 编写程序,点亮第一个发光二极管(part2_1.c   P27 )
#include <reg52.h> //52系列单片机头文件
sbit led1=P1^0;           //声明单片机P1口的第一位
void main()                   //主函数
{
        led1=0;       /*点亮第一个发光二极管*/       
}

例2.2.2 编写程序,点亮P1口的若干二极管(part2_2.c  P39 )
#include <reg52.h>  //52系列单片机头文件
void main()                   //主函数
{
        P1=0xaa;
    //while(1);      
}

例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c  P42)
#include <reg52.h>    //52系列单片机头文件
#define uint unsigned int //宏定义
sbit led1=P1^0;              //声明单片机P1口的第一位
uint i,j;
void main()                      //主函数
{
        while(1)                  //大循环
        {
                led1=0;                                        /*点亮第一个发光二极管*/       
                for(i=1;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.c  P48)

#include <reg52.h>                    //52系列单片机头文件
#define uint unsigned int                 //宏定义
sbit led1=P1^0;                              //声明单片机P1口的第一位
void delay1s();                                //声明子函数
void main()                                      //主函数
{
        while(1)                                          //大循环
        {
                led1=0;                                        /*点亮第一个发光二极管*/       
                delay1s();                                //调用延时子函数
                led1=1;                                        /*关闭第一个发光二极管*/       
                delay1s();                                //调用延时子函数
        }       
}
void delay1s()                                                //子函数体
{
        uint i,j;
        for(i=500;i>0;i--)               
                for(j=110;j>0;j--);
}

例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。(part2_5.c  P49)
#include <reg52.h>                    //52系列单片机头文件
#define uint unsigned int                 //宏定义
sbit led1=P1^0;                              //声明单片机P1口的第一位
void delayms(uint);                                //声明子函数
void main()                                      //主函数
{
        while(1)                                          //大循环
        {
                led1=0;                                        /*点亮第一个发光二极管*/       
                delayms(200);                                //延时200毫秒
                led1=1;                                        /*关闭第一个发光二极管*/       
                delayms(800);                                //延时800毫秒
        }       
}
void delayms(uint xms)                               
{
        uint i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}
例2.8.3利用C51自带库_crol_(),以间隔500ms,实现流水灯程序(part2_6.c  P53)
#include <reg52.h>                    //52系列单片机头文件
#include <intrins.h>
#define uint unsigned int                 //宏定义
#define uchar unsigned char
void delayms(uint);                                //声明子函数
uchar aa;
void main()                                      //主函数
{
        aa=0xfe;                                        //赋初值11111110
        while(1)                                          //大循环
        {
                P1=aa;
                delayms(500);             //延时500毫秒
                aa=_crol_(aa,1);        //将aa循环左移1位后再赋给aa
        }       
}
void delayms(uint xms)                               
{
        uint i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}





















例3.2.1编写程序使第一个数码管显示8(part2.1_.1c  P59)
#include <reg52.h>                    //52系列单片机头文件
sbit dula=P2^6;           //申明U1锁存器的锁存端
sbit wela=P2^7;           //申明U2锁存器的锁存端
void main()
{
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.c  P61)
#include <reg52.h>         //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;           //申明U1锁存器的锁存端
sbit wela=P2^7;           //申明U2锁存器的锁存端
uchar num;
unchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
void main()
{
        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秒
                        }
        }
}

void delayms(uint xms)
{
        uint i,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.c  P62)
#include <reg52.h>         //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;           //申明U1锁存器的锁存端
sbit wela=P2^7;           //申明U2锁存器的锁存端
uchar num;
unchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
void main()
{
while(1)
{
   dula=1;
   P0=table[1];  //送段选数据
   dula=0;
   P0=0xff;      //送位选数据前关闭所有显示,防止打开位选锁存时
   wela=1;       //原来段选数据通过位选锁存器造成混乱
   P0=0xfe;      //送位选数据
   wela=0;
   delayms(500);    //延时

dula=1;
   P0=table[2]; //送段选数据
   dula=0;
   P0=0xff;      //送位选数据前关闭所有显示,防止打开位选锁存时
   wela=1;       //原来段选数据通过位选锁存器造成混乱
   P0=0xfd;     //送位选数据
   wela=0;
   delayms(500);    //延时

dula=1;
   P0=table[3]; //送段选数据
   dula=0;
   P0=0xff;   //送位选数据前关闭所有显示,防止打开位选锁存时
   wela=1;       //原来段选数据通过位选锁存器造成混乱
   P0=0xfb;    //送位选数据
   wela=0;
   delayms(500);    //延时

dula=1;
   P0=table[4];  //送段选数据
   dula=0;
   P0=0xff;      //送位选数据前关闭所有显示,防止打开位选锁存时
   wela=1;       //原来段选数据通过位选锁存器造成混乱
   P0=0xf7;      //送位选数据
   wela=0;
   delayms(500);    //延时

dula=1;
   P0=table[5];  //送段选数据
   dula=0;
   P0=0xff;      //送位选数据前关闭所有显示,防止打开位选锁存时
   wela=1;       //原来段选数据通过位选锁存器造成混乱
   P0=0xef;      //送位选数据
   wela=0;
   delayms(500);    //延时

dula=1;
   P0=table[6];  //送段选数据
   dula=0;
   P0=0xff;      //送位选数据前关闭所有显示,防止打开位选锁存时
   wela=1;       //原来段选数据通过位选锁存器造成混乱
   P0=0xdf;      //送位选数据
   wela=0;
   delayms(500);    //延时
}
}
void delayms(uint xms)
{
      uinti,j;
      for(i=xms;i>0;i--)  //i=xms即延时约xms毫秒
         for(j=110;j>0;j--);
}

例3.5.1利用定时器0工作方式1,在实验板上实现第一个发光管以1s亮灭闪烁。(part2.1.4.c  P74)
#include<reg52.h>          //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0x01;            //设置定时器0为工作方式1(M1M0为01)
TH0=(65536-45872)/256;   //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
EA=1;      //开总中断
ET0=1;     //开定时器0中断
TR0=1;     // 启动定时器0
while(1);     //程序停止在这里等待中断中断发生
}

void T0_time() interrupt 1
{
TH0=(65536-45872)/256;   //重装初值
TL0=(65536-45872)%256;
num++;      //num每加1次判断一次是否到20次
if(num==20)   //如果到了20次,说明1秒时间到
{
   num=0;    //然后把num清0重新再计20次
   led1=~led1;  //让发光管状态取反
}
}

例3.5.2用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。(part2.1_5.c  P75)
#include <reg52.h>         //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;           //申明U1锁存器的锁存端
sbit wela=P2^7;           //申明U2锁存器的锁存端
sbit led1=P1^0;
unchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,num2,shi,ge;
void main()
{
TMOD=0x11;            //设置定时器0为工作方式1(M1M0为11)
TH0=(65536-45872)/256;   //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;   //装初值11.0592M晶振定时50ms数为45872
TL1=(65536-45872)%256;
EA=1;      //开总中断
ET0=1;     //开定时器0中断
ET1=1;     //开定时器1中断
TR0=1;     // 启动定时器0
TR1=1;     // 启动定时器1
while(1);     //程序停止在这里等待中断中断发生
{
       display(shi,ge);
}
}

void display(uchar shi,uchar ge)  //显示子函数
{
       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);    //延时
}

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)     //i=xms即延时约xms毫秒
    for(j=110;j>0;j--);
}

void T0_time() interrupt 1
{
TH0=(65536-45872)/256;   //重装初值
TL0=(65536-45872)%256;
num++;
if(num1==4)           //如果到了4次,说明200ms时间到
{
    num1=0;         //然后把num1清0重新再计4次
    led1=~led1;       //让发光管状态取反
}
}

void T1_time() interrupt 3
{
TH1=(65536-45872)/256;   //重装初值
TL1=(65536-45872)%256;
num2++;
if(num2==20)           //如果到了20次,说明1秒刷新时间到
{
    num2=0;            //然后把num2清0重新再计4次
    num++;
if(num==60)       //这个数用来送数码管显示,到60后归0
num=0;
shi=num/10;       //把一个2位数分离后分别送数码管显示
ge=num%10;      //十位和个位
}
}




详见附件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 22:11 , Processed in 0.075943 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表