单片机实验编程
要利用89C51单片机,8个数码管显示,设计一个简易的计算器,只需实现加减功能即可,但要可以算出负数,小数点结果,要用汇编语言,烦请哪位高人指点。程序可直接发我邮箱932259887@qq.com。给分放心!
LED灯方面的元器件不是很复杂,之前说了很多,也差不多,只是灯不一样。
51单片机
电容
瓷片电容
晶振
绿色二极管
红色二极管
黄色二极管
电阻
- 2
电路图:
1为总体图,2,3为大图
PS:图要是不会画也可以评论提问。。
END
程序清单
说明分析(不想看请直接跳往下一步):通过思考我们发现灯的循环大致分为
1、横向绿灯亮,竖向红灯亮
2、横向黄灯闪三下,竖向红灯依旧亮
3、横向红灯亮,竖向绿灯亮
4、横向红灯依旧亮,竖向黄灯闪三下
由分析我们把程序也分为四个循环
【程序】图片版
按照程序顺序截图,前面是子程序,最后为主程序
【文字版】
/* 名称:LED 模拟交通灯
说明:东西向绿灯亮若干秒,黄灯闪3次后红灯亮, 红灯亮后,
南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁3次后变红灯,
东西向变绿灯,如此重复。*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//规划好各个脚连接的灯,方便使用
sbit RED_1=P0^0; //东西向灯
sbit YELLOW_1=P0^1;
sbit GREEN_1=P0^2;
sbit RED_2=P0^3; //南北向灯
sbit YELLOW_2=P0^4;
sbit GREEN_2=P0^5;
uchar number=0,type=1; //闪烁次数,操作类型变量
//延时子程序
void Delay(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//交通灯切换程序
//总共分为四种情况,如此循环
//注:1为关灯,0为开灯
traffic()
{
switch(type)
{
case 1: //东西向绿灯与南北向红灯亮
RED_1=1;YELLOW_1=1;GREEN_1=0;
RED_2=0;YELLOW_2=1;GREEN_2=1;
Delay(2000);
type=2;
break;
case 2: //东西向黄灯闪烁,绿灯关闭
Delay(300);
YELLOW_1=~YELLOW_1;GREEN_1=1;
if(++number!=6) return; //闪烁3次
number=0;
type=3;
break;
case 3: //东西向红灯,南北向绿灯亮
RED_1=0;YELLOW_1=1;GREEN_1=1;
RED_2=1;YELLOW_2=1;GREEN_2=0;
Delay(2000);
type=4;
break;
case 4: //南北向黄灯闪烁3次
Delay(300);
YELLOW_2=~YELLOW_2;GREEN_2=1;
if(++number!=6) return;
number=0;
type=1;
}
}
//主程序,由于用了switch,为了便于循环选择,用一个traffic子函数写在外面
void main()
{
while(1) traffic();
}
一是这个问题太专业,现在玩单片机和汇编机的都是高手,软硬件两手都要通晓。二是你这个题目较大,相当于一个大作业,工作量不小。个人建议你还是自己完成吧,虽然没有什么实际意义,但这种作业就是培养学生能力的,本事练出来是自己的。越难越复杂的问题解决后,对自己能力和信心的提升越大,对日后的人生越有助力。