用51单片机做的数字电压表仿真,下面是原理图:
显示部分是用的lcd12864,。
里面含有仿真和程序:
数字电压表.rar
(905.63 KB, 下载次数: 330)
液晶显示的数字电压表源程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define unit unsigned int
- uchar code Hzk[]={
- /*-- 文字: 输 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x88,0x68,0x1F,0xC8,0x08,0x10,0xC8,0x54,0x52,0xD1,0x12,0x94,0x08,0xD0,0x10,0x00,
- 0x09,0x19,0x09,0xFF,0x05,0x00,0xFF,0x12,0x92,0xFF,0x00,0x5F,0x80,0x7F,0x00,0x00,
- /*-- 文字: 出 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,0x00,
- 0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,
- /*-- 文字: 电 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
- 0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,
- /*-- 文字: 压 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,0xFA,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
- 0x80,0x60,0x1F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x44,0x58,0x40,0x40,0x00,
- /*-- 文字: 为 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x20,0x22,0x2C,0x20,0x20,0xE0,0x3F,0x20,0x20,0x20,0x20,0xE0,0x00,0x00,0x00,
- 0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x00,0x01,0x46,0x80,0x40,0x3F,0x00,0x00,0x00,
- };
- #define LCD_databus P0
- uchar num;
- long int sum;
- sbit EN=P2^0;
- sbit RW=P2^1;
- sbit RS=P2^2;
- sbit CS2=P2^3;
- sbit CS1=P2^4;
- sbit ST=P3^0;
- sbit OE=P3^1;
- sbit EOC=P3^2;
- sbit CLK=P3^3;
- void delay1ms()
- {
- uchar a,b;
- for(b=105;b>0;b--)
- for(a=8;a>0;a--);
- }
- void Read_busy()
- {
- uchar dat;//状态信息(判断是否忙)
- RS=0; // 数据\指令选择,D/I(RS)=“L” ,表示 DB7∽DB0 为显示指令数据
- RW=1; //R/W=“H” ,E=“H”数据被读到DB7∽DB0
- do{
- LCD_databus=0x00;
- EN=1; //EN下降沿
- dat=LCD_databus;
- EN=0;
- dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
- }while(!(dat==0x00));
- }
- void write_LCD_command(uchar value)
- {
- Read_busy();
- RS=0;
- RW=0;
- LCD_databus=value;
- EN=1;
- delay1ms();
- EN=0;
- }
- void write_LCD_data(uchar value)
- {
- Read_busy();
- RS=1;
- RW=0;
- LCD_databus=value;
- EN=1;
- delay1ms();
- EN=0;
- }
- void Set_page(uchar page)
- {
- page=0xb8|page;
- write_LCD_command(page);
- }
- void Set_line(uchar startline)
- {
- startline=0xc0|startline;
- write_LCD_command(startline);
- }
- void Set_lie(uchar lie)
- {
- lie=lie&0x3f;
- lie=0x40|lie;
- write_LCD_command(lie);
- }
- void Setonoff(uchar onoff)
- {
- onoff=0x3e|onoff;
- write_LCD_command(onoff);
- }
- void SelectScreen(uchar screen)
- {
- switch(screen)
- {
- case 0:CS1=0;CS2=0 ;break;
- case 1:CS1=0;CS2=1 ;break;
- case 2:CS1=1;CS2=0 ;break;
- default: break;
- }
- }
- void ClearScreen(uchar screen)
- {
- uchar i,j;
- SelectScreen(screen);
- for(i=0;i<8;i++)
- {
- Set_page(i);
- Set_lie(0);
- for(j=0;j<64;j++)
- {
- write_LCD_data(0x00);
- }
- }
- }
- void Display(uchar ss,uchar page,uchar lie,uchar number)
- {
- int i; //选屏参数,page选页参数,column选列参数,number选第几汉字输出
- SelectScreen(ss);
- lie=lie&0x3f;
- Set_page(page); //写上半页
- Set_lie(lie); //控制列
- for(i=0;i<16;i++) //控制16列的数据输出
- {write_LCD_data(Hzk[i+32*number]);} //i+32*number汉字的前16个数据输出
- Set_page(page+1); //写下半页
- Set_lie(lie); //控制列
- for(i=0;i<16;i++) //控制16列的数据输出
- {write_LCD_data(Hzk[i+32*number+16]);}//i+32*number+16汉字的后16个数据输出
- }
-
- void Init()
- {
- Read_busy();
- SelectScreen(0);
- Setonoff(0);
- SelectScreen(0);
- Setonoff(1);
- SelectScreen(0);
- ClearScreen(0);
- Set_line(0);
- }
- void Init1()
- {
- EA=1;
- TMOD=0x01;
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- ET0=1;
- TR0=1;
-
- }
- void main()
- {
- Init();
- ClearScreen(0);
- Set_line(0);
- Init1();
- OE=1;
- ST=0;
- ST=1;
- ST=0;//启动转换
- while(EOC==0); //等待转换结果
- OE=1; //允许输出
- sum=P1*1.0/255*5000;
- LCD_databus=sum;
- Display(0,0,16,LCD_databus);
- while(1);
- }
- void Timer0() interrupt 1
- {
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- CLK=~CLK;//ADC0809时钟信号
- }
复制代码
|