导航:首页 > 操作系统 > 基于c51单片机

基于c51单片机

发布时间:2024-05-22 08:13:04

❶ 基于51系列的单片机和DS1302时钟芯片以及液晶显示的lcd1602电子万年历毕业设计,万分感谢。

#include<reg51.h>
#include"DS18B20_3.H"
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
//flag用于读取头文件中的温度值,和显示温度值

#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbit rs=P1^0;
sbit en=P1^2;
sbit rw=P1^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了
sbit led=P3^7; //LCD背光开关

//DS1302时钟芯片与C51之间的引脚连接定义
sbit IO=P2^2;
sbit SCLK=P2^1;
sbit RST=P2^2;

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/************************************************************
ACC累加器=A
ACC.0=E0H

ACC.0就是ACC的第0位。Acc可以位寻址。

累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,
是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,
常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。
***************************************************************/

//校时按键与C51的引脚连接定义
sbit key1=P2^4; //设置键
sbit key2=P2^5; //加键
sbit key3=P2^6; //减键

sbit buzzer=P2^0;//蜂鸣器,通过三极管9012驱动,端口低电平响

/**************************************************************/

uchar code tab1[]={"20 - - "}; //年显示的固定字符
uchar code tab2[]={" : : "};//时间显示的固定字符

//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=120;y>0;y--);
}

/********液晶写入指令函数与写入数据函数,以后可调用**************/

/*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/

write_1602com(uchar com)//****液晶写入指令函数****
{
rs=0;//数据/指令选择置为指令
rw=0; //读写选择置为写
P0=com;//送入数据
delay(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}

write_1602dat(uchar dat)//***液晶写入数据函数****
{
rs=1;//数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat;//送入数据
delay(1);
en=1; //en置高电平,为制造下降沿做准备
delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}

lcd_init()//***液晶初始化函数****
{
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移
write_1602com(0x01);//清显示

write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
//delay(3);
}
write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
//delay(3);
}

}

/*********************over***********************/

/***************DS1302有关子函数********************/

void write_byte(uchar dat)//写一个字节
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//读一个字节
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;

}
return (ACC);
}
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据
{

RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;

write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07
write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01
write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10
write_1302(0x8e,0x80); //打开写保护

}

//------------------------------------
//温度显示子函数
void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码
}

//------------------------------------
//时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

//-------------------------------------
//年月日显示子函数
void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数

{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为第一个位置+add
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

//-------------------------------------------
void write_week(uchar week)//写星期函数
{
write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
{
case 1:write_1602dat('M');//星期数为1时,显示
write_1602dat('O');
write_1602dat('N');
break;

case 2:write_1602dat('T');//星期数据为2时显示
write_1602dat('U');
write_1602dat('E');
break;

case 3:write_1602dat('W');//星期数据为3时显示
write_1602dat('E');
write_1602dat('D');
break;

case 4:write_1602dat('T');//星期数据为4是显示
write_1602dat('H');
write_1602dat('U');
break;

case 5:write_1602dat('F');//星期数据为5时显示
write_1602dat('R');
write_1602dat('I');
break;

case 6:write_1602dat('S');//星期数据为6时显示
write_1602dat('T');
write_1602dat('A');
break;

case 7:write_1602dat('S');//星期数据为7时显示
write_1602dat('U');
write_1602dat('N');
break;

}

}

//****************键盘扫描有关函数**********************

void keyscan()
{
if(key1==0)//---------------key1为功能键(设置键)--------------------
{
delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下
{
buzzer=0;//蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
switch(key1n)
{

case 1: TR0=0;//关闭定时器
//TR1=0;
write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);
break;
case 2: write_1602com(er+6);//按2次fen位置显示光标

//write_1602com(0x0f);
break;
case 3: write_1602com(er+3);//按动3次,shi
//write_1602com(0x0f);
break;
case 4: write_1602com(yh+0x0e);//按动4次,week
//write_1602com(0x0f);
break;
case 5: write_1602com(yh+0x0a);//按动5次,ri
//write_1602com(0x0f);
break;
case 6: write_1602com(yh+0x07);//按动6次,yue
//write_1602com(0x0f);
break;
case 7: write_1602com(yh+0x04);//按动7次,nian
//write_1602com(0x0f);
break;
case 8:
write_1602com(0x0c);//按动到第8次,设置光标不闪烁
TR0=1;//打开定时器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302
write_1302(0x8e,0x80);
break;

}

}

}
//------------------------------加键key2----------------------------
if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零)
{

if(key2==0) //上调键
{
delay(10);
if(key2==0)
{
buzzer=0;//蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{
case 1:miao++;//设置键按动1次,调秒
if(miao==60)
miao=0;//秒超过59,再加1,就归零
write_sfm(0x08,miao);//令LCD在正确位置显示"加"设定好的秒数
temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回
//write_1602com(0x0b);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);//令LCD在正确位置显示"加"设定好的分数据
temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);//令LCD在正确的位置显示"加"设定好的小时数据
temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
write_week(week);//指定周数据显示内容
temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);//令LCD在正确的位置显示"加"设定好的日期数据
temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);//令LCD在正确的位置显示"加"设定好的月份数据
temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);//令LCD在正确的位置显示"加"设定好的年份数据
temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;

}

}

}
//------------------减键key3,各句功能参照'加键'注释---------------
if(key3==0)
{
delay(10);//调延时,消抖动
if(key3==0)
{
buzzer=0;//蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;//秒数据减到-1时自动变成59
write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数
temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
//write_1602com(0x0b);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
break;

case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 4:week--;
if(week==0)
week=7;

write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
write_week(week);//指定周数据显示内容
temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;

}

}

}

}

}

