單片機光控計數器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (32.83 KB, 下載次數: 80)
下載附件
2018-4-6 23:17 上傳
單片機源程序如下:
- #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)
2018-4-6 20:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|