单片机设计电压表,自己认为注释比较详细,注释附件里有,小白设计,有不足多多指教。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h> //头文件
- #define uchar unsigned char; //宏定义
- #define uint unsigned int;
- sfr p2=0xa0; //特殊功能寄存器使用
- sfr p3=0xb0; //P2端口所对应的字节地址就是0xA0 一整个P2的8位都在0xA0地址上
- sbit P13=P1^3; //位定义
- sbit P14=P1^4;
- sbit P12=P1^2;
- sbit P15=P1^5;
- sbit P16=P1^6;
- sbit P17=P1^7;
- sbit P11=P1^1;
- sbit P10=P1^0;
- sbit wr=P3^6;
- sbit rd=P3^7;
- uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
- 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码
- uchar code weima[]= {0x0e,0x0d,0x0b,0x07}; //数码管位码
- uchar w;
- uint i,j,f,z,h;
- uchar tem[]={0,0,0,0};
- void zhuanhuan()
- {
- rd=0; //读操作
- for(i=0;i<10;i++);
-
- wr=0; //写操作
- for(i=0;i<10;i++) //0~9 10个数
- wr=1;
- z=P1; //读回P1
- tem[0]=(P1+1)*5/256; //个位 x=(255.99*5*100+5)/256=500
- tem[1]=(P1+1)*50/256%10; //P1口最大值255 所以P1+1
- tem[2]=(P1+1)*500/256%10;
- tem[3]=(P1+1)*100/256%10;
- if(P1==255)
- {
- tem[2]=0;
- }
-
- if(z==0)
- {
- tem[0]=0;
- tem[1]=0;
- tem[2]=0;
- tem[3]=0;
-
- }
-
-
- }
- void display() //数码管显示函数
- {
- for(w=0;w<4;w++)
- {
- p2=0;
- p2=duanma[tem[w]];
- P3=weima[w];
- if(w==0)
- {
- p2=duanma[tem[w]]+0x80; //个位段码 后加小数点
- P3=weima[w] ; //个位位码
- }
- for(j=0;j<10;j++) ;
-
- }
- }
-
- void main()
- {
- while(1)
- {
- display();
- zhuanhuan();
- }
- }
复制代码
所有资料51hei提供下载:
单片机设计电压表.rar
(154.21 KB, 下载次数: 82)
|