开发板实验报告的设计主题:基于单片机的简易计算器讲师班级:学生ID:姓名:设计内容和目的本实验的任务是用51系列单片机作为简单计算器进行计算。核心其结构非常简单。外部主要由4 * 4矩阵键盘和液晶显示器组成。内部由一个AT89C51AT89C51 1按钮17 74LS08 1 10K电阻9电容22uF 1 51系列单片机系统4 * 4键盘LCD显示晶体振荡器电路复位电路电路原理框图LCD1602 1晶体振荡器12MHz 1电容30pF 2 5K电位器123硬件设计电路图将4 * 4键盘直接连接到端口P1,并使用端口P0作为LCD的显示输出,端口INT0 P 3. 2作为外部中断位。

XTAL218XTAL119ALEEA3031PSEN29RST9P 0. 0 / AD0P 0. 1 / AD1P 0. 2 / AD2P 0. 3 / AD3P 0. 4 / AD4P 0. 5 / AD5P 0. 6 / AD6P 0. 7 / AD7P 2. 0 / A8P 2. 1 / A9P 2. 2 / A10P 2. 3 / A11P 2. 4 / A12P 2. 5 / A13P 2. 6 / A5343332227P 2. 7 / A15P 3. 0 / RXDP 3. 1 / TXDP 3. 2 / INT0P 3. 3 / INT1P 3. 4 / T0P 3. 6 / WR286P 1. 0P 1. 1P 1. 2P 1. 3P 1. 4P 1. 5P 1. 6P 1. 780C5112345678P 3. 7 / RD17P 3. 5 / T115U1X1CRYSTALC122pC222pC322pR11k + 5VD714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016LRV1k + 5V + 5V234567891RP1RESPACK-8 + 5V123U2:A74LS08456U2:B74LS089108U2:C74LS082 4硬件设计补充说明四个软件设计程序和说明该程序的组成可分为3个模块:矩阵键盘模块,LCD显示模块和操作模块。请参见底部页面的源程序。初始化参数,并通过按键输入和读取来初始化LCD显示。键码液晶显示屏显示数字键。清除键功能键状态被清除。输入该值并将其发送到显示缓冲区YN。等待值输入的结果发送显示缓冲区。根据最后一个功能键和输入数据计算结果。等待数字输入结果发送到显示的缓冲区。缓冲五种调试和软硬件方法。我个人遇到的主要问题是LCD1602。如果我自己没有购买新的LCD,恐怕我的结论只能在软件仿真中实现。

