[DemoCode下载] 基于N76E003的数码管时钟

[复制链接]
 楼主| dongnanxibei 发表于 2024-6-23 21:15 | 显示全部楼层 |阅读模式
关键词:UART, I2C, 7segments led, EEPROM R/W, RealTime Clock with DS1307
Nuvoton-N76E003-main.zip (71.15 KB, 下载次数: 2)

  1. #include "main.h"

  2. void fn8051ADCBypass (void){
  3.                 unsigned char i;
  4.                 for (i=0;i<0x03;i++){
  5.                                
  6.                                 clr_ADCF;
  7.                                 set_ADCS;
  8.                                 while(ADCF == 0);
  9.                 }
  10. }
  11. void fn8051I2CStart(void){
  12.                 SCL = 1; SCL = 0;
  13.                 SDA = 1; SCL = 1;
  14.                 fn8051SYSDelay(1);
  15.                 SDA = 0; fn8051SYSDelay(1);
  16.                 SCL = 0; fn8051SYSDelay(1);
  17. }
  18. void fn8051I2CStop(void){
  19.                 SCL = 1; SCL = 0;
  20.                 SDA = 0; fn8051SYSDelay(1);
  21.                 SCL = 1; fn8051SYSDelay(1);
  22.                 SDA = 1;
  23. }
  24. bit fn8051I2CWrite(unsigned char dat){
  25.                 unsigned char i;
  26.                 for (i=0;i<8;i++){
  27.                                 SDA = (dat & 0x80) ? 1:0;
  28.                                 SCL=1;SCL=0;
  29.                                 dat<<=1;
  30.                         }
  31.                 SCL = 1; fn8051SYSDelay(1);
  32.                 SCL = 0;
  33.                 return dat;
  34. }
  35. unsigned char fn8051I2CRead(void){
  36.                 bit rd_bit;
  37.                 unsigned char i, dat;
  38.                 dat = 0x00;
  39.                 for(i=0;i<8;i++)                                                                                 /* For loop read data 1 byte */
  40.                 {
  41.                                 fn8051SYSDelay(1);
  42.                                 SCL = 1; fn8051SYSDelay(1);                                 /* Set SCL */
  43.                                 rd_bit = SDA;                                                                                 /* Keep for check acknowledge */
  44.                                 dat = dat<<1;
  45.                                 dat = dat | rd_bit;                                                         /* Keep bit data in dat */
  46.                                 SCL = 0;                                                                                                         /* Clear SCL */
  47.                 }
  48.                 return dat;
  49. }
  50. void fn8051DS1307Out_1Hz()
  51. {
  52.         fn8051I2CStart(); /* Start i2c bus */
  53.         fn8051I2CWrite(0xD0); /* Connect to DS1307 */
  54.         fn8051I2CWrite(0x07);   //RTC pointer location
  55.         fn8051I2CWrite(0x10);
  56.         fn8051I2CStop();
  57. }
  58. unsigned char fn8051DS1307Readdata(unsigned char addr)
  59. {
  60.                 unsigned int temp,ret;
  61.                 fn8051I2CStart();                 /* Start i2c bus */
  62.                 fn8051I2CWrite(0xD0);         /* Connect to DS1307 */
  63.                 fn8051I2CWrite(addr);         /* Request RAM address on DS1307 */
  64.                 fn8051I2CStart();                 /* Start i2c bus */
  65.                 fn8051I2CWrite(0XD1);         /* Connect to DS1307 for Read */
  66.                 ret = fn8051I2CRead();         /* Receive data */
  67.                 fn8051I2CStop();
  68.                 //**********************************************************
  69.                 temp = ret;                                                         /*BCD to HEX*/
  70.                 ret = (((ret/16)*10)+ (temp & 0x0f));         /*for Led 7seg*/
  71.                 //**********************************************************
  72.                 return ret;
  73. }
  74. void fn8051DS1307Writedata(unsigned char addr,unsigned char dat)
  75. {
  76.                 unsigned int temp;
  77.                 //**********************************************
  78.                 temp = dat ;                                                 /*HEX to BCD*/
  79.                 dat = (((dat/10)*16)|(temp %10));         /*for Led 7seg*/
  80.                 //**********************************************
  81.                 fn8051I2CStart()
  82.         ;                 /* Start i2c bus */
  83.                 fn8051I2CWrite(0XD0);         /* Connect to DS1307 */
  84.                 fn8051I2CWrite(addr);         /* Request RAM address on DS1307 */
  85.                 fn8051I2CWrite(dat);         /* Connect to DS1307 for Read */
  86.                 fn8051I2CStop();
  87. }
  88. void fn8051DS1307ReadTime()
  89. {
  90.                 vrcGlb8051DS1307Sec  = fn8051DS1307Readdata(SEC);
  91.                 vrcGlb8051DS1307Min  = fn8051DS1307Readdata(MIN);
  92.                 vrcGlb8051DS1307Hour = fn8051DS1307Readdata(HOUR);
  93. }
  94. void fn8051DS1307WriteTime()
  95. {
  96.                 fn8051DS1307Writedata(SEC,vrcGlb8051DS1307Sec);
  97.                 fn8051DS1307Writedata(MIN,vrcGlb8051DS1307Min);
  98.                 fn8051DS1307Writedata(HOUR,vrcGlb8051DS1307Hour);
  99. }
  100. int main (){
  101.                 Set_All_GPIO_Quasi_Mode;
  102.                 fn8051ITRRegSettup();
  103.                 fn8051DS1307Out_1Hz();
  104.                 //fn8051ADCBypass();
  105.                 do{
  106.                                 fn80517segledSenddt595(0x92,1,0);
  107.                                 fn8051SYSDelay(5);
  108.                                 fn80517segledSenddt595(0x06,2,0);
  109.                                 fn8051SYSDelay(5);
  110.                                 fn80517segledSenddt595(0xc7,3,0);
  111.                                 fn8051SYSDelay(5);
  112.                                 fn80517segledSenddt595(0x06,4,0);
  113.                                 fn8051SYSDelay(5);
  114.                                 }while(pni8051ButtonSeclect!=0);
  115.                                 fn8051SYSModeselect();
  116.                 while(1){
  117.                                 if(vrucGlb8051SYSChangemode == 0){
  118.                                                 while(vrucGlb8051SYSCurrentmode==1&&vrucGlb8051SYSChangemode==0){
  119.                                                                 fn80517segledFloatdisplay(vrfGlb8051ADCVadcP05);
  120.                                                                 if((pni8051ButtonSeclect)==0&(pni8051ButtonDown==0)) {
  121.                                                                                 vrucGlb8051SYSChangemode = 1;       
  122.                                                                         }

  123.                                         }
  124.                                 while((vrucGlb8051SYSCurrentmode==2)&(vrucGlb8051SYSChangemode==0)){
  125.                                                                 ET1 = 1;
  126.                                                                 fn8051DS1307ReadTime();
  127.                                                                 if((pni8051ButtonSeclect)==0&(pni8051ButtonDown==0)) {
  128.                                                                                 vrucGlb8051SYSChangemode = 1;
  129.                                                                                 ET1 = 0;
  130.                                                                                         }
  131.                                                                 if((pni8051ButtonSeclect)==0&(pni8051ButtonUp==0)) {
  132.                                                                                 fn8051SYSDelay(500);
  133.                                                                                 if((pni8051ButtonSeclect)==0&(pni8051ButtonUp==0)){
  134.                                                                                                 fn8051DS1307timesetup();
  135.                                                                                                         }
  136.                                                                                         }
  137.                                                                 if(pni8051ButtonSeclect ==0){
  138.                                                                                 fn8051SYSDelay(2000);
  139.                                                                                 if(pni8051ButtonSeclect ==0){
  140.                                                                                                 fn8051APROMwriteTime();
  141.                                                                                                         }
  142.                                                                                 }       
  143.                                                         }
  144.                                 while(vrucGlb8051SYSCurrentmode==3&&vrucGlb8051SYSChangemode==0){
  145.                                                 fn8051APROMReadandDisplay();
  146.                                                                 if((pni8051ButtonSeclect==0)&(pni8051ButtonDown==0)) {
  147.                                                                                 vrucGlb8051SYSChangemode = 1;       
  148.                                                                         }
  149.                                                                 if(pni8051ButtonSeclect ==0){
  150.                                                                                 fn8051SYSDelay(2000);
  151.                                                                                 if(pni8051ButtonSeclect ==0){
  152.                                                                                                 fn8051APROMWriteADC();
  153.                                                                                                         }
  154.                                                                                 }       
  155.                                                         }
  156.                                 }
  157.                                 else{
  158.                                                 while(vrucGlb8051SYSChangemode == 1){
  159.                                                                         fn8051SYSModeselect();
  160.                                                                         }
  161.                                         }
  162.                         }
  163. }       
  164. void fn8051ITRRegSettup (){
  165.                 TMOD = 0x11;
  166.                 TH0 = 0xC1;
  167.                 TL0 = 0x80;
  168.                 TH1 = 0xE0;
  169.                 TL1 = 0xC0;
  170.                 set_T0M;
  171.                 ET0 = 1;
  172.                 EA  = 1;
  173.                 TR0 = 1;
  174.                 TF0 = 0;
  175.                 TF1 = 0;
  176.                 TR1 = 1;
  177. }
  178. void  fn8051ITRVector1(void) interrupt 1{ //timer 1ms
  179.                 unsigned int vri8051LedblinkCount ;
  180.                 unsigned int vruc8051ADCAdctimer1 ;
  181.           vri8051LedblinkCount++;
  182.                 if(vri8051LedblinkCount >1000){ //timer 1 s
  183.                 pnobl8051ledalert = ~pnobl8051ledalert;
  184.                 vri8051LedblinkCount = 0;
  185.                 }
  186.                 if(vrucGlb8051SYSCurrentmode == 1){
  187.                                 if(ADCS == 1) {vruc8051ADCAdctimer1 = 0;}
  188.                                 else{
  189.                                 vruc8051ADCAdctimer1++;
  190.                                 if(vruc8051ADCAdctimer1 > 100) {
  191.                                                 fn8051ADCAdcmain();
  192.                                                 vruc8051ADCAdctimer1=0;
  193.                                                 }
  194.                         }
  195.                 }
  196.                 //TF0 = 0;
  197.                 TH0 = 0xC1;
  198.                 TL0 = 0x80;
  199. }
  200. void  fn8051ITRVector3(void) interrupt 3{ //timer 0,5ms
  201.                 unsigned char vruc8051DS1307indexcounter;
  202.                         signed char hour1,hour2,min3,min4;
  203.                 vruc8051DS1307indexcounter++;
  204.                 if(vruc8051DS1307indexcounter>1){
  205.                                 vrucGlb8051DS1307Led_ctrlindex--;
  206.                                 vruc8051DS1307indexcounter = 0;
  207.                                 if(vrucGlb8051DS1307Led_ctrlindex<1){vrucGlb8051DS1307Led_ctrlindex = 4;}
  208.                         }
  209.                 if(vrcGlb8051DS1307Hour<10){
  210.                                 hour1 = 0;
  211.                                 hour2 = vrcGlb8051DS1307Hour;
  212.                                                 }
  213.                 else{
  214.                                 hour1 = vrcGlb8051DS1307Hour/10;
  215.                                 hour2 = vrcGlb8051DS1307Hour-(hour1*10);                        
  216.                                                 }
  217.                 if(vrcGlb8051DS1307Min<10){
  218.                                 min4 = vrcGlb8051DS1307Min ;
  219.                                 min3 = 0;
  220.                                                 }
  221.                 else{
  222.                                 min3 = vrcGlb8051DS1307Min/10;
  223.                                 min4 = vrcGlb8051DS1307Min-(min3*10);                     
  224.                                                 }       
  225.                 if (vrucGlb8051DS1307Led_ctrlindex ==1){
  226.                                 fn80517segledSenddt595(vraGlb80517segledcharacter[hour1],vrucGlb8051DS1307Led_ctrlindex,0);
  227.                                         }
  228.                 if (vrucGlb8051DS1307Led_ctrlindex ==2){
  229.                                 fn80517segledSenddt595(vraGlb80517segledcharacter[hour2],vrucGlb8051DS1307Led_ctrlindex,1);
  230.                                         }
  231.                 if (vrucGlb8051DS1307Led_ctrlindex ==3){
  232.                                 fn80517segledSenddt595(vraGlb80517segledcharacter[min3],vrucGlb8051DS1307Led_ctrlindex,0);
  233.                                         }
  234.                 if (vrucGlb8051DS1307Led_ctrlindex ==4){
  235.                                 fn80517segledSenddt595(vraGlb80517segledcharacter[min4],vrucGlb8051DS1307Led_ctrlindex,1);
  236.                                         }       
  237.                 TH1 = 0xF9;
  238.                 TL1 = 0xC0;
  239. }
  240. void fn8051SYSDelay(signed int time){//delay 1ms
  241.         signed int t,c;
  242.         for(c=0;c<time;c++){
  243.                  for(t=0;t<1600;t++){         
  244.                                         }
  245.                 }
  246. }               
  247. signed char fn8051ButtonBTread(){
  248.         if (pni8051ButtonDown==0){
  249.                 fn8051SYSDelay(100);
  250.                 return -1;
  251.                 }
  252.         if (pni8051ButtonUp==0){
  253.                 fn8051SYSDelay(100);
  254.                 return 1;
  255.                 }                                                               
  256.         else return 0;
  257. }
  258. void fn8051SYSModeselect(){
  259.         fn8051SYSDelay(200);
  260.         while(pni8051ButtonSeclect!=0){
  261.                 vrucGlb8051SYSCurrentmode += fn8051ButtonBTread();
  262.                 if (vrucGlb8051SYSCurrentmode>3) {vrucGlb8051SYSCurrentmode = 1;}
  263.                 if (vrucGlb8051SYSCurrentmode<1) {vrucGlb8051SYSCurrentmode = 3;}
  264.                 fn80517segledSenddt595(vraGlb80517segledcharacter[0],3,1);
  265.                 fn8051SYSDelay(5);
  266.                 fn80517segledSenddt595(vraGlb80517segledcharacter[vrucGlb8051SYSCurrentmode],4,0);
  267.                 fn8051SYSDelay(5);
  268.                 }
  269.         vrucGlb8051SYSChangemode = 0;
  270. }
  271. void fn80517segledSenddt595(unsigned char vruc80517segleddata,signed char vrc80517segselectled, char dotpoint ){ //7segment led display by timer
  272.                 unsigned char i,Q;
  273.                 Q = vruc80517segleddata;
  274.                 for(i=0;i<8;i++){
  275.                                 if((dotpoint==1)&(i==0)){pnoGlb80517segmentSDI=0;}
  276.                                 else
  277.                                 pnoGlb80517segmentSDI = Q & (0x80>>i);
  278.                                 pnoGlb80517segmentCLK = 0;
  279.                                 pnoGlb80517segmentCLK = 1;
  280.                         }
  281.     pnoGlb80517segmentSTR = 0;
  282.                 pnoGlb80517segmentSTR = 1;
  283.                 if(vrc80517segselectled == 1 ){                       
  284.                                 pnobl80517segledCtr_L1 = 1;
  285.                                 pnobl80517segledCtr_L2 = pnobl80517segledCtr_L3 = pnobl80517segledCtr_L4 = 0;
  286.                 }
  287.                 if(vrc80517segselectled == 2 ){
  288.                                 pnobl80517segledCtr_L2 = 1;
  289.                                 pnobl80517segledCtr_L1 = pnobl80517segledCtr_L3 = pnobl80517segledCtr_L4 = 0;
  290.                 }
  291.                 if(vrc80517segselectled == 3 ){
  292.                                 pnobl80517segledCtr_L3 = 1;               
  293.                                 pnobl80517segledCtr_L1 = pnobl80517segledCtr_L2 = pnobl80517segledCtr_L4 = 0;
  294.                 }
  295.                 if(vrc80517segselectled == 4 )         {
  296.                                 pnobl80517segledCtr_L4 = 1;
  297.                                 pnobl80517segledCtr_L1 = pnobl80517segledCtr_L3 = pnobl80517segledCtr_L2 = 0;
  298.                 }
  299. }
  300. //void fn8051DS1307timedisplay() {                                       
  301. //}
  302. void fn8051DS1307timesetup(){
  303.                 fn80517segledSenddt595(0xff,1,1);
  304.                 vrcGlb8051DS1307Sec  = 0;
  305.                 vrcGlb8051DS1307Hour = 12;
  306.                 vrcGlb8051DS1307Min  = 30;
  307.                 do{
  308.                         vrcGlb8051DS1307Min +=fn8051ButtonBTread();
  309.                         if(vrcGlb8051DS1307Min>59) { vrcGlb8051DS1307Min=0; }
  310.                         if(vrcGlb8051DS1307Min==0) { vrcGlb8051DS1307Min=59; }
  311.                         if(pni8051ButtonSeclect==0) {
  312.                                         fn8051SYSDelay(500);
  313.                                                 }
  314.                                         }while(pni8051ButtonSeclect!=0);
  315.                 do{
  316.                         vrcGlb8051DS1307Hour+=fn8051ButtonBTread();
  317.                         if(vrcGlb8051DS1307Hour==0) { vrcGlb8051DS1307Hour=23; }
  318.                         if(vrcGlb8051DS1307Hour>23){ vrcGlb8051DS1307Hour=0; }
  319.                         if(pni8051ButtonSeclect==0){ fn8051SYSDelay(500);  }
  320.                                         }while(pni8051ButtonSeclect!=0);
  321.                         fn8051DS1307WriteTime();
  322. }
  323. void fn8051APROMwrite(unsigned char vruc80517APROMdata,signed char vruc80517APROMaddress ){ //APROM Write
  324.                 EA = 0;
  325.                 TA = 0xAA;
  326.                 TA = 0x55;
  327.                 CHPCON |= 0x01;
  328.                 TA = 0xAA;
  329.                 TA = 0x55;
  330.                 IAPUEN |= 0x02; //enable LDROM update
  331.                 TA = 0xAA;
  332.                 TA = 0x55;
  333.                 IAPTRG |= 0x01; //trig IAP GO
  334.                 IAPCN = vc8051LDROMByteProgram;
  335.                 IAPAH = 0x00;
  336.                 IAPAL = vruc80517APROMaddress;
  337.                 IAPFD = vruc80517APROMdata;
  338.                 TA = 0xAA;
  339.                 TA = 0x55;
  340.                 IAPTRG |= 0x01; //trig IAP GO
  341.                 TA = 0xAA; //IAPUEN is TA protected
  342.                 TA = 0x55;
  343.                 IAPUEN &= ~0x02; //disable LDROM update
  344.                 TA = 0xAA; //CHPCON is TA protected
  345.                 TA = 0x55;
  346.                 CHPCON &= ~0x01;// disable IAP
  347.                 EA = 1;
  348. }
  349. unsigned char fn8051APROMread(signed char vruc80517APROMaddress){
  350.                 unsigned char Q;
  351.                 EA = 0;
  352.                 TA = 0xAA;
  353.                 TA = 0x55;
  354.                 CHPCON |= 0x01;
  355.                 TA = 0xAA;
  356.                 TA = 0x55;
  357.                 IAPTRG |= 0x01;
  358.                 IAPCN = vc8051LDROMByteRead;
  359.                 IAPAH = 0x00;
  360.                 IAPAL = vruc80517APROMaddress;
  361.                 Q = IAPFD;
  362.                 TA = 0xAA;
  363.                 TA = 0x55;
  364.                 IAPTRG |= 0x01;//write �1� to IAPGO to trigger IAP process
  365.                 TA = 0xAA; //IAPUEN is TA protected
  366.           TA = 0x55;
  367.                 IAPUEN &= ~0x02;
  368.                 TA = 0xAA; //CHPCON is TA protected
  369.                 TA = 0x55;
  370.                 CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode
  371.                 EA = 1;
  372.                 return Q;
  373. }
  374. void fn8051APROMwriteTime(){
  375.                         signed char hour1,hour2,min3,min4;
  376.                 if(vrcGlb8051DS1307Hour<10){
  377.                                 hour1 = 0;
  378.                                 hour2 = vrcGlb8051DS1307Hour;
  379.                                                 }
  380.                 else{
  381.                                 hour1 = vrcGlb8051DS1307Hour/10;
  382.                                 hour2 = vrcGlb8051DS1307Hour-(hour1*10);                        
  383.                                                 }
  384.                 if(vrcGlb8051DS1307Min<10){
  385.                                 min4 = vrcGlb8051DS1307Min ;
  386.                                 min3 = 0;
  387.                                                 }
  388.                 else{
  389.                                 min3 = vrcGlb8051DS1307Min/10;
  390.                                 min4 = vrcGlb8051DS1307Min-(min3*10);                     
  391.                                                 }
  392.                 EA = 0;
  393.                 TA = 0xAA; //TA protect
  394.                 TA = 0x55;
  395.                 CHPCON |= 0x01; //enable IAP
  396.                 TA = 0xAA;
  397.                 TA = 0x55;
  398.                 IAPUEN |= 0x02; //enable LDROM update
  399.                 IAPCN = vc8051LDROMPageErase;
  400.                 IAPAH = 0x00;
  401.                 IAPAL = 0x00;
  402.                 IAPFD = 0xff;
  403.                 fn8051APROMwrite(hour1,0x00);
  404.                 fn8051APROMwrite(hour2,0x01);
  405.                 fn8051APROMwrite(min3,0x02);
  406.                 fn8051APROMwrite(min4,0x03);
  407.                 EA =1 ;       
  408. }
  409. void fn8051APROMReadandDisplay(){
  410.                 char i,vrc8051APROMNguyen,vrc8051APROMTPhan1,vrc8051APROMTPhan2;
  411.                 unsigned char vrc8051APROMmode =0;
  412.                 vrc8051APROMmode+=fn8051ButtonBTread();
  413.                 if(vrc8051APROMmode>1) {vrc8051APROMmode = 0;}
  414.                 if(vrc8051APROMmode == 0){
  415.                         for(i=1;i<5;i++){
  416.                                         fn80517segledSenddt595(vraGlb80517segledcharacter[fn8051APROMread(0x00+i-1)],i,0);
  417.                                         fn8051SYSDelay(4);
  418.                                         }
  419.                                 }
  420.                 if(vrc8051APROMmode == 1){
  421.                         vrc8051APROMNguyen = fn8051APROMread(0x04);
  422.                         vrc8051APROMTPhan1 = fn8051APROMread(0x05);
  423.                         vrc8051APROMTPhan2 = fn8051APROMread(0x06);
  424.                         fn80517segledSenddt595(vraGlb80517segledcharacter[vrc8051APROMNguyen],i,1);
  425.                         fn8051SYSDelay(4);
  426.                         fn80517segledSenddt595(vraGlb80517segledcharacter[vrc8051APROMTPhan1],i,0);
  427.                         fn8051SYSDelay(4);
  428.                         fn80517segledSenddt595(vraGlb80517segledcharacter[vrc8051APROMTPhan2],i,0);
  429.                         fn8051SYSDelay(4);                       
  430.                 }
  431.                
  432. }
  433. void fn80517segledFloatdisplay(float vrf80517segledFin){
  434.                 float Q;
  435.                 unsigned char nguyen,tphan1,tphan2;
  436.                 Q = vrf80517segledFin;
  437.                 nguyen = (unsigned char)(Q/1000);
  438.                 tphan1 = (unsigned char)((Q - nguyen*1000)/100);
  439.                 tphan2 = (unsigned char)((Q - (nguyen*1000+tphan1*100))/10);
  440.                 fn80517segledSenddt595(vraGlb80517segledcharacter[nguyen],2,1);
  441.                 fn8051SYSDelay(3);
  442.                 fn80517segledSenddt595(vraGlb80517segledcharacter[tphan1],3,0);
  443.                 fn8051SYSDelay(3);
  444.                 fn80517segledSenddt595(vraGlb80517segledcharacter[tphan2],4,0);
  445.                 fn8051SYSDelay(3);
  446. }
  447. void fn8051ADCRead_bandgap(){ //IAP read
  448.                 unsigned char BandgapHigh,BandgapLow,BandgapMark;       
  449.                 float Bandgap_Value,Bandgap_Voltage_Temp;
  450.                 set_IAPEN;
  451.                 IAPCN = 0x04;
  452.                 IAPAL = 0x0d;
  453.     IAPAH = 0x00;
  454.     set_IAPGO;
  455.                 BandgapLow  = IAPFD;
  456.                 BandgapMark = BandgapLow&0xF0;
  457.                        
  458.                 if (BandgapMark==0x80)
  459.                 {
  460.                                 BandgapLow = BandgapLow&0x0F;
  461.                                 IAPAL = 0x0C;
  462.                                 IAPAH = 0x00;
  463.                                 set_IAPGO;
  464.                                 BandgapHigh = IAPFD;
  465.                                 Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
  466.                                 Bandgap_Voltage_Temp = Bandgap_Value*3/4;
  467.                 }
  468.                 if (BandgapMark==0x00)
  469.                 {
  470.                                 BandgapLow = BandgapLow&0x0F;
  471.                                 IAPAL = 0x0C;
  472.                                 IAPAH = 0x00;
  473.                                 set_IAPGO;
  474.                                 BandgapHigh = IAPFD;
  475.                                 Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
  476.                                 vrfGlb8051ADCBandgap_Voltage= Bandgap_Value*3/4;
  477.                 }
  478.                 if (BandgapMark==0x90)
  479.                 {
  480.                                 IAPAL = 0x0E;
  481.                                 IAPAH = 0x00;
  482.                                 set_IAPGO;
  483.                                 BandgapHigh = IAPFD;
  484.                                 IAPAL = 0x0F;
  485.                                 IAPAH = 0x00;
  486.                                 set_IAPGO;
  487.                                 BandgapLow = IAPFD;
  488.                                 BandgapLow = BandgapLow&0x0F;
  489.                                 Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
  490.                                 vrfGlb8051ADCBandgap_Voltage= Bandgap_Value*3/4;
  491.                 }
  492.                 clr_IAPEN;
  493.         }
  494. void fn8051ADCAdcmain(){
  495.                 float bandgapvalue,VDD,VAIN,ADCvalue;
  496.                 //fn8051ADCBypass();
  497.                 fn8051ADCRead_bandgap();
  498.                 ADCCON0 = 0x08;
  499.                 ADCCON1 = 0x01;
  500.                 clr_ADCF;
  501.                 set_ADCS;
  502.                 while(ADCF == 0){};
  503.                 bandgapvalue = (ADCRH<<4) + ADCRL;
  504.                 VDD = (0xFFF/bandgapvalue)*vrfGlb8051ADCBandgap_Voltage;
  505.                 Disable_ADC;
  506.                 ADCCON0 = 0x04;
  507.                 ADCCON1 = 0x01;
  508.                 //ADCCON2 = 0x00;
  509.                 //AINDIDS = 0xEF;
  510.                 clr_ADCF;
  511.                 set_ADCS;
  512.                 while(ADCF == 0){};
  513.                 ADCvalue = (ADCRH<<4) + ADCRL;
  514.                 VAIN = (float)ADCvalue/0x1000;
  515.                 vrfGlb8051ADCVadcP05 = (float)(VAIN*VDD);
  516.                 Disable_ADC;
  517. }
  518. void fn8051APROMWriteADC(){
  519.                 float Q;
  520.                 unsigned char nguyen,tphan1,tphan2;
  521.                 Q = vrfGlb8051ADCVadcP05;
  522.                 nguyen = (unsigned char)(Q/1000);
  523.                 tphan1 = (unsigned char)((Q - nguyen*1000)/100);
  524.                 tphan2 = (unsigned char)((Q - (nguyen*1000+tphan1*100))/10);
  525.                 fn8051APROMwrite(nguyen,0x04);
  526.                 fn8051APROMwrite(tphan1,0x05);
  527.                 fn8051APROMwrite(tphan2,0x06);
  528. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

3848

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部