//-------------------------------
void init() //定时器、计数器设置函数
{
TMOD=0x11; //指定定时/计数器的工作方式为3
TH0=0; //定时器T0的高四位=0
TL0=0; //定时器T0的低四位=0
EA=1; //系统允许有开放的中断
ET0=1; //允许T0中断
TR0=1; //开启中断,启动定时器

}

//*******************主函数**************************
//***************************************************
void main()
{
lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用DS1302时钟的初始化子函数
init(); //调用定时计数器的设置子函数
led=0; //打开LCD的背光电源
buzzer=0;//蜂鸣器长响一次
delay(80);
buzzer=1;
while(1) //无限循环下面的语句:
{

keyscan(); //调用键盘扫描子函数

}
}

void timer0() interrupt 1 //取得并显示日历和时间
{

//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示

//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):

miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));

//显示温度、秒、时、分数据:

write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
write_sfm(5,fen);//分,从第二行第5个字符后开始显示
write_sfm(2,shi);//小时,从第二行第2个字符后开始显示

//显示日、月、年数据:
write_nyr(9,ri);//日期,从第二行第9个字符后开始显示
write_nyr(6,yue);//月份,从第二行第6个字符后开始显示
write_nyr(3,nian);//年,从第二行第3个字符后开始显示
write_week(week);

}

❷ C51单片机对位寻址的原理和编程方法

原理:

位寻址是一种使用单片机实现程序控制位逻辑操作的方法,通过一系列指令在单字节的内存空间中的一个特定的位 (bit 位) 上进行操作。它用于控制乱拿只有两状态的I/O端口。

编程方法:

1. 用 ORL A, #data 命令将某个指定的位置位,即把单字节内部某个指定的位置1。

2. 用 ANL A, #data 命令清除某个指定衡槐的位置位,即咐陪友把单字节内部某个指定的位置0。

3. 用 CLR C 命令将某个指定的位置位清零,即把单字节内指定的位置置零。

4. 用 MOV C, bit 命令将某个指定的位置位置1,即把单字节内部某个指定的位置1。

❸ c51单片机是什么

单片机,是典型的嵌入式微控制器,一般用在工业控制上,现在用的c51大都是AT89c51.

❹ 基于51单片机控制交通灯的电路图与C语言程序

思路:

红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。

三、硬件电路设计

此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

四、软件程序(C语言)

以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。

//*****************************//

//程序名:十字路口交通灯控制

//编写人:黄庭剑

//初写时间:2009年1月2日

//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.

//CPU说明:AT89C51型单片机;24MHZ晶体振荡器

//完成时间:2009年1月6日

//*****************************//

#include<stdio.h>

#include<reg51.h>

#include<intrins.h>

sfrp0=0x80;

sfrp1=0x90;

sfrp2=0xA0;

sfrp3=0xb0;//这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。

sbitsw=p0^0;

sbitOE=P0^6;

sbitLE=P0^7;//74LS373锁存器控制端定义

chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;

//函数声明begin

voiddelay1(intcount);

voiddelay_long(intnumber1,intnumber2);

voidpeople_car_drive();

//函数声明end

//***********************//延时子程序

voiddelay1(intcount)

{inti;

for(i=count;i>0;i--)

{;}

}

voiddelay_long(intnumber1,intnumber2)

{

inta,b;

for(a=number1;a>0;a--)

{

for(b=number2;b>0;b--)

{_nop_();}

}

}

//**********************//延时子程序

voidpeople_car_drive()

