protues仿真之数码管消影问题
生活随笔
收集整理的這篇文章主要介紹了
protues仿真之数码管消影问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近因為課程需要,需要做一個基于PCF8591 A/D轉換的數字直流電壓表,精確到小數點后三位。本來一個很簡單的題目,三下五下寫完代碼燒到開發板運行沒多大問題。接下來需要畫出相應的protues仿真電路圖,畫好電路圖加載程序卻出現數碼管顯示不出來的結果。
于是改代碼,檢查電路都沒效果。最終發現是消影語句出的問題。 在開發板上演示時消影語句是:P0=0xff ; 而在protues 上仿真時消影要寫成:P0=0x00 ; 只有這樣程序才能運行正常。下面把整個題目分享出來,有興趣的可以試一下,希望不要有人再掉入這個坑!!
源代碼:
/**********************四位直流數字電壓表************************ 描述:通過調節可調電阻來模擬現實的電壓輸入量,采用PCF8091 A/D 轉換芯片將電壓采樣, 量化后數碼管顯示出電壓值 日期: 2016.10.27 ******************************************************************/ /*-----------------------------------------------名稱:IIC協議 PCF8591ADDA轉換 顯示有4個,注意只有2個可以調節電壓的內容:此程序通過IIC協議對DAAD芯片操作,讀取電位器的電壓通過液晶顯示,并輸出模擬量,用LED亮度漸變指示 ------------------------------------------------*/#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義#include <intrins.h> //包含NOP空指令函數_nop_();#define AddWr 0x90 //寫數據地址 #define AddRd 0x91 //讀數據地址 #define uchar unsigned char #define uint unsigned intsbit RST=P2^4; //時鐘 加上后可以關掉DS1302芯片輸出sbit Sda=P2^0; //定義總線連接端口sbit Scl=P2^1; sbit DU=P2^6; sbit WE=P2^7;bit ADFlag; //定義AD采樣標志位uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x80 }; //0-9&A-F&“不顯示” 字型碼?void stopwatch(uchar ge, uchar z1,uchar z2, uchar z3) ;/*------------------------------------------------延時程序 ------------------------------------------------*/void mDelay(unsigned char j){unsigned int i;for(;j>0;j--){for(i=0;i<125;i++){;}}} /*------------------------------------------------初始化定時器1 ------------------------------------------------*/ void Init_Timer1(void) {TMOD |= 0x10; TH1=0xff; /* Init value */TL1=0x00;//PT1=1; /* 優先級 */EA=1; /* interupt enable */ET1=1; /* enable timer1 interrupt */TR1=1; } /*------------------------------------------------啟動IIC總線 ------------------------------------------------*/void Start(void){Sda=1;_nop_();Scl=1;_nop_();Sda=0;_nop_();Scl=0;}/*------------------------------------------------停止IIC總線 ------------------------------------------------*/void Stop(void){Sda=0;_nop_();Scl=1;_nop_();Sda=1;_nop_();Scl=0;}/*------------------------------------------------應答IIC總線 ------------------------------------------------*/void Ack(void){Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------非應答IIC總線 ------------------------------------------------*/void NoAck(void){Sda=1;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------發送一個字節 ------------------------------------------------*/void Send(unsigned char Data){ unsigned char BitCounter=8;unsigned char temp;do{temp=Data;Scl=0;_nop_();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------讀入一個字節并返回 ------------------------------------------------*/unsigned char Read(void){unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{Scl=0;_nop_();Scl=1;_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/*------------------------------------------------寫入DA數模轉換值 ------------------------------------------------*/void DAC(unsigned char Data){Start();Send(AddWr); //寫入芯片地址Ack();Send(0x40); //寫入控制位,使能DAC輸出Ack();Send(Data); //寫數據Ack();Stop();}/*------------------------------------------------讀取AD模數轉換的值,有返回值 ------------------------------------------------*/unsigned char ReadADC(unsigned char Chl){unsigned char Data;Start(); //寫入芯片地址Send(AddWr);Ack();Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加//Chl的值分別為0、1、2、3,分別代表1-4通道Ack();Start();Send(AddRd); //讀入地址Ack();Data=Read(); //讀數據Scl=0;NoAck();Stop();return Data; //返回值}/*------------------------------------------------主程序 ------------------------------------------------*/void main(){int ge , z1, z2, z3 ; //DA數模輸出變量int ADtemp; //定義中間變量mDelay(20);Init_Timer1();RST=0; // 關時鐘DS1302while(1){ if(ADFlag) //定時采集輸入模擬量{ADFlag=0; // 清除標志位ADtemp=(int)(ReadADC(3)*0.01961*1000); // 將八位量化值轉化成十進制數ge =ADtemp/1000;z1 =ADtemp%1000/100; z2 =ADtemp%1000%100/10;z3=ADtemp%10;stopwatch( ge, z1, z2, z3) ; }}}void stopwatch(uchar ge, uchar z1,uchar z2, uchar z3) // 數碼管顯示函數 { DU=1;P0=table[ ge]; // 各位數DU=0;WE=1;P0=0xef;WE=0;mDelay(3) ; P0=0x00;//P0=0xff; DU=1;P0=table[ 16]; // 小數點DU=0;WE=1;P0=0xef;WE=0;mDelay( 1) ; P0=0x00;// P0=0xff;DU=1;P0=table[ z1]; // 小數點后一位DU=0;WE=1;P0=0xdf;WE=0;mDelay( 8) ; P0=0x00;// P0=0xff;DU=1;P0=table[ z2]; // 小數點后兩位DU=0;WE=1;P0=0xbf;WE=0;mDelay( 5) ; P0=0x00;// P0=0xff;DU=1;P0=table[ z3]; // 小數點后三位DU=0;WE=1;P0=0x7f;WE=0;mDelay( 5) ;P0=0x00;// P0=0xff; // 使用開發板時用 }/*------------------------------------------------定時器中斷程序 ------------------------------------------------*/ void Timer1_isr(void) interrupt 3 {static unsigned int j;TH1=0xfb; //重新賦值TL1=0x00;j++;if(j==10) {j=0;ADFlag=1;} //定時置位AD采樣標志位 }仿真圖:
總結
以上是生活随笔為你收集整理的protues仿真之数码管消影问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python语言特性-------pyt
- 下一篇: jQuery 基金会和 Dojo 基金会