仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "reg51.h"
- #define uint8 unsigned short int
- uint8 i,k;
- /****** ??????? *******/
- void delay_us(int t)
- {
- i = t;
- while(i--)
- {}
- }
- /*******************************/
- /************************************* ????? **************************************/
- uint8 code smg_data[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//?????????(0-9????)
- uint8 smg7,smg6,smg5,smg4,smg3,smg2,smg1,smg0;//???????:???????...???
- //?????????
- void smg(int a)
- {
- smg0 = 8;
- smg1 = 6;
- smg2 = 6;
- smg3 = (a%100000)/10000;
- smg4 = (a%10000)/1000;//??????
- smg5 = (a%1000)/100;//??????
- smg6 = (a%100)/10;//??????
- smg7 = a%10;//??????
- P2 = 0xf7;//1111 0000???8????
- P0 = smg_data[smg7];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- P2 = 0xf6;//1111 0000???7????
- P0 = smg_data[smg6];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- P2 = 0xf5;//1111 0000???6????
- P0 = smg_data[smg5];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- P2 = 0xf4;//1111 0000???5????
- P0 = smg_data[smg4];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- P2 = 0xf3;//1111 0000???4????
- P0 = smg_data[smg3];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- P2 = 0xf2;//1111 0001???3????
- P0 = smg_data[smg2];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- P2 = 0xf1;//1111 0010???2????
- P0 = smg_data[smg1];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- P2 = 0xf0;//1111 0011???1????
- P0 = smg_data[smg0];
- delay_us(200);
- P0 = smg_data[10];//?????
- delay_us(10);
- }
- /****************************************************************************************/
- /********** ????? ***********/
- int count = 0;//????????
- //???????,?????1??
- void single_in() interrupt 2
- {
- count++;//??????,???1
- }
- /***********************************/
- /******************* ??????? ********************/
- uint8 flag = 1;//??????????
- uint8 time0_num = 0;//???0????
- int fr_cest = 0;//????
- void timer0() interrupt 1
- {
- TH0 = 0x3c;//???0????,?????50??,65536-50000=3cb0
- TL0 = 0xb0;
- time0_num++;//???0????
- if(time0_num>=20&&flag==0)//???0????20?,???1?,??????
- {
- EX1 = 0;//??????,??????
- fr_cest = count;//????
- time0_num = 0;//???0?????0
- flag = 1;//??????
- }
- else if(time0_num>=20&&flag==1)
- {
- EX1 = 1;//??????,?????
- count = 0;//??????0
- time0_num = 0;//???0?????0
- flag = 0;//???????
- }
- }
- /*********************************************************/
- /**************************** ????? ******************************/
- void interrupt_init()
- {
- TMOD = 0x11; //0001 0001 T1????0 T1?????? 01,T1????1 T0????0 T0?????? 01,T0????1
- TCON = 0x14; //0001 0100 T1????0 T1???? T0????0 T0???? ??1????0 ??1????? ??0????0 ??0????
- IP = 0x09; //0000 1001 -- -- -- ????????? T1??????? ????1????? T0??????? ????0?????
- IE = 0x86; //1000 0110 ????? -- -- ?????? ??T1?? ??????1 ??T0?? ??????0
- }
- /***********************************************************************/
- void main()
- {
- interrupt_init();//?????
- while(1)
- {
- if(flag==1)
- {
- if(fr_cest>10000)
- {
- P1 = 0x01;
- }
- else if(fr_cest<100)
- {
- P1 = 0x04;
- }
- else
- {
- P1 = 0x00;
- }
- smg(fr_cest);
- }
- else
- {
- P1 = 0x02;
- }
- }
- }
复制代码
所有资料51hei附件下载:
基于单片机频率计的设计.7z
(79.81 KB, 下载次数: 11)
|