|
根据郭师傅的视频一步步走下来的,最终代码如下,郭师傅在视频中用实验板能实现此功能,但我用proteus仿真仿不出来,在线求助。再就是仿真出现图二是什么原因。
单片机源程序如下:
- //实现的功能:第一位亮一,过一秒种后第二位亮二,再过一秒后第三位亮三,然后依次类推
- #include<reg52.h>
- #include<intrins.h> //流水灯的循环移动
- #define uint unsigned int
- #define uchar unsigned char
- uchar temp,aa,numdu,numwe;
- sbit dula=P2^6;//段选
- sbit wela=P2^7;//位选
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar code tablewe[]={ //位的table
- 0xfe,0xfd,0xfb,
- 0xf7,0xef,0xdf};
- //{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- //void delay(uint z); //使用定时器延时
- void main()
- {
- numdu=0;
- numwe=0;
- aa=0;
- TMOD=1;//0x01;确定T0T1的工作方式
- TH0=(65536-50000)/256;//50毫秒产生一次中断
- TL0=(65536-50000)%256;
- EA=1;//开总中断
- ET0=1;//开定时器0中断
- TR0=1;//启动定时器
- /*定时/计数器初始化程序应完成如下工作:
- //对TMOD赋值,以确定T0和T1的工作方式。
- //计算初值,并将其写入TH0、TL0或TH1、TL1.
- //中断方式时,则对IE赋值,开放中断。
- //使TR0或TR1置位,启动定时/计数器定时或计数*/
- while(1)
- {
- // delay(1000);//延时1000毫秒
- // temp=_crol_(temp,1);
- // P1=temp;
- if(aa==10)//200毫秒
- {
- aa=0;
- numdu++;
- if(numdu==7)
- numdu=1;
- dula=1;
- P0=table[numdu];
- dula=0;
- wela=1;
- P0=tablewe[numwe];
- wela=0;
- numwe++;
- if(numwe==6)
- numwe=0;
- }
- }
- }
- //void delay(uint z)
- //{
- // uint x,y;
- // for(x=z;x>0;x--)
- // for(y=110;y>0;y--);
- //}
- void timer0() interrupt 1
- /*51单片机中using使用在C51编程中,
- 用来在中断函数中指定工作寄存器区,
- 工作寄存器共有4个区,分别代表R0~R7地址是:
- 第0工作区:00H~07H
- 第1工作区:08H~0FH
- 第2工作区:10H~17H
- 第3工作区:18H~1FH
- using n,那么n就是第几区,使用方法如下:
- void exterint0() interrupt 0 using 1
- 这表示外部中断0使用第1工作区地址。*/
- {
- TH0=(65536-50000)/256;//5毫秒产生一次中断
- TL0=(65536-50000)%256;
- aa++;
- // if(aa==40)//2秒
- // {
- // aa=0;
- // num++;//num不需初始化,默认为0
- // if(num==16)
- // num=0;
- // dula=1;
- // P0=table[num];
- // dula=0;
- // }
- }
复制代码
|
|