欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于單片機示波器Proteus仿真程序 ADC0808+LCD12864顯示
[打印本頁]
作者:
51hei圓圓
時間:
2023-9-2 16:27
標題:
基于單片機示波器Proteus仿真程序 ADC0808+LCD12864顯示
1、本設計采用52單片機作為主控器。
2、單片機通過ADC0808讀取信號發生器所產生的波形通過12864進行顯示,可顯示方波,三角波,鋸齒波,正弦波等。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(181.16 KB, 下載次數: 72)
下載附件
2023-9-2 16:28 上傳
單片機源程序如下:
//proteus仿真論壇
#include <reg51.h>
#include <intrins.h>
#include <ADC0808.c>
sbit DI=P2^2; // 數據\指令 選擇 AMPIRE12864 RS口
sbit RW=P2^1; // 讀\寫 選擇 R/W
sbit E=P2^0; // 讀\寫使能 E
sbit CS1=P2^4; // 片選1 CS1
sbit CS2=P2^3; // 片選2 CS2
sbit busy=P1^7; //DB7
sbit jia=P3^7; //gg按鍵接地(x軸加調節)
sbit jian=P3^3; // 按鍵接地 (x軸減調節)
sbit jia1=P3^0; //按鍵接地 (y軸加調節)
sbit jian1=P3^1; //按鍵接地 (y軸減調節)
unsigned int i;
unsigned char ye,lei,shu;
unsigned char a[91];
char code t[]={
0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x40,0x60,0x80,0x00,0x7F,0xFF, //小
0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x80,0x82,0x7F,0xE2, //子
0x00,0xA2,0x00,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,
0x00,0x40,0x00,0x60,0x3F,0x5E,0x01,0x48,0x01,0x48,0xFF,0xFF,0x11,0x48,0x21,0x4C, //制
0x1F,0x68,0x00,0x40,0x07,0xF8,0x40,0x00,0x80,0x00,0x7F,0xFF,0x00,0x00,0x00,0x00,
0x00,0x80,0x00,0x40,0x00,0x20,0xFF,0xF8,0x00,0x87,0x00,0x40,0x00,0x30,0x00,0x0F, //作
0xFF,0xF8,0x08,0x88,0x08,0x88,0x08,0xC8,0x0C,0x88,0x08,0x0C,0x00,0x08,0x00,0x00,
}; //沒看懂
void checkstate() //檢查控件選中狀態,都能判斷是否選中控件
{
DI=0; // 數據\指令 選擇 AMPIRE12864 RS口
RW=1; // 讀\寫 選擇 R/W
do
{
E=1;
E=0;
//僅當第7位為0時才可操作(判別busy信號)
}while(busy==1);
}
void writecommand(unsigned char command) //寫命令
{
checkstate();
DI=0;//高電平:數據D0~D7將送入顯示RAM;低電平D0~D7將送入指令寄存器執行
RW=0;//高電平讀數據,低電平寫數據
P1=command;
E=1; //高電平有效,低電平鎖定數據
E=0;
}
void writedate(unsigned char date) //寫數據
{
checkstate(); //忙檢測
DI=1;
RW=0;
P1=date;
E=1;
E=0;
}
void pianxuan(unsigned int i) //選擇左右屏
{
if(i==1)
CS1=0,CS2=1; //左屏
if(i==2)
CS1=1,CS2=0; //右屏
if(i==3)
CS1=0,CS2=0; //全屏
}
void shuju()
{
pianxuan(i); //選屏
writecommand(ye); //寫命令(頁)
writecommand(lei); //寫命令列
writedate(shu); //寫數據
}
void cleanscreen() //清屏 ???
{
unsigned char page,i;
pianxuan(3);
for(page=0xb8;page<=0xbf;page++) //從0頁到7頁
{
writecommand(page);
writecommand(0x40); //第0列
for(i=0;i<64;i++) //0~63列
writedate(0x00); //清0
}
pianxuan(1); //左屏
lei=0x40; //第0列
for(ye=0xb8;ye<0xbf;ye++) //從第0頁到第七頁
{
shu=0xff;
shuju();
}
ye=0xb8;
for(lei=0x40;lei<=0x7f;lei++)
{
shu=0x80;
shuju(); //0x80
}
ye=0xbf;
for(lei=0x40;lei<=0x7f;lei++)
{
shu=0x01;
shuju();
}
pianxuan(2);
ye=0xb8;
for(lei=0x40;lei<=0x5b;lei++)
{
shu=0x80;
shuju();
}
ye=0xbf;
for(lei=0x40;lei<=0x5b;lei++)
{
shu=0x01;
shuju();
}
lei=0x5b;
for(ye=0xb9;ye<=0xbe;ye++)
{
shu=0xff;
shuju();
}
}
void init(void) //開顯示,起始行0行
{
writecommand(0xc0); //開啟顯示0011 1111
writecommand(0x3f); //設置起始行1100 0000 第0行
}
void delay_50us(uint t) //延時50us
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void qing() //清掉七頁
{
uchar i;
for(i=0xb9;i<=0xbe;i++) //第二頁到第六頁
{
ye=i;
shu=0x00;
shuju();
}
}
void main()
{
uint r,j,g=0,q,dianya=1,k,p; //定義無符號整型
uchar m,l; //定義字符型m l
//pianxuan(3);
cleanscreen(); //清屏
init(); //開啟顯示
pianxuan(2); //選右屏
l=0xb8; //選第0頁l 1011 1000
for(k=0;k<4;k++,l=l+0x02) //l跳兩頁加頁,0頁跳2頁,跳4頁,跳6頁
{
ye=l;
lei=0x70; // 0111 0000 右屏第47列
for(r=0;r<16;r++) // 跳著填數據,第0頁從t{}中每跳2個寫數據(右屏47~63列)
{
shu=t[2*r+1+32*k];
shuju();
lei++;
}
ye=l+0x01; //當前頁加1頁
lei=0x70; //第47列
for(r=0;r<16;r++) // 跳著填數據,第0頁從t{}中每跳2個寫數據(右屏47~63列)
{
shu=t[2*r+32*k];
shuju();
lei++;
}
}
/*void shuju()
{
pianxuan(i); //選屏
writecommand(ye); //寫命令(頁)
writecommand(lei); //寫命令列
writedate(shu); //寫數據
}*/
while(1)
{
uchar d1,d2,d3,d4,d5,d6;
while(jia==0)
{
while(jia==0); //空函數保持當前狀態
g=g+1; //g=1
}
while(jian==0)
{
while(jian==0);
if(g!=0) g=g-1; //讓g=0
}
while(jia1==0)
{
while(jia1==0);
dianya=dianya+1; //電壓變0??
}
while(jian1==0)
{
while(jian1==0);
if(dianya!=1) dianya=dianya-1; //電壓變1
}
for(j=0;j<90;j++) //AD采樣最大值
{
adc();
a[j]=AD; //存儲數字量
if(a[j]>a[91])
{
a[91]=a[j]; //最大量放最后
}
delay_50us(g);
}
while(AD!=a[91]) //判斷AD是否與最大值相等
{
adc();
}
for(j=0;j<90;j++) //AD采樣
{
adc(); //采樣90個
a[j]=AD;
delay_50us(g);
}
lei=0x41; //第一列
for(r=0,j=0;r<90;r++,j++)
{
if(j<63) i=1; //選屏
if(j==63) lei=0x40; //j:列 i:屏(左右) 頁:l
if(j>=63)i=2;
qing(); //清7頁
if(a[j>=127])//正電壓 ??????
{
AD=(a[j]-127)*0.196/dianya; //計算在12864的電壓值 鄭學長?
if(AD<=7) ye=0xbb,shu=(0x80>>AD);
else if(AD<=15) ye=0xba,shu=(0x80>>(AD-8));
else if(AD<=23) ye=0xb9,shu=(0x80>>(AD-16));
else if(AD<=31) ye=0xb9,shu=(0x80>>(AD-24));
}
if(a[j]<127)//負電壓
{
AD=(127-a[j])*0.196/dianya;
if(AD<=7) ye=0xbc,shu=(0x01<<(AD));
else if(AD<=15) ye=0xbd,shu=(0x01<<(AD-8));
else if(AD<=23) ye=0xbe,shu=(0x01<<(AD-16));
else if(AD<=31) ye=0xbe,shu=(0x01<<(AD-24));
}
if(r==0) //第一次循環把shu給d1,ye給d2
{
d1=shu; //shu是t{}里面。
d2=ye; //最后一頁
}
if(r!=0) //除了第一次循環外
{
d3=shu;
d4=ye;
if(ye==d2) //判斷d2與d4是否相等(是否在同一頁)
{
if(shu>d1) //把shu向右移 趨近d1
{
d5=shu;
d5=d5>>1;
while(d5!=d1)
{d5=d5>>1;shu=shu|(shu>>1);}
}
if(shu<d1)
{
d5=shu;
d5=d5<<1;
while(d5!=d1)
{d5=d5<<1;shu=shu|(shu<<1);}
}
}
if(ye<d2)
{
for(q=0;q<7;q++)
{
shu=shu|(shu<<1);
}
shuju();
ye++;
while(ye<d2) {shu=0xff,shuju(),ye++;}
if(ye==d2)
{
shu=0x01;
if(shu<d1)
{
d5=shu;
d5=d5<<1;
while(d5!=d1)
{d5=d5<<1;shu=shu|(shu<<1);}
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
仿真程序51hei附件下載:
簡易示波器修改版.7z
(105.68 KB, 下載次數: 57)
2023-9-2 16:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
4091
時間:
2023-9-2 16:48
厲害,我以后也要學學proteus仿真,對想法先用軟件仿真出來,再把電路做出來
作者:
Q__Q
時間:
2023-9-5 15:19
謝謝樓主分享,先收藏 慢慢學習
作者:
wbwcf13e
時間:
2023-9-10 10:43
這個仿真文件是哪個版本仿真軟件創建的?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1