最近做了一個用STC15系列單片機內部A/D轉換做的數字電壓表,1602顯示。就想著實現硬件很少,就做著玩玩。
制作出來的實物圖如下:
7Q0KPS2D5YQ6U`WGLV28%HS.png (570.29 KB, 下載次數: 45)
下載附件
實物圖
2020-6-17 21:06 上傳
`TWJXOWH`_H3}A)A@AK6~]W.png (262.1 KB, 下載次數: 46)
下載附件
2020-6-17 21:06 上傳
@2DCKK]3GZ6Z0R2`W[[Y@VF.png (11.98 KB, 下載次數: 41)
下載附件
2020-6-17 21:01 上傳
8~MX)U[69SU0EJZE80XA)QB.png (278.76 KB, 下載次數: 39)
下載附件
2020-6-17 21:02 上傳
把硬件原理圖及源程序資料分享一下
- #include <STC15F2K60S2.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char data adc_datah; //定義保存AD轉換結果的絕對地址
- unsigned char data adc_datal;
- #define LCD1602_DB P2
- sbit LCD1602_RS = P4^1;
- sbit LCD1602_RW = P4^2;
- sbit LCD1602_E = P4^4;
- unsigned long int mn0,mn1,mn3,mn4,mn5,mn6,mn7;
- void InitLcd1602();
- void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
- uchar *tab0[10]={"0","1","2","3","4","5","6","7","8","9"};
- /*** 等待液晶準備好***/
- void LcdWaitReady()
- {
- unsigned char sta;
- LCD1602_DB = 0xFF;
- LCD1602_RS = 0;
- LCD1602_RW = 1;
- do {
- LCD1602_E = 1;
- sta = LCD1602_DB; //讀取狀態字
- LCD1602_E = 0;
- }while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重復檢測直到其等于 0 為止
- }
- /* 向 LCD1602 液晶寫入一字節命令,cmd-待寫入命令值 */
- void LcdWriteCmd(unsigned char cmd)
- {
- LcdWaitReady();
- LCD1602_RS = 0;
- LCD1602_RW = 0;
- LCD1602_DB = cmd;
- LCD1602_E = 1;
- LCD1602_E = 0;
- }
- /* 向 LCD1602 液晶寫入一字節數據,dat-待寫入數據值 */
- void LcdWriteDat(unsigned char dat)
- {
- LcdWaitReady();
- LCD1602_RS = 1;
- LCD1602_RW = 0;
- LCD1602_DB = dat;
- LCD1602_E = 1;
- LCD1602_E = 0;
- }
- /* 設置顯示 RAM 起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
- void LcdSetCursor(unsigned char x, unsigned char y)
- {
- unsigned char addr;
- if (y == 0){ //由輸入的屏幕坐標計算顯示 RAM 的地址
- addr = 0x00 + x; //第一行字符地址從 0x00 起始
- }else{
- addr = 0x40 + x; //第二行字符地址從 0x40 起始
- }
- LcdWriteCmd(addr | 0x80); //設置 RAM 地址
- }
- /* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
- void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
- {
- LcdSetCursor(x, y); //設置起始地址
- while (*str !=0)
- { //連續寫入字符串數據,直到檢測到結束符
- LcdWriteDat(*str++); //先取 str 指向的數據,然后 str 自加 1
- }
- }
- /* 初始化 1602 液晶 */
- void InitLcd1602()
- {
- LcdWriteCmd(0x38); //16*2 顯示,5*7 點陣,8 位數據接口
- LcdWriteCmd(0x0C); //顯示器開,光標關閉
- LcdWriteCmd(0x06); //文字不動,地址自動+1
- LcdWriteCmd(0x01); //清屏
- }
- void UartInit() //9600bps@11.0592MHz
- {
- SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x40; //定時器1時鐘為Fosc,即1T
- AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
- TMOD &= 0x0F; //設定定時器1為16位自動重裝方式
- TL1 = 0xE0; //設定定時初值
- TH1 = 0xFE; //設定定時初值
- ET1 = 0; //禁止定時器1中斷
- ES=1;
- EA=1;
- TR1 = 1; //啟動定時器1
- }
- void Usart_init() interrupt 4
- {
- uint dataa;
- dataa=SBUF;
- mn3=dataa;
- RI=0;
- //SBUF=dataa;
- while(!TI);
- TI=0;
- }
- void main()
- {
- uint dataa;
- UartInit();
- InitLcd1602();
- LcdShowStr(0, 0,"home:");
- while(1)
- {
-
- // mn3=123;
- LcdShowStr(6, 0,tab0[mn3/100]);
- LcdShowStr(7, 0,tab0[(mn3%100)/10]);
- LcdShowStr(8, 0,tab0[mn3%10]);
- }
- }
復制代碼 設計文檔51hei下載:
基于STC15數字電壓表設計.doc
(3.37 MB, 下載次數: 92)
2020-6-17 21:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|