‘壹’ C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要详细具体。
晚上随手写,也未调试,权当看看
程序有不严谨地方还得调试修改
#include<REGX51.H>
#defineSTATUS_1S 1
#defineSTATUS_2S 2
#defineSTATUS_3S 3
#defineSTATUS_4S 4
#defineSTATUS_5S 5
#defineSTATUS_15S 15
#defineSTATUS_28S 28
#defineSTATUS_29S 29
#defineSTATUS_30S 30
unsignedcharflag,status,status_temp=1,status_temp_;
sbitK1 = P0^0;
sbitK2 = P0^1;
sbitRLED = P0^2;
sbitYLED = P0^3;
sbitGLED = P0^4;
voidInit(void)
{
ET0=1;
TR0=1;
RLED=0; //亮
YLED=0;
GLED=0;
while(status_temp)
{
switch(status)
{
caseSTATUS_1S: //1S
{
RLED=1; //灭,闪一次
YLED=1;
GLED=1;
} break;
caseSTATUS_2S: //1S
{
RLED=0; //亮,闪一次
YLED=0;
GLED=0;
} break;
caseSTATUS_3S: //1S
{
RLED=1; //灭
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
voidInit_Timer0(void)
{
TMOD=0x01;
// ET0=1;
// TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0; //未计算,偷楼上的
}
voidM_Start(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //红亮
while(status_temp)
{
switch(status)
{
caseSTATUS_1S:
{
if(status_temp_==1)
{
YLED=0;
}
} break;
caseSTATUS_2S:
{
if(status_temp_==1)
{
YLED=1;
}
} break;
caseSTATUS_3S:
{
if(status_temp_==1)
{
YLED=0;
status_temp_=0;
}
} break;
caseSTATUS_15S: //15S灭,绿亮
{
RLED=1;
GLED=0;
} break;
caseSTATUS_28S:
{
GLED=1;
} break;
caseSTATUS_29S:
{
GLED=0;
} break;
caseSTATUS_30S:
{
GLED=1;
status=0;
status_temp_=1;
} break;
}
}
ET0=0;
TR0=0;
status=0;
status_temp=1;
YLED=1;
}
voidM_End(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //亮1次
YLED=0;
GLED=0;
while(status_temp)
{
switch(status)
{
caseSTATUS_1S: //1S
{
RLED=1; //灭一次
YLED=1;
GLED=1;
} break;
caseSTATUS_2S: //1S
{
RLED=0; //亮二次
YLED=0;
GLED=0;
} break;
caseSTATUS_3S: //1S
{
RLED=1; ////灭二次
YLED=1;
GLED=1;
} break;
caseSTATUS_4S: //1S
{
RLED=0; ////亮三次
YLED=0;
GLED=0;
} break;
caseSTATUS_5S: //1S
{
RLED=1; ////灭三次
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1==0)
M_Start();//模拟开始
if(K2==0)
M_End();//模拟结束
}
}
voidinterrupt_time0()interrupt1 //核对头文件,一致就好
{
TH0=0X3C;
TL0=0XB0;
flag++;
if(flag==20)
{
status++;
flag=0;
}
}
‘贰’ 单片机C51 C语言编程问题!!!!
voiddisplay(ucharshi,ucharge)
{
uintledout[1],i;//这里应该是ledout[2]
我在proteus上进行了仿真,但是不知道什么原因,只对共阳极LED数码管好使。我就把程序稍微做了改动,仿真结果可以正确计时。
我把程序贴在下面供参考
#include<reg52.h>
#define禅悔ucharunsignedchar
#defineuintunsignedint
ucharnum=0,count=0,num2=0,shi=0,ge=0;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳//段选数据表
//ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodewei[2]={0xfe,0xfd};//位选数据表
voiddisplay(uchar,uchar);
voiddelay(uint);
voidmain()
{
TMOD=0x10;//设定定时器1工作在方式1
TH1=(65536-50000)/256;//装载初值
TL1=(65536-50000)%256;//开总中断
//开定时器1中断
ET1=1;//启动定时器1
TR1=1;//程序在此不停对于数码管动态扫描等待中断
EA=1;
while(1)
{
display(shi,ge);//显示函数
}
}
voiddisplay(ucharshi,ucharge)
{
uintledout[2],i;
ledout[0]=table[shi];雹袭锋//段选数据十位
ledout[1]=table[ge];//段选数据各个
for(i=0;i<2;i++)
{//用P0输出位选数据
P0=wei[i];
//这里用查表的方式来赋值
P2=ledout[i];//用P2输出段选数据
delay(1);//扫描间隔
}
}
//1S中断函数
voidT1_time()interrupt3
{
TH0=(65536-50000)/256;源晌//重新装载初值
TL0=(65536-50000)%256;
count++;
if(count==20)//如果到了20次,说明1秒到
{//把COUNT清零重新计数20次
count=0;
num2++;//用NUM2向来数码管显示到60后归零
if(num2==60)
num2=0;
shi=num2/10;//把NUM2分成2个数十位和个位
ge=num2%10;
}
}
voiddelay(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//延时程序
for(j=110;j>0;j--);
}
‘叁’ 51单片机的问题
7.定时/计数器工作于定时方式时,是通过89C51片内振荡器输出经12分频后的脉冲进行计数,
--对。
直至溢出。
--这要看你的软件,也可以让它永远不溢出。
8.80C51单片机的扩展程序存储器与片内程序存储器存储空间重叠。
--可以重叠,也可以不重叠。
--这要看,是谁设计电路了。
9.在中断响应时断点地址自动入栈
--对。
‘肆’ 求解几道MCS51单片机的答案
11. C51 中,若定义8 位有符号类型的变量,可定义为 char 型变量,其值域为 -128~127 ;unsigned int 型变量的长度为 无符号整型 ,其值域为 0~65535 。5. 若MCS-51 晶振频率为12MHz,则T0 工作于计数方式时,可以接受的计数脉冲频率范围为 1000000~1000000/65536 。11.欲对300个外部事件计数,可以选用定时器/计数器T1的模式 0 或模式 1 。 10.MCS-51 单片机的串行口工作于方式0 时用于 同步 移位寄存器。MCS-51单片机串行方式0通信时,数据从 Rxd 引脚发送/接收。
‘伍’ 第八届蓝桥杯单片机组预赛真题解析
第八届蓝桥杯单片机组预赛真题解析如下:
单片机基础知识:
电路分析:
滤波器类型识别:
逻辑门功能:
数电表达式简化:
中断优先级:
地址分配:
数码管消除阴影:
存储区分析:
复位与程序下载:
实验总结: 本部分真题涵盖了定时器、滤波器、中断优先级等多个单片机领域的核心知识点,要求参赛者具备扎实的理论基础和实际应用能力。