{

intp_1=2,i,j=9,p_2=6;//****************//行人通行时,延时20秒

p2=0x09;//南北红灯亮

p3=0x24;//东西绿灯亮

while(p_1-->0)

{LE=1;

OE=0;

if(p_1==0){OE=1;}//当十位数减到0时,只显示个位数

p1=display[p_1];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_1==0&&j==3)break;//减到3时退出循环,让其黄灯闪烁显示

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

//*******************************************************************************//

p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

//*****************以下是车辆通行时延时60秒//

p2=0x24;//南北绿灯亮

p3=0x09;//东西红灯亮

while(p_2-->0)

{LE=1;

OE=0;

if(p_2==0){OE=1;}//当十位数减到0时,只显示个位数

p1=display[p_2];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_2==0&&j==3)break;//减到2时退出循环

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);//南北黄灯闪烁三秒完毕

}

voidmain()//主函数入口处

{

p0=0x01;

p1=0x00;

p2=0x00;

p3=0x00;//初始化各端口

{while(1)

{

if(sw==0)

{people_car_drive();}

else

{

p2=0x00;

p3=0x00;//关闭所有交通灯

}

}

}

}

详情访问:http://hi..com/hjiannew/

❺ 基于51系列单片机的LED显示屏开发技术的目录

第1章51系列单片机系统结构概述
1.151单片机概述1
1.1.1单片机的分类1
1.1.28051单片机的应用3
1.1.38051单片机的开发3
1.1.48051单片机型号的选择4
1.1.5单片机学习的要点4
1.251单片机基本系统结构4
1.2.151单片机的结构框图及引脚4
1.2.2MCS51系列单片机主要功能部件6
1.2.3典型时钟电路和复位电路7
1.2.48051单片机I/O结构7
1.351单片机存储器结构8
1.3.1程序存储器9
1.3.2外部数据存储器10
1.3.3内部数据存储器空间11
1.3.4MCS51单片机特殊功能寄存器13
1.3.5常用特殊功能寄存器14
1.451单片机的指令系统及汇编语言设计要点16
1.4.1指令格式16
1.4.2伪指令17
1.4.3寻址方式19
1.4.4指令类型21
1.5汇编程序设计34
1.5.1三种基本的程序结构34
1.5.2汇编程序设计的要点35
1.651单片机主要扩展功能部件39
1.6.1MCS51单片机定时/计数器39
1.6.2中困橘搜断系统47
1.6.3串行口54
第2章C51应用基础
2.1KeilC51简介62
2.2C51程序设计基础知识63
2.2.1C语言的特点63
2.2.2一个简单的C51例子63
2.2.3C51的基础知识64
2.2.4存储空间定义64
2.2.5C51数据类型65
2.2.6C51存储空间的定义67
2.2.7C51的常量67
2.2.8C51常用运算符68
2.2.9C51表达式73
2.2.10C51的基本语句74
2.3C51的函数与数组80
2.3.1函数的定义81
2.3.2数组83
2.3.3结构(struct)86
2.3.4联合(union)87
2.4C51基本应用伍吵90
2.4.1I/O口字节操作应用90
2.4.2I/O口位操作应用90
2.4.3计数器应用91
2.4.4外部中断应用91
2.4.5串行口中断应用92
2.4.6键盘显示程序93
第3章铁电单片机VRS51L3074
3.1VRS51L3074概述104
3.1.1功能说明104
3.1.2引脚说明106
3.1.3指令系统109
3.2VRS51L3074的存储器结构113
3.2.1内部数据存储区114
3.2.2特殊功能寄存器区114
3.2.3外部数据存储汪历器组织120
3.2.4外部数据总线访问123
3.2.5FRAM铁电存储器的使用127
3.3VRS51L3074芯片配置133
3.3.1系统时钟配置133
3.3.2处理器工作模式控制135
3.3.3功能模块使能控制136
3.3.4功能模块I/O映射与优先级137
3.4通用I/O口138
3.4.1I/O口结构139
3.4.2I/O口方向配置139
3.4.3I/O口输入使能控制140
3.4.4I/O口锁存器140
3.4.5I/O口驱动能力141
3.4.6I/O口状态变化监控141
3.5定时/计数器142
3.5.1定时/计数器T0、T1143
3.5.2定时/计数器T2147
3.5.3定时器级联150
3.5.4定时器应用例程151
3.6脉冲宽度计数器(PWC)151
3.6.1PWC模块配置寄存器153
3.6.2PWC模块配置操作155
3.6.3PWC模块例程155
3.7串行口156
3.7.1串行口UART0157
3.7.2串行口UART1159
3.7.3串行通信波特率计算161
3.7.4UART0和UART1引脚映射162
3.7.5串行口例程163
3.8SPI接口166
3.8.1SPI运行控制167
3.8.2SPI配置和状态监控168
3.8.3SPI传输字长171
3.8.4SPI数据寄存器172
3.8.5SPI数据输入/输出173
3.8.6可变位数据传输174
3.9I2C接口175
3.9.1I2C运行控制175
3.9.2I2C从机在线状态检查178
3.9.3从机ID设置与I2C高级配置180
3.9.4I2C例程181
3.10脉冲宽度调制器(PWMs)184
3.10.1PWM输出波形控制185
3.10.2PWM模块时钟配置188
3.10.3PWM模块例程188
3.10.4PWM模块的定时器工作模式191
3.11增强型算术单元(AU)194
3.11.1算术单元控制寄存器195
3.11.2算术单元数据寄存器198
3.11.3桶式移位器200
3.11.4增强型算术单元整体结构201
3.11.5算术单元基本运算例程201
3.12看门狗定时器(WDT)202
3.12.1看门狗定时器的控制203
3.12.2采用外部时钟的情况下WDT的复位控制204
3.12.3WDT基本配置例程204
3.13中断系统205
3.13.1中断系统概述205
3.13.2中断允许控制207
3.13.3中断源选择208
3.13.4中断优先级209
3.13.5引脚变化中断209
3.14VRS51L3074JTAG接口211
3.14.1激活JTAG接口对系统的影响211
3.14.2板级JTAG接口的实现212
3.14.3VRS51L3074调试器212
3.15Flash编程接口(FPI)212
3.15.1与FPI模块相关的特殊功能寄存器212
3.15.2Flash存储器读操作215
3.15.3Flash存储器擦除217
3.15.4Flash存储器写操作218
第4章LED显示屏工作原理
4.1LED发光原理及其发展状况、趋势224
4.1.1LED发光原理224
4.1.2LED发展历史及趋势225
4.2LED显示屏基本模块介绍226
4.2.1光学和人眼视觉知识226
4.2.2LED器件主要参数227
4.2.3双基色点阵LED模块简介228
4.3常用双基色LED显示屏基本控制单元229
4.3.1室内双基色LED单元板结构介绍229
4.3.2驱动方式分析230
4.3.3室内双基色单元板电路分析232
4.4LED显示屏分类及亮度、灰度控制237
4.4.1LED显示屏分类237
4.4.2LED显示屏亮度及灰度控制理论238
4.5LED显示屏工程应用及维护概述241
4.5.1LED显示屏的方案设计241
4.5.2LED显示屏的安装243
4.5.3LED显示屏的维修244
第5章LED显示屏显示数据的组织
5.1LED显示屏控制系统对单片机的基本要求245
5.1.1LED显示屏对单片机控制系统的基本要求245
5.1.2LED显示屏对单片机数据处理方式的基本要求247
5.1.3指令优化对字节处理时间的影响248
5.2LED显示屏静态显示数据的组织251
5.2.1静态显示的LED显示屏数据组织251
5.2.2静态屏的滚动显示255
5.3LED显示屏动态显示数据的组织258
5.3.1动态显示的LED显示屏数据组织258
5.3.2显示区域中X、Y坐标与存储单元字节地址i、位地址j之间的关系261
5.4显示效果与占用显示数据存储器大小的关系263
5.4.1显示效果与占用显示数据存储器大小的关系263
5.4.2采用双RAM并行输出降低显示数据存储器的占用267
5.4.3多RAM并行输出时双RAM并行输出方式的扩展270
第6章基于51系列单片机的小型LED显示屏控制系统
6.1单片机直接驱动LED显示屏272
6.1.1显示数据存储在程序存储器中272
6.1.2显示数据存储在扩展的外部并行数据存储器中278
6.2利用单片机外部读写信号驱动LED显示屏279
6.2.1单片机外部数据存储器扩展279
6.2.2多个外部数据存储器扩展280
6.3利用单片机SPI接口驱动LED显示屏287
6.3.1SPI接口的特点287
6.3.2利用SPI接口驱动LED显示屏288
6.4单片机直接驱动LED显示屏应用实例291
第7章单片机扩展外部地址计数器驱动大型LED显示屏
7.1单片机访问外部数据存储器时间上的限制297
7.2利用单片机多RAM技术驱动大型LED显示屏301
7.2.1并行RAM方式301
7.2.2串行存储器方式307
7.3利用LED显示屏单元板排列方式驱动超长LED显示屏308
7.3.1超长LED显示屏面临的问题308
7.3.2LED显示屏的双向排列方式308
7.3.3超长LED显示屏的数据组织与硬件实现309
7.4利用多单片机系统驱动超大型LED显示屏313
7.5基于DSP与FPGA的LED显示屏控制系统的设计315
7.5.1DSP的特点及在LED显示屏控制系统中的应用315
7.5.2基于FPGA的系统时序电路设计316
7.5.3显示存储器模块设计317
7.5.4LED显示屏分区317
7.5.5显示存储器扫描时序控制电路318
第8章LED显示屏的系统软件编程
8.1汉字字库的生成与使用320
8.1.1汉字编码简介321
8.1.2点阵汉字字库321
8.1.3在Windows环境下提取字模的工作原理322
8.1.4提取字模的程序设计322
8.2控制卡与PC机的协议制定324
8.2.1控制命令字约定325
8.2.2配置文本编辑326
8.2.3直接数据格式定义329
8.2.4存储器地址位置331
8.2.5PC机端串行口通信模块331
8.3汉字字形的提取及图片的嵌入333
8.3.1汉字字形提取334
8.3.2图片的嵌入339
8.4PC机对下载数据的预处理339
8.4.1LED屏显示信息编辑及提取340
8.4.2LED显示数据生成340
8.4.3INTER格式数据转换342
第9章LED显示屏单片机控制系统编程
9.1基于SPI的Flash存储器读写346
9.1.1SST25系列串行Flash存储器346
9.1.2基于51单片机SPI接口的串行Flash驱动程序350
9.2字符控制及处理程序设计359
9.2.1字符控制处理程序设计360
9.2.2字符点阵字模提取程序设计367
9.3显示程序372
9.3.1显示程序指令表372
9.3.2读显示程序指令表378
9.3.3执行显示程序指令表381
9.3.4单场显示程序设计384
9.4串行口通信模块设计385
9.4.151单片机端串行口收发模块385
9.4.251单片机端串行口扩展程序模块388
9.5基于DS1302时钟模块程序设计391
9.5.1DS1302的结构及工作原理391
9.5.2DS1302的控制字节说明391
9.5.3复位392
9.5.4数据输入/输出392
9.5.5DS1302的寄存器392
9.5.6DS1302在LED控制卡上的硬件电路及软件设计393
9.6基于DS18B20温度传感器的模块设计395
9.6.1DS18B20的工作时序396
9.6.2DS18B20的程序设计397
第10章VRS51L3074在LED显示屏控制系统中的应用
10.1VRS51L3074与标准51单片机的比较401
10.1.1VRS51L3074运行速度401
10.1.2VRS51L3074的高速增强型SPI接口402
10.1.3VRS51L3074的定时/计数器402
10.1.4VRS51L3074的增强型算术运算单元402
10.1.5VRS51L3074的其他部件403
10.2VRS51L3074的基本应用403
10.3VRS51L3074的RAM扩展应用407
10.4VRS51L3074扩展硬件地址计数器409
10.5VRS51L3074的扩展“双端口”串行FRAM412
附录AASCII码表415
附录BMCS51单片机常用资料416
附录CC51中的关键字和常用函数425
附录DKeilμVision3中高性能铁电单片机(VRS51L2xxx/3xxx)的相关配置简介435
附录E常用芯片引脚图440
E.1CPU440
E.2驱动芯片442
E.3其他444
附录F异步室内双基色LED显示屏故障排查简明手册449
附录GLED双基色单元板原理图451
参考文献455

