单片机光控计数器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #define DataPort P2 //定义数据端口 程序中遇到DataPort 则用P0 替换
- sbit LATCH1=P3^5;//定义锁存使能端口 段锁存
- sbit LATCH2=P3^4;// 位锁存
- sbit HW1=P3^2;
- sbit HW2=P3^3;
- sbit led=P1^4;
- sbit qing=P1^2;
- unsigned int num;
- unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
- unsigned char code dofly_WeiMa[]={0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7};//分别对应相应的数码管点亮,即位码,567801234
- unsigned char TempData[8]; //存储显示值的全局变量
- void delay(unsigned int i)
- {
- while(i--);
- }
- void Display(unsigned char FirstBit,unsigned char Num)
- {
-
- unsigned char i;
-
- for(i=0;i<Num;i++)
- {
- DataPort=0; //清空数据,防止有交替重影
- LATCH1=1; //段锁存
- LATCH1=0;
- DataPort=dofly_WeiMa[i+FirstBit]; //取位码
- LATCH2=1; //位锁存
- LATCH2=0;
- DataPort=TempData[i]; //取显示数据,段码
- LATCH1=1; //段锁存
- LATCH1=0;
-
- delay(50); // 扫描间隙延时,时间太长会闪烁,
- //太短会造成重影
- }
- }
- void disp()
- {
- unsigned char j;
-
- for(j=0;j<200;j++)
- { if(j==40)
- {
-
- if(num==100)
- num=0;
- }
- TempData[0]=dofly_DuanMa[num/10];//分解显示信息,
- //如要显示68,则68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
-
- }
- }
- void jia()
- {
- if(HW1==0)
- while(HW2==1) Display(5,2);
- if(HW2==0)
- {
- num++;
- led=0;
- if(num==99)
- num=0;
- }
- while(HW2==0) Display(5,2);
-
- }
- void jian()
- {
- if(HW2==0)
- while(HW1==1) Display(5,2);
- if(HW1==0)
- {
- if(num>0)
- num--;
- led=0;
- if(num==0)
- num=0;
- }
- while(HW1==0) Display(5,2);
-
- }
- void main()
- {
- while(1)
- {
- led=1;
- if(HW1==0)
- jia();
- if(HW2==0)
- jian();
- disp();
- if(qing==0)
- num=0;
- Display(5,2);
- }
- }
复制代码
所有资料51hei提供下载:
实验1.rar
(167.92 KB, 下载次数: 97)
|