|
樓主 |
發表於 2012-11-10 15:33:38
|
顯示全部樓層
xiaolaba 發表於 2012-11-10 03:29 PM static/image/common/back.gif
code 1775 = 1775 / 1024 = 1.73K ROM
請問你有沒有試過燒到 AT89C2051, 可用嗎. 因為記得 2051 號好像 ...
xiaolaba大:
哈哈哈!! 有燒進去而且可以動作!!(但是 動作不良!!) 閃爍 無法歸零 ...幫我看看如何!!
/*-----------------------------------------------
7段顯示共陰 電感計 89C2051用
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include<intrins.h>
bit OVERFLOWFLAG;
bit TIMERFLAG;
unsigned int LVint;
#define DataPort P1//P0.0~P0.7 七段顯示的段顯示(共陰極)
#define DrivePort P3//驅動共陰極顯示器
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰7段值0~9
//unsigned char code dofly_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽7段值0~9
unsigned char code dofly_WeiMa[4]={ 0xfe,0xfd,0xfb,0xf7};//共陰位碼1>>秒, 位碼2>>10秒,位碼3>>分, 位碼4>>10分,
//unsigned char code dofly_WeiMa[8]={ 0x01,0x02,0x04,0x08, 0x01,0x02,0x04,0x08 };//{ 0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80 };//共陽位碼1>>秒, 位碼2>>10秒,位碼3>>分, 位碼4>>10分,
unsigned char TempData[4]; //存??示值的全局?量,把段碼的資料存到要顯示的緩衝器上面,利用類似查表的對應方式,送出至顯示器. TempData[ ] 是放置要顯示的7段資料
void Display_Data_Operation(void);
void Display(char n,char Num);
/*------------------------------------------------
定时器0初始化子程序
本程序用于计数
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01 | 0x04; //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0x00; //给定初值
TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器1初始化子程序
本程序用于定时
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x20; //使用模式2,8位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(256-230); //给定初值,这里使用定时器最大值从0开始计数一直到256溢出自動重載
TL1=(256-230);
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
/*------------------------------------------------
定时器0中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=00; //重新给定初值
TL0=00;
OVERFLOWFLAG=1; //溢出标志
}
/*------------------------------------------------
定时器1中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
static unsigned int i;//自動載入模式
i++;
if(i==400) //100ms 计数时间单位,得出100ms脉冲个数 x10就是1s中脉冲个数,即为频率 Hz
{
i=0;
TR0=0; //2个定时器关闭
TR1=0;
TIMERFLAG=1; //标志位清零
}
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
unsigned long int a;
float sq,LV;
Init_Timer0(); //初始化定时器0
Init_Timer1(); //初始化定时器1
while(1)
{
if(TIMERFLAG) //定时100ms到,做数据处理
{
a=TL0+TH0*256;//读取计数值
a=a*25; //扩大到实际值把顯示的值作校正同實際頻率 25.6
sq=(a/1000)*(a/1000);//這很重要,不能改成 (a*a/1000000)
LV=(1000000/(sq*39.4*0.001))-77;//顯示成微亨利單位
LVint=LV;//change to 整數
Display_Data_Operation();//把 電感值LV轉成顯示
TR0=1; //2个定时器打开
TR1=1;
TH0=0; //保证计数器初值为0
TL0=0;
TIMERFLAG=0; //打开计时计数标志
Display(0,4);
}
Display(0,4);
}
}
//--------------------------------------------------------------------------------------------
void Display_Data_Operation(void)//以時間分秒為共同語言, 數字轉換成7段顯示
{
TempData[3]=dofly_DuanMa[LVint/1000];
if(LVint<1000)//去零顯示
TempData[3]=0;
TempData[2]=dofly_DuanMa[LVint%1000/100];//
if(LVint<100)
TempData[2]=0;
TempData[1]=dofly_DuanMa[LVint%100/10];//
TempData[0]=dofly_DuanMa[LVint%10];//
Display(0,4);
}
//--------------------------------------------------------------------------------------------
void Display(char n,char Num)// 把七段顯示出去,假如Startflag==1 則輸出RELAY,已經不管controlBit了 0516
{
unsigned char i;
unsigned char j;
n=0;
for(i=0;i<Num;i++)
{
DataPort= TempData; //
DrivePort= dofly_WeiMa[i+j];
DelayMs(15); //減少閃爍
DataPort=0;
}
}
|
|