❻ C51写单片机程序如何插入汇编指令.

C51些单片机程序插入汇编指令的方法如下:

1、以#pragma asm开始,以#pragma endasm结束,

用pragma asm和#pragma endasm这两个伪指令将汇编代码包起来。

比如:

3、如果勾选椭圆圈中的两项,这样就可以了。

阅读全文

与基于c51单片机相关的资料

热点内容
cadfill命令什么意思 浏览:332
中公专项题库pdf 浏览:929
拼多多缓存在哪个文件夹 浏览:640
安卓无卡汽车导航怎么升级 浏览:48
cs管理员命令是什么 浏览:126
华为v10模拟加密门禁卡 浏览:725
android修改app名称 浏览:640
辐射3伙伴命令 浏览:247
苹果电脑pdf转换成word 浏览:921
纯小数运算法则 浏览:385
php什么是事务 浏览:859
怎么添加网名文件夹 浏览:769
啊哈算法语言 浏览:677
马来西亚加密货币政策 浏览:233
交通银行app锁定怎么解锁 浏览:54
php登录验证session 浏览:730
粤政易文件放在手机哪个文件夹 浏览:107
打印机和传真命令 浏览:550
php添加购物车 浏览:5
安卓怎么下载植物大战僵尸1无尽版 浏览:267