自己的第一个单片机程序
2015-11-27 20:37
344 查看
在这个星期,心血来潮,完成了单片机的大作业,设计一个红绿灯的交互式的C语言的程序,写到单片机里,就可以实现红绿灯的来回亮灭,这次写博客是为了分享我自己设计的程序,里面一定会有一些不足,正式上交的时候会改正的,以下是程序:
<pre name="code" class="cpp">#include<stc89.h> //我用的专门的stc芯片的库,没有的可以用reg52.h
void delay (unsigned char x) //延时函数
{
unsigned char i,j,k;
for(i=0;i<=x;i++)
for(j=0;j<=250;j++)
for(k=0;k<=100;k++);
}
void NumberLight (unsigned char x) //数码管计数
{
switch(x)
{
case 0:
P2=0x03;
break;
case 1:
P2=0x9f;
break;
case 2:
P2=0x24;
break;
case 3:
P2=0x0c;
break;
case 4:
P2=0x99;
break;
case 5:
P2=0x48;
break;
case 6:
P2=0x40;
break;
case 7:
P2=0x1f;
break;
case 8:
P2=0x00;
break;
case 9:
P2=0x08;
break;
}
}
void CountLight(unsigned char x)
{
unsigned char i;
for(i=x;i>0;i--)
{
NumberLight(i);
delay(10);
}
NumberLight(0);
delay(10);
}
void GreenOn(unsigned char n) //控制绿灯亮,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7e;
break;
case 2:
P1=0xdb;
break;
}
}
void YellowOn(unsigned char n) //控制黄灯亮,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7d;
break;
case 2:
P1=0xbb;
break;
}
}
void GreenFlash(unsigned char n) //控制绿灯闪烁,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7f;
NumberLight(3);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(2);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(1);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(0);
delay(10);
GreenOn(1);
delay(10);
break;
case 2:
P1=0xfb;
NumberLight(3);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(2);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(1);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(0);
delay(10);
GreenOn(2);
delay(10);
break;
}
}
void NanBei()
//南北向通行流程
{
GreenOn(1);
CountLight(9);
GreenFlash(1);
YellowOn(1);
CountLight(3);
}
void DongXi()
//东西向通行流程
{
GreenOn(2);
CountLight(9);
GreenFlash(2);
YellowOn(2);
CountLight(3);
}
void main()
{
//硬件自检,检查硬件的可用性
P1=0x00;
P2=0x00;
delay(40);
//红绿灯工作状态的循环
while(1)
{
NanBei(); //南北向通行
DongXi(); //东西向通行
}
}
PS:单片机的P1口是管理的红绿灯,P2口是管理的数码管显示数字,数码管是共阳极,且引脚g-a接在了P3的1-7上,儿红绿灯用的是P1口上的LED,分别是0-2口和5-7口上的,灯的闪烁用的是程序控制,没有做到精确的时间控制,以后会把单片机的时间控制加上,还有外部中断的实现也会加上的。
<pre name="code" class="cpp">#include<stc89.h> //我用的专门的stc芯片的库,没有的可以用reg52.h
void delay (unsigned char x) //延时函数
{
unsigned char i,j,k;
for(i=0;i<=x;i++)
for(j=0;j<=250;j++)
for(k=0;k<=100;k++);
}
void NumberLight (unsigned char x) //数码管计数
{
switch(x)
{
case 0:
P2=0x03;
break;
case 1:
P2=0x9f;
break;
case 2:
P2=0x24;
break;
case 3:
P2=0x0c;
break;
case 4:
P2=0x99;
break;
case 5:
P2=0x48;
break;
case 6:
P2=0x40;
break;
case 7:
P2=0x1f;
break;
case 8:
P2=0x00;
break;
case 9:
P2=0x08;
break;
}
}
void CountLight(unsigned char x)
{
unsigned char i;
for(i=x;i>0;i--)
{
NumberLight(i);
delay(10);
}
NumberLight(0);
delay(10);
}
void GreenOn(unsigned char n) //控制绿灯亮,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7e;
break;
case 2:
P1=0xdb;
break;
}
}
void YellowOn(unsigned char n) //控制黄灯亮,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7d;
break;
case 2:
P1=0xbb;
break;
}
}
void GreenFlash(unsigned char n) //控制绿灯闪烁,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7f;
NumberLight(3);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(2);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(1);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(0);
delay(10);
GreenOn(1);
delay(10);
break;
case 2:
P1=0xfb;
NumberLight(3);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(2);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(1);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(0);
delay(10);
GreenOn(2);
delay(10);
break;
}
}
void NanBei()
//南北向通行流程
{
GreenOn(1);
CountLight(9);
GreenFlash(1);
YellowOn(1);
CountLight(3);
}
void DongXi()
//东西向通行流程
{
GreenOn(2);
CountLight(9);
GreenFlash(2);
YellowOn(2);
CountLight(3);
}
void main()
{
//硬件自检,检查硬件的可用性
P1=0x00;
P2=0x00;
delay(40);
//红绿灯工作状态的循环
while(1)
{
NanBei(); //南北向通行
DongXi(); //东西向通行
}
}
PS:单片机的P1口是管理的红绿灯,P2口是管理的数码管显示数字,数码管是共阳极,且引脚g-a接在了P3的1-7上,儿红绿灯用的是P1口上的LED,分别是0-2口和5-7口上的,灯的闪烁用的是程序控制,没有做到精确的时间控制,以后会把单片机的时间控制加上,还有外部中断的实现也会加上的。
相关文章推荐
- Ubuntu 安装 cscope 和 ctags
- Cmd命令行编译c#文件
- 搞不定linux下的无线网卡驱动的权宜之计
- net-snmp源码VS2013编译添加加密支持(OpenSSL)
- 第13周—项目4 Floyd算法验证
- 冒泡排序函数,可以给任意类型的数据排序,比如整形数组,字符数组,字符串数组等
- iOS开发49-iOS Mac OS X Openfire的安装与卸载
- NavigationController
- javascript的navigator对象
- 异步流程控制库GoWithTheFlow
- 源码解析EventBus
- 1008. Elevator (20)
- [BZOJ1787][Ahoi2008]Meet 紧急集合&&[BZOJ1832][AHOI2008]聚会
- iOS修改tabbar的背景颜色
- 1008. Elevator (20)
- 获得每日,每周,每月的0点和24点的时间戳
- 小刚之问引发的思索
- hdoj Coprime 5072 (容斥原理) 好题***
- 杭电ACM1003
- 阻止资深程序员技术进步的最大敌人就是开始做管理,做管理至少毁了中国90%的好程序员。