附件包括數字電壓表的單片機源代碼
proteus仿真工程文件
都是自己在網上找的資料,請大家多多指教
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (25.43 KB, 下載次數: 52)
下載附件
2020-11-3 20:20 上傳
單片機源程序如下:
- //---庫函數聲明及相關定義---//
- #include <reg51.h>
- #include <intrins.h>
- #define unint unsigned int
- #define unchar unsigned char
- #define Databus P1 /*液晶數據總線*/
- sbit RS=P3^3; /*數據\指令 選擇*/
- sbit RW=P3^4; /*讀\寫 選擇*/
- sbit EN=P3^2; /*讀\寫使能*/
- sbit cs1=P3^6; /*片選1*/
- sbit cs2=P3^7; /*片選2*/
- sbit clock=P0^4;//時鐘線
- sbit dout=P0^2;//數據輸出端
- sbit cs=P0^3;//片選(低電平有效)
- sbit DQ=P0^2;//ds18b20與單片機連接口
- float f_temp;//浮點型溫度值
- unsigned int tvalue;//溫度值
- unsigned char tflag;
- unsigned int temp=0;
- unsigned char SegBuf[4]={0};
- /********************************/
- /* 定義中文字庫 */
- /********************************/
- unchar code Hzk[]={
- 0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, //年//0
- 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
- 0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月//1
- 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日//2
- 0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,//星//3
- 0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,
- 0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期//4
- 0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
- 0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//時//5
- 0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
- 0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分//6
- 0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
- 0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒//7
- 0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00,
- 0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,//天//8
- 0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,
- 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,//一//9
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,//二//10
- 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,
- 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三//11
- 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
- 0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四//12
- 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,
- 0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五//13
- 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,
- 0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六//14
- 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,
- 0x00,0x40,0x42,0x44,0x4C,0x40,0x40,0x7F,
- 0x40,0x40,0x48,0x44,0xE6,0x40,0x00,0x00,
- 0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,
- 0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,//當//15
- 0x08,0x08,0xE8,0x29,0x2A,0x2E,0xE8,0x08,
- 0x08,0xCC,0x0A,0x0B,0xE8,0x0C,0x08,0x00,
- 0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,
- 0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00,//前//16
- 0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,//電//17
- 0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
- 0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
- 0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00,
- 0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,
- 0xFE,0x82,0x82,0x82,0xC3,0x82,0x00,0x00,
- 0x40,0x30,0x0F,0x40,0x40,0x40,0x40,0x40,
- 0x7F,0x40,0x42,0x44,0x4C,0x60,0x40,0x00,//壓//18
- 0x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,
- 0x49,0x49,0x7F,0x00,0x00,0x80,0x00,0x00,
- 0x01,0x81,0x41,0x21,0x1D,0x21,0x41,0x7F,
- 0x89,0x89,0x8D,0x89,0x81,0xC1,0x41,0x00,//是//19
- 0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x31,0x7B,0x7B,0x31,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//://20
- 0x80,0x40,0x20,0xF8,0x27,0x20,0x20,0x20,//伏//21
- 0x20,0xFF,0x20,0x24,0x28,0x38,0x20,0x00,
- 0x00,0x00,0x00,0xFF,0x80,0x40,0x20,0x18,
- 0x06,0x01,0x06,0x18,0x60,0xC0,0x40,0x00
- };
- /****************************************/
- /* 定義ASCII字庫8列*16行 */
- /****************************************/
- unchar code Ezk[]={
- /*此字體下對應的點陣為:寬x高=8x16 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //0
- 0x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00, //1
- 0x00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, // 2
- 0x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //3
- 0x00,0x00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//4
- 0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//5
- 0x00,0xC0,0xE0,0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//6
- 0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//7
- 0x00,0x70,0xF8,0xC8,0x88,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//8
- 0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//9
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - -//10
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x80,0x80,0xE0,0xE0,0x80,0x80,0x00, // -+-//11
- 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,
- 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, // ---//12
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -.-//13
- 0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00
- };
- /*狀態檢查,LCD是否忙*/
- void CheckState()
- {
- unchar dat; /*狀態信息,判斷是否忙*/
- RS=0; /*數據\指令選擇,D/I(RS)=“L” ,表示 DB7∽DB0 為顯示指令數據*/
- RW=1; /*R/W=“H” ,E=“H”數據被讀到DB7∽DB0*/
- do{
- Databus=0x00;
- EN=1; /*EN下降源*/
- _nop_(); /*一個時鐘延時*/
- dat=Databus;
- EN=0;
- dat=0x80 & dat;/*僅當第7位為0時才可操作(判別busy信號)*/
- }while(!(dat==0x00));
- }
- /*寫命令到LCD中*/
- SendCommandToLCD(unchar com)
- {
- CheckState();/*狀態檢查,LCD是否忙*/
- RS=0; /*向LCD發送命令。RS=0寫指令,RS=1寫數據*/
- RW=0; /*R/W=“L” ,E=“H→L”數據被寫到 IR 或 DR */
- Databus=com; /*com :命令*/
- EN=1; /*EN下降沿*/
- _nop_();
- _nop_();
- EN=0;
- }
- /*設置頁 0xb8是頁的首地址*/
- void SetLine(unchar page)
- {
- page=0xb8|page; /*1011 1xxx 0<=page<=7 設定頁地址--X 0-7,8行為一頁64/8=8,共8頁*/
- SendCommandToLCD(page);
- }
- /*設定顯示開始行,0xc0是行的首地址*/
- void SetStartLine(unchar startline)
- {
- startline=0xc0|startline; /*1100 0000*/
- SendCommandToLCD(startline); /*設置從哪行開始:0--63,一般從0 行開始顯示*/
- }
- /*設定列地址--Y 0-63 ,0x40是列的首地址*/
- void SetColumn(unchar column)
- {
- column=column &0x3f; /*column最大值為64,越出 0=<column<=63*/
- column= 0x40|column; /*01xx xxxx*/
- SendCommandToLCD(column);
- }
- /*開關顯示,0x3f是開顯示,0x3e是關顯示*/
- void SetOnOff(unchar onoff)
- {
- onoff=0x3e|onoff; /*0011 111x,onoff只能為0或者1*/
- SendCommandToLCD(onoff);
- }
- /*寫顯示數據 */
- void WriteByte(unchar dat)
- {
- CheckState();/*狀態檢查,LCD是否忙*/
- RS=1; /*RS=0寫指令,RS=1寫數據*/
- RW=0; /*R/W=“L” ,E=“H→L”數據被寫到 IR 或 DR */
- Databus=dat; /*dat:顯示數據*/
- EN=1; /*EN下降沿*/
- _nop_();
- _nop_();
- EN=0;
- }
- /*選擇屏幕screen: 0-全屏,1-左屏,2-右屏*/
- void SelectScreen(unchar screen)
- {
- switch(screen)
- {
- case 0: cs1=0;/*全屏*/
- _nop_(); _nop_(); _nop_();
- cs2=0;
- _nop_(); _nop_(); _nop_();
- break;
- case 1: cs1=0;/*左屏*/
- _nop_(); _nop_(); _nop_();
- cs2=1;
- _nop_(); _nop_(); _nop_();
- break;
- case 2: cs1=1;/*右屏*/
- _nop_(); _nop_(); _nop_();
- cs2=0;
- _nop_(); _nop_(); _nop_();
- break;
- }
- }
- /*清屏screen: 0-全屏,1-左屏,2-右*/
- void ClearScreen(unchar screen)
- {
- unchar i,j;
- SelectScreen(screen);
- for(i=0;i<8;i++) /*控制頁數0-7,共8頁*/
- {
- SetLine(i);
- SetColumn(0);
- for(j=0;j<64;j++) /*控制列數0-63,共64列*/
- {
- WriteByte(0x00); /*寫點內容,列地址自動加1*/
- }
- }
- }
- /*初始化LCD*/
- void InitLCD()
- {
- CheckState();
- SelectScreen(0);
- SetOnOff(0); /*關顯示*/
- SelectScreen(0);
- SetOnOff(1); /*開顯示*/
- SelectScreen(0);
- ClearScreen(0); /*清屏*/
- SetStartLine(0);/*開始行:0*/
- }
- /*--------------------------顯示全角漢字-----------------------*/
- /*選屏參數,pagr選頁參數,column選列參數,number選第幾漢字輸出*/
- /*ss=1右屏2左屏,pagr=0,2,4,6第0~3行,column=0~3漢子出現的列,number選第幾漢字輸出*/
- void Display(unchar ss,unchar page,unchar column,unchar number)
- {
- unchar i;
- SelectScreen(ss);
- column=column&0x3f;
- SetLine(page); /*寫上半頁*/
- SetColumn(column); /*控制列*/
- for(i=0;i<16;i++) /*控制16列的數據輸出*/
- {
- WriteByte(Hzk[i+32*number]);/*i+32*number漢字的前16個數據輸出*/
- }
- SetLine(page+1); /*寫下半頁*/
- SetColumn(column); /*控制列*/
- for(i=0;i<16;i++) /*控制16列的數據輸出*/
- {
- WriteByte(Hzk[i+32*number+16]);/*i+32*number+16漢字的后16個數據輸出*/
- }
- }
- /*---------------------顯示半角漢字和數字和字母----------------------*/
- /*選屏參數,pagr選頁參數,column選列參數,number選第幾漢字輸出*/
- void Displayen(unchar ss,unchar page,unchar column,unchar number)
- {
- unchar i;
- SelectScreen(ss);
- column=column&0x3f;
- SetLine(page); /*寫上半頁*/
- SetColumn(column);
- for(i=0;i<8;i++)
- {
- WriteByte(Ezk[i+16*number]);
- }
- SetLine(page+1); /*寫下半頁*/
- SetColumn(column);
- for(i=0;i<8;i++)
- {
- WriteByte(Ezk[i+16*number+8]);
- }
- }
- //---顯示緩沖填充函數---//*
- void convert(unint n)
- {
- n=n*100;
- n=n/51;
- SegBuf[2] =n%10;
- SegBuf[1] =n/10%10;
- SegBuf[0] =n/100%10;
- }
- //---549延時函數---//
- void delay549(unint t)
- {
- while(t--);
- }
- //---采集549數據函數---//
- unchar read_549()//數據得采集
- {
- unint i;
- unchar k=0x00;//定義一個變量k,將在dout上采集的到的數據裝進K
- for(i=0;i<8;i++)
- {
- k<<=1;//左移一位
- k|=dout;
- clock=1;//高電平期間采集dout線上的數據
- _nop_();
- clock=0;
- delay549(10);
- }
- return k;//返回值
- }
- //---讀取549AD數據函數---//
- unchar shuchu_549()//數據得讀取
- {
- unchar date;
- cs=1;
- clock=1;
- cs=0;//片選低電平時數據有效
- _nop_();
- _nop_();
- date=read_549();//將read_549()函數中采集到的數據付給變量date
- cs=1;//片選拉高,表示數據讀取完畢
- delay549(50);
- return date;//返回值
- }
- /*主函數*/
- void main()
- {
- unchar ADCDat;
- InitLCD(); /*初始12864*/
- ClearScreen(0); /*清屏*/
- SetStartLine(0);/*顯示開始行*/
- while(1)
- {
- ADCDat=shuchu_549();
- convert(ADCDat); //轉換顯示碼
- Display(2,0,0*16,15);//當
- Display(2,0,1*16,16);//前
- Display(2,0,2*16,17);//電
- Display(2,0,3*16,18);//壓
- Display(1,0,0*16,19);//是
- Display(1,0,1*16,20);//:
- Displayen(2,2,0*8,SegBuf[0]);
- Displayen(2,2,1*8,13);
- Displayen(2,2,2*8,SegBuf[1]);
- Displayen(2,2,3*8,SegBuf[2]);
- Display(2,2,2*16,21);//伏
- }
- }
復制代碼
所有資料51hei提供下載:
附件不小心被刪除了,大家自己畫一下圖吧,有畫好的朋友,歡迎回帖點高級模式上傳附件分享下.
|