用51单片机做的简易示波器,利用proteus里的波形生成器在通过ADC转换,就可以显示在LCD12864上。正弦波,三角波,方波等都能显示
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "reg51.h"
- #include "LCD12864.h"
- #include "font.h"
- #define ADC_VALUE P0
- sbit START = P3^4;
- sbit OE = P3^6;
- sbit EOC = P3^5;
- #define COLLECT_NUM 64
- uint8_t adc_collect[COLLECT_NUM];
- uint8_t GatAdcValue()
- {
- uint8_t temp;
-
- START = 1;
- START = 0; // 下降沿触发转换
- OE = 1;
- while(EOC == 0); //等待转换完成
- temp = ADC_VALUE;
- OE = 0;
- return temp;
-
-
- }
- void main()
- {
- uint8_t i,j,k,row,col,page,Data;
- uint8_t old_Data,old_page,temp_Data,temp_Data2,temp_page;
- LCD12864_Init();
-
-
- while(1)
- {
- for(i = 0;i<COLLECT_NUM;i++)
- adc_collect[i] = GatAdcValue();
- for(j = 0;j<COLLECT_NUM;j++)
- {
- col = j; // 列
- row = adc_collect[j]/4; // 计算在第几行
- page = row/8;
- Data = 0x01 <<(row-page*8);
- refresh_one_list(col);
-
- if(j!=0)
- {
- temp_Data2 = Data;
- temp_page = page;
- if(page == old_page) // 同一页内
- {
- if(Data > old_Data) //波形下降 向上补充
- {
- temp_Data = Data;
- temp_Data = temp_Data>>1;
- while(temp_Data!=old_Data)
- {
- temp_Data = temp_Data>>1;
- Data = Data|(Data>>1); //向上补充
- }
- }
- else if(Data < old_Data) // 波形上升 向下补充
- {
- temp_Data = Data;
- temp_Data =temp_Data<<1;
- while(temp_Data!=old_Data)
- {
- temp_Data =temp_Data<<1;
- Data = Data|(Data<<1); //向下补充
- }
- }
- } //end if(page == old_page) // 同一页内
- else if(page > old_page) // 跨页下降 应该向上补充
- {
- temp_Data = Data;
- for(k = 0;k<(row-page*8);k++) //向上补充到本页顶部
- temp_Data |= (temp_Data>>1); //向上补充
- write_one_list(page,col,temp_Data); //填充本页
- page--; //往上一页
- while(page != old_page) //填充两点之间的中间的页
- {
- write_one_list(page,col,0xFF);
- page --;
- }
- if(page == old_page) // 来到了同一页
- {
- temp_Data = 0x80;
- Data = 0x80;
- if(Data>old_Data)
- {
- temp_Data = temp_Data>>1; // 上移一格
- while(temp_Data != old_Data)
- {
- temp_Data = temp_Data>>1; // 上移一格
- Data = Data|(Data>>1); // 向上补充
-
- }
- }
- }
- }//end else if(page > old_page) // 跨页下降 应该向上补充
- else if(page < old_page) // 跨页上升 应该向下补充
- {
- temp_Data = Data;
- for(k = 0;k<(7-(row-page*8));k++)
- { temp_Data|=(temp_Data<<1);}
- write_one_list(page,col,temp_Data);
- page++; //向下一页
- while(page != old_page)
- {
- write_one_list(page,col,0xFF);
- page++ ; // 下降一页
- }
- if(page == old_page)
- {
- Data = 0x01;
- temp_Data = 0x01;
- if(Data < old_Data)
- {
- temp_Data = temp_Data<<1; //向下移动一格
- while(temp_Data != old_Data)
- {
- temp_Data = temp_Data<<1; //向下移动一格
- Data |= (Data<<1); //向下补充
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
示波器.rar
(124.61 KB, 下载次数: 168)
|