崭新的新人来求教了。我对单片机C语言不是很了解。只学过C语言和单片机技术。
在仿真的时候,不能正确显示LED数字。一直在变化。功率因数输不出去。。。。
求更改、。。
- #include
- #include
- #include
- #define _TH0_TL0_ 65536 - 64536//设置T0的初始值为1MS
- #define _TH1_TL1_ 65536 - 64536//设置T1的初始值为1MS
- #define PI=3.1415927
- unsigned char count1=0;
- unsigned char count2=0;
- unsigned char g4=0;//功率因数第四位
- unsigned char g3=0,g2=0,g1=0;//功率因数第一到三位
- float d=0 ;//功率因数角度弧度表示
- float i;//电压 和电流 之间的相位差, 即β的大小,角度表示?
- char code dis1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
- char code dis2[2]=(0x40,0x79);//带小数点0、1
- sbit p22=P2^2;//位选
- sbit p23=P2^3;//位选
- sbit p21=P2^1;//位选
- sbit p20=P2^0;//位选
- // 延时子程序
- void delay(int ms)
- {
- char k;
- while(ms--)
- {
- for(k = 0; k < 100; k++);
- }
- }
- //数据处理函数
- void count ()
- { int g=0;
- i=(count1*2*180/(count1+count2));
- d=i*PI/180;
- g=cos(d);
- if(g==1)
- {
- g4=0;
- g3=0;
- g2=0;
- g1=1;
- }
- else
- {
- g=(cos(d)*1000);
- g4=g%100%10;
- g3=g%100/10;
- g2=g/100;
- g1=0;
- }
- }
- //显示函数
- void led()
- {
- P2=0xf1;//显示4位
- P0=dis1[g4];//显示
- delay(10);//延时
- P2=0xf2;//显示3位
- P0=dis1[g3];
- delay(10);
- P2=0xf4;
- P0=dis1[g2];
- delay(10);
- P2=0xf8;
- P0=dis2[g1];
- delay(10);
- }
- //主函数
- void main()
- {
- TMOD=0X99;//定时器模式1
- TCON=0xf4;//定时器控制
- TH0 = _TH0_TL0_ / 256; //将10进制转化为16进制
- TL0 = _TH0_TL0_ % 256;
- TH1 = _TH1_TL1_ / 256; //将10进制转化为16进制
- TL1 = _TH1_TL1_ % 256;
- EX1=1;
- EX0=1;
- ET1=1;
- ET0=1;
- EA=1;
- p22=p23=p21=p20=1;
- P0=0X00;// 显示口
- P2=0Xff;
- while(1)
- {
- count ();//数据处理
- led();//显示
- }
- }
- //T0中断,M个周期的相位差所对应的时间
- void T0_1ms() interrupt 1//计算连续对m 个周期中的τ之和,定时器0中断
- {
- TH0 = _TH0_TL0_ / 256;
- TL0 = _TH0_TL0_ % 256;
- count1++;
- }
-
- //T1中断,
- void T1_1ms() interrupt 3//计算连续对m 个周期中的τ2之和,定时器1中断
- {
- TH0 = _TH0_TL0_ / 256;
- TL0 = _TH0_TL0_ % 256;
- count2++;
- }
- //外中断0NT1,计算周期数
- void int0() interrupt 0 //外中断EX0
- {
- static unsigned char m=0;//对连续M个周期进行数据处理
- EX0=0;
- m++;
- if(m==20)
- {
- m=0;
- EA=0;
- }
- EX0=1;
- }
复制代码
此帖出自
小平头技术问答
一周热门 更多>