在硬件上,当未调试芯片时,LCD1602仅显示全黑的一行。一般来说,组件是好的。 但这不一定。我一直以为我的组件没有损坏。 15将15和16引脚分别连接到+ 5v和0v,以测试背光是否完好无损。将电位计连接到VEE,以检查对比度是否可调节。 常见的LCD现象容易出现。当我再次进行实验时,遇到以下情况:状态1上电后,第一行1602完全是黑色的,这就是16个5x7黑色块的原因。 LCD根本没有进行。初始化操作时,需要检查连接或程序。如果运气不好,则整个LCD都将损坏。状态2屏幕显示两行灰色网格的原因。 LCD初始化在程序中不正常。应该是某些初始化命令没有正常收到。建议根据标准初始化步骤调整程序或调整命令之间的延迟。尝试----补充:对比度可能也太高。建议调整对比度电阻。状态3显示乱码。这就是我在实验室组合板上所做的。原因是接线问题。状态3正确显示六个测试结果和性能标准。我的计算器只能以0-9的计数准确地执行这四个算术运算。 1.加法计算D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016L 2.减去D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016L 3.乘法D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016L 4.用物理模拟除法计算D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016L 5. D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD2LM016L字符显示不一致。
这是传说中的错误。我不明白。七。实验上的改进和经验。很明显,我的计算器在处理数据和显示时有太多限制。我认为主要原因是我对程序中的计算模块没有深入的了解。这一点仍然需要大大加强。这个实验给我的感觉是,硬件和软件都不困难。我的焊机并不算马虎,即使它有点难看,但是只要软件能够正常工作,它就可以完美地工作。不幸的是,我输给LCD1602,并从学校拿了2元钱。幸运的是,我忍不住自己买了一个。最后,我之前的实验证明LCD损坏了。没有知识是可怕的。我不知道如何真正解决LCD故障。然而,这是因祸得福。我一直顽固地认为LCD在颠簸期间是很好的,但它使我初始化了LCD,LCD字符显示,3种不同的矩阵键盘扫描方法以及软件上的巧妙技巧。理解。我觉得我从这项实验中学到了更多。下面是源代码。 #include #defineCLEARSCREENLCD_write_command(0x0 1) #define uint unsigned int #define uchar unsigned char / ************ **定义接口************** ********** /#defineLCDIOP0 #defineKEYBOARD P1 //保留位LCD1602_RS = P2 ^ 0;位LCD1602_RW = P2 ^ 1;位LCD1602_EN = P2 ^ 2; / ********* **************************************** ******* /代码uchar mayuan [16] = {'0','1','2','3','4','5','6','7','8','9','0','/', '*','-','+','='}; //是的,这更清楚无符号字符代码键码[] = {0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14 ,0x24,0x44,0x84,0x18,0x28,0x48,0x88); //键盘编码value()int i,j,k = 1,s; // int t,t1,t2,a []; //无效delay(uchar); // delay / **************定义功能*************************** / void LCD_init(void); //初始化函数void delay_nms(unsigned int n); // Delay函数void LCD_write_command(unsigned char command); // Write命令功能void LCD_write_dat(unsigned char dat); //写入数据函数void delay_10ms ();最初的(); uchar keyscan(); //键盘扫描函数calc(uchar); //计算函数uchar num,temp,key,keynum; void main()//主要功能{LCD_init(); delay_nms(10 0); while([k3 8] {initial(); // Interrupted}} / ************************** ********** *************************************/ 最初的( ){EA = 1; //主开关EX0 = 1; //中断模式0打开IT0 = 0;} / ************************ ********** ******************************************** ***** / / *** **************************************** ********** **************** / void inter0()中断0 {unsigned char n; delay_10ms(); //如果if(INT0 == 0) //未按任何键{EX0 = 0; //关闭中断n = keyscan(); calc(n); EX0 = 1; //打开中断KEYBOARD = 0xf0; //所有列的值键盘设置为高级别}} / **** **************************************** ************** ****************** / calc(uchar n){if(n 9)} t = t2 / t1; break; t = t2 * t1; break; t = t2-t1; break; t = t2 + t1; break;} {} while(t> 9) {} if(t = 1; i--) {} s = t; t = t / 10; a [k] = s; k ++; LCD_write_command(0x0 0); LCD_write_command(0x0 0); LCD_write_dat(a [i] +4 8);} / * ************** **************************************** ************** ******* ***** / uchar keyscan()//键盘扫描{KEY = 0 = 0 ] //有一个按键可以按{temp = KEYBOARD; //在按键插入时延迟10ms()时保存键盘; //如果if(KEYBOARD == temp)则延迟//再次确认是否再次按下键盘{uchar i; KEYBOARD = 0x0f; //键盘的行值都设置为高电平delay_10ms(); // 10MS时间延迟keynum = temp |键盘; //保存键盘的行值,同时(KEYBOARD!= 0x0f); //(j = 0; j unsigned char table1 [] = { 0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x07,0x1f,0x1f,0x1f0011,0x1f001 ,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x07,0x01 0x1f,0x1f,0x1f,0f1f1 0x1c,0x18,0x00,0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00); //模式无符号字符表[] = {0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00} ; //字符℃#defineCLEARSCREENLCD_write_command(0x0 1) / **************定义接口*********** ********** *** /#defineLCDIOP0 sbit LCD1602_RS = P2 ^ 0; sbit LCD1602_RW = P2 ^ 1; sbit LCD1602_EN = P2 ^ 2; / ************ **定义功能****** ****************** / void LCD_write_command(unsigned char command); //写入命令函数void LCD_write_dat(unsigned char dat); //写入数据函数void LCD_set_xy(unsigned char x,unsigned char y); //设置显示位置功能void LCD_dsp_char(unsigned x,unsigned char y,unsigned char dat); //显示一个字符函数void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char * s); //显示字符串函数void LCD_init(void); //初始化函数void delay_nms(unsigned int n); //延迟函数/ ************************************ * *********** / / ************初始化功能**************** / void LCD_init(void){ CLEARSCREEN; //清除屏幕LCD_write_command(0x3 8); //设置8位数据传输模式LCD_write_command(0x0c); //打开显示(启用LCD显示)LCD_write_command(0x8 0); //设置LCD第一显示地址CLEARSCREEN ; //清除屏幕} / ********************************************** * ********* / / **************写命令功能********************* * ********** / void LCD_write_command(unsigned char command){LCDIO =命令; LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_EN = 0; LCD1602_EN = 1; delay_nms(1 0);} / * * ****************************************************** / / ****************写数据功能************************ / void LCD_write_dat(unsigned char dat){LCDIO = dat; LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_E N = 0; delay_nms(1); LCD1602_EN = 1;} / ****************** **************** ****************** / / ********* ******设置显示位置************************** / void LCD_set_xy(unsigned char x,unsigned char y) {未签名的字符地址; if(y == 1) address = 0x80 + x; elseaddress = 0xc0 + x; LCD_write_command(address);} / ************************ ******************* ******** / / ****************显示字符** ******************* * / void LCD_dsp_char(unsigned x,unsigned char y,unsigned char dat){LCD_set_xy(x,y); LCD_write_dat(dat);} / ******************* *************************** / / ** *************显示字符串功能************** / void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char * s){LCD_set_xy (X,Y); while(* s)(LCD_write_dat(* s); s ++;}} / ************************* ****************** ****/ /********** 延迟 *************** ********* / void delay_nms(unsigned int n)(unsigned int i = 0,j = 0; for(i = n; i> 0; i-)for(j = 0; j / /头文件#define uint unsigned int // // define uchar unsigned charsbit lcden = P2 ^ 3; //定义pin sbit rs = P2 ^ 4; sbit rw = P2 ^ 0; sbit busy = P0 ^ 7; char i,j ,temp,num,num_1; long a,b,c; // a,第一个数字b,第二个数字c,数字为float a_c,b_c; uchar flag,fuhao; //标志表示是否有按下符号的键fuhao表示按下了哪个符号uchar码表[] = {7,8,9,0,4,5,6,0,1,2,3,0,0, 0,0,0}; uchar代码表1 [] = {7,8,9,0x2f-0x30,4,5,6,0x2a- 0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30 }; void delay(uchar z)//延迟函数{uchar y; for(z; z> 0; z-)for(y = 0; y 0) c = ab; elsec = ba; while(c!= 0) {write_date(0x30 + c); c = c / 10;} if(ab
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-357205-1.html
